?? yaokongrili.asm
字號:
MOV TIME_DAY,A
CJNE A,#31H,LGOOUT
MOV TIME_DAY,#01H
LGOOUT:
SETB EA
RET
;*********************************
;* 大小月減調整程序 *
;*********************************
DMMONTH:
CLR EA
MOV R7,TIME_DAY ;大月日減1
LCALL DEC1
MOV TIME_DAY,A
CJNE A,#00H,DMGOOUT
MOV TIME_DAY,#31H
DMGOOUT:
SETB EA
RET
DLMONTH:
CLR EA
MOV R7,TIME_DAY ;小月日減1
LCALL DEC1
MOV TIME_DAY,A
CJNE A,#00H,DLGOOUT
MOV TIME_DAY,#30H
DLGOOUT:
SETB EA
RET
;***************************************
;* BCD碼轉換成16進制數并且判斷是否閏年
;*****************************************
ZH:
CLR EA
MOV A,R3
ANL A,#0F0H
SWAP A
MOV B,#10
MUL AB
PUSH A
MOV A,R3
ANL A,#0FH
MOV R3,A
POP A
ADD A,R3
MOV B,#4
DIV AB
MOV R3,B
SETB EA
RET
;********************************
;* 陽歷調整同時顯示農歷月日程序 *
;*********************************
YMD:
CLR EA
LCALL GENGXIN ;更新農歷程序
MOV R0,CONVERT_MONTH ;農歷月分離,送顯示緩存
LCALL DIVIDE
MOV 74H,R1
MOV 54H,R1
MOV 75H,R2
MOV 55H,R2
MOV A,75H ;消除農歷月高位的零
CJNE A,#0,YMD1
MOV 75H,#0AH
MOV 55H,#0AH
YMD1:
MOV R0,CONVERT_DATE
LCALL DIVIDE
MOV 72H,R1
MOV 52H,R1
MOV 73H,R2
MOV 53H,R2
MOV A,73H
CJNE A,#0,YMD_OUT ;消除農歷日高位的零
MOV 73H,#0AH
MOV 53H,#0AH
YMD_OUT:
SETB EA
RET
;*********************************
;* 分離程序 *
;*********************************
DIVIDE:
CLR EA
MOV A,R0
ANL A,#0FH
MOV R1,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV R2,A
SETB EA
RET
;---------------------------------------------
; 大小月判斷程序
;---------------------------------------------
DX_MONTH:
CLR EA
MOV A,TIME_MONTH
JNB ACC.4,DX_CON_02
CLR ACC.4 ;ACC.4 為 1 表示大于 10 月
ADD A,#10
DX_CON_02:
CJNE A,#02H,DX_MONTH_1
SETB DYLED ;2月份關閉大月小月指示燈
SETB XYLED
AJMP DX_MONTH_OUT
DX_MONTH_1:
CJNE A,#08H,DX_MONTH_2
DX_MONTH_2:
JC DX_MONTH_3 ;小于8月,轉小于8月的處理程序
CJNE A,#08H,DX_MONTH_4
CLR DYLED ;8月份,開啟大月指示燈,關閉小月指示燈
SETB XYLED
AJMP DX_MONTH_OUT
DX_MONTH_4:
MOV B,#2 ;判斷9,10,11,12月的大小
DIV AB
MOV A,B
JZ DX_MONTH_ONM
CLR XYLED ;9月,11月,開啟小月指示燈,關閉大月指示燈
SETB DYLED
AJMP DX_MONTH_OUT
DX_MONTH_ONM:
CLR DYLED ;10月,12月,開啟大月指示燈,關閉小月指示燈
SETB XYLED
AJMP DX_MONTH_OUT
DX_MONTH_3:
MOV B,#02
DIV AB
MOV A,B
JZ DX_MONTH_ONO
CLR DYLED ;1 3 5 7月份,開啟大月指示燈,關閉小月指示燈
SETB XYLED
AJMP DX_MONTH_OUT
DX_MONTH_ONO:
CLR XYLED ;4 6月份,開啟小月指示燈,關閉大月指示燈
SETB DYLED
DX_MONTH_OUT:
SETB EA
RET
;---------------------------------------------
; 顯示程序
;---------------------------------------------
DISPLAY:
CLR EA ;顯示程序當中,關閉總中斷
MOV 7CH,#02H
MOV 7BH,#00H
MOV R0,#70H ;日
MOV R1,#60H ;秒
MOV R2,77H ;月
MOV R3,#77H
MOV R4,67H ;總天數
MOV R5,#67H
MOV R6,#0FEH ;位選通端
JB TURNOFF,PLAYOUT
JNB IRIN,DIS_OPEA
AJMP DISPLAY1
DIS_OPEA:
SETB EA
DISPLAY1:
MOV A,#0FFH
MOV P2,A
MOV A,@R0
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A ;送第1字節,送日,農歷月、日、星期數據。
JNB TI,$
CLR TI
MOV A,@R1
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A ;送第2字節,送秒、分、時、溫度十位數據。
JNB TI,$
CLR TI
MOV A,R3
CJNE A,#7DH,SEND_DATA3_1
MOV DPTR,#TAB2
LJMP SEND_DATA3_2
SEND_DATA3_1:
MOV DPTR,#TAB1
SEND_DATA3_2:
MOV A,R2
MOVC A,@A+DPTR
MOV SBUF,A ;送第3字節,送月、年、0、2、溫度個位數據。
JNB TI,$
CLR TI
MOV A,R4
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A ;送第4字節,送總天數、周次、溫度符號位和小數位數據。
JNB TI,$
CLR TI
INC R0
INC R1
INC R3
INC R5
MOV A,R3
SETB PSW.4 ;選2組寄存器
MOV R0,A
MOV A,@R0
CLR PSW.4
MOV R2,A
MOV A,R5
SETB PSW.4 ;選2組寄存器
MOV R0,A
MOV A,@R0
CLR PSW.4
MOV R4,A
PLAY3:
MOV A,R6
MOV P2,A
LCALL DL500us
MOV A,R6
JNB ACC.6,PLAYOUT
RL A
MOV R6,A
LJMP DISPLAY1
PLAYOUT:
SETB P2.6
SETB EA ;開啟總中斷
RET
;---------------------------------------------
; 開機顯示程序
;---------------------------------------------
ON_DISPLAY:
CLR EA ;顯示程序當中,關閉總中斷
MOV 7CH,#02H
MOV 7BH,#00H
MOV R0,#70H ;日
MOV R1,#60H ;秒
MOV R2,77H ;月
MOV R3,#77H
MOV R4,67H ;總天數
MOV R5,#67H
MOV R6,#0FEH ;位選通端
ON_DISPLAY1:
MOV A,#0FFH
MOV P2,A
MOV A,@R0
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A ;送第1字節,送日,農歷月、日、星期數據。
JNB TI,$
CLR TI
MOV A,@R1
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A ;送第2字節,送秒、分、時、溫度十位數據。
JNB TI,$
CLR TI
MOV A,R3
CJNE A,#7DH,ON_SEND_DATA3_1
MOV DPTR,#TAB2
LJMP ON_SEND_DATA3_2
ON_SEND_DATA3_1:
MOV DPTR,#TAB1
ON_SEND_DATA3_2:
MOV A,R2
MOVC A,@A+DPTR
MOV SBUF,A ;送第3字節,送月、年、0、2、溫度個位數據。
JNB TI,$
CLR TI
MOV A,R4
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A ;送第4字節,送總天數、周次、溫度符號位和小數位數據。
JNB TI,$
CLR TI
INC R0
INC R1
INC R3
INC R5
MOV A,R3
SETB PSW.4 ;選2組寄存器
MOV R0,A
MOV A,@R0
CLR PSW.4
MOV R2,A
MOV A,R5
SETB PSW.4 ;選2組寄存器
MOV R0,A
MOV A,@R0
CLR PSW.4
MOV R4,A
ON_PLAY3:
MOV A,R6
MOV P2,A
LCALL DL05s
MOV A,R6
JNB ACC.6,ON_PLAYOUT
RL A
MOV R6,A
LJMP ON_DISPLAY1
ON_PLAYOUT:
SETB P2.6
SETB EA ;開啟總中斷
RET
;---------------------------------------------
; 延時程序
;---------------------------------------------
DL500uS:
MOV 7FH,#200
DL1:
JNB IRIN,OPEN_EA1
AJMP DL2
OPEN_EA1:
AJMP DL2
DL2:
DJNZ 7FH,DL1
RET
;---------------------------------------------
; 開機延時程序
;---------------------------------------------
DL05S:
MOV 2DH,#4
DL05S1:
MOV 2EH,#100
DL05S2:
LCALL DL500US
DJNZ 2EH,DL05S2
DJNZ 2DH,DL05S1
RET
;---------------------------------------------
; 顯示程序使用的數據表
;---------------------------------------------
TAB1:
DB 03H,9FH,25H,0DH,99H
; 0 1 2 3 4
DB 49H,41H,1BH,01H,09H,0FFH,0FDH,0EH
; 5 6 7 8 9 熄滅 - 'C(攝氏溫度的符號單位)
TAB2:
DB 02H,9EH,24H,0CH,98H
; 0. 1. 2. 3. 4.
DB 48H,40H,1AH,00H,08H,
; 5. 6. 7. 8. 9.
;---------------------------------------------
; DS18B20溫度轉換程序
;---------------------------------------------
get_temper:
clr ea ;DS18B20使用期間,禁止任何中斷產生
lcall rest ;復位DS18B20
jb F1,dss2 ;判斷DS18B20是否存在
ret
dss2:
mov a,#0cch ;跳過ROM匹配
lcall DSWR
mov a,#44h ;向DS18B20發出溫度轉換命令
lcall DSWR
lcall rest ;讀溫度前先復位
mov a,#0cch ;跳過ROM匹配
lcall DSWR
mov a,#0beh ;向DS18B20發出度溫度命令
lcall DSWR
lcall DSRE ;讀取溫度數據
SETB EA
ret
;DS18B20 RESET
rest:
setb date_line
nop
clr date_line
mov r0,#6bh ;主機發出延時復位低脈沖
mov r1,#04h
tsr1:
djnz r0,$
mov r0,#6bh
djnz r1,tsr1
setb date_line ;然后拉高數據線
nop
nop
nop
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -