📄 万年历_2.asm
字号:
;*****************************
;* 万年历程序 *
;*****************************
;67H(高两位年)66H(低两位年)65H(月)64H(星期)
;63H(日)62H(小时)61H(分)60H(秒)57H(农历月)56H(农历日)
;显示缓冲单元7CH~7BH(4CH~4BH)年低位,7AH~79H(4AH~49H)月,
;78H(48H)星期,77H~76H(47H~46H)日,75H~74H(45H~44H)时,
;73H72H(43H~42H)分,71H~70H(41H~40H)秒,5EH~5DH(55H~54H)农历年
;5CH~5BH(53H~52H)农历月,5AH~59H(51H~50H)农历日
;闰年标志为F0,定时器T1为调整时候闪烁用
;
;
SCLK EQU P3.2
IO EQU P3.3
RST EQU P3.4
YEAR DATA 66H
MONTH DATA 65H
WEEK DATA 64H
DAY DATA 63H
HOUR DATA 62H
MINUTE DATA 61H
SECOND DATA 60H
DS1302_ADDR DATA 32H
DS1302_DATA DATA 31H
ORG 0000H
AJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
LJMP INTT1
ORG 0023H
RETI
ORG 002BH
RETI
;************************************
;* 主程序 *
;************************************
START: SETB EA
MOV SCON,#00H ;串行输出,方式0
MOV TMOD,#10H ;计数器1,方式1
MOV TL1,#00H
MOV TH1,#00H
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
;MOV DS1302_ADDR,#80H
;MOV DS1302_DATA,#00H ;允许写1302
;LCALL WRITE
MOV DS1302_ADDR,#90H
MOV DS1302_DATA,#0A6H ;1302充电,充电电流1.1mA
LCALL WRITE
MAIN1: MOV DS1302_ADDR,#8DH ;READ OUT YEAR
LCALL READ
MOV YEAR,DS1302_DATA
MOV DS1302_ADDR,#8BH ;READ OUT WEEK
LCALL READ
MOV WEEK,DS1302_DATA
MOV DS1302_ADDR,#89H ;READ OUT MONTH
LCALL READ
MOV MONTH,DS1302_DATA
MOV DS1302_ADDR,#87H ;READ OUT DAY
LCALL READ
MOV DAY,DS1302_DATA
MOV DS1302_ADDR,#85H ;READ OUT HOUR
LCALL READ
MOV HOUR,DS1302_DATA
MOV DS1302_ADDR,#83H ;READ OUT MINTUE
LCALL READ
MOV MINUTE,DS1302_DATA
MOV DS1302_ADDR,#81H ;READ OUT SECOND
LCALL READ
MOV SECOND,DS1302_DATA
MOV R0,YEAR
LCALL DIVIDE
MOV 7BH,R1
MOV 4BH,R1
MOV 7CH,R2
MOV 4CH,R2
MOV 78H,WEEK
MOV 48H,WEEK
MOV R0,MONTH
LCALL DIVIDE
MOV 79H,R1
MOV 49H,R1
MOV 7AH,R2
MOV 4AH,R2
MOV R0,DAY
LCALL DIVIDE
MOV 76H,R1
MOV 46H,R1
MOV 77H,R2
MOV 47H,R2
MOV R0,HOUR
LCALL DIVIDE
MOV 74H,R1
MOV 44H,R1
MOV 75H,R2
MOV 45H,R2
MOV R0,MINUTE
LCALL DIVIDE
MOV 72H,R1
MOV 42H,R1
MOV 73H,R2
MOV 43H,R2
MOV R0,SECOND
LCALL DIVIDE
MOV 70H,R1
MOV 40H,R1
MOV 71H,R2
MOV 41H,R2
LCALL DISPLAY
JNB P1.1,SETG
JNB F0,SSS
CLR P1.3
LJMP MAIN1
SSS: SETB P1.3
LJMP MAIN1
;*********************************
;* 公历 *
;*********************************
SETG: SETB TR1
SETB ET1
CLR 08H
CLR 09H
CLR 0AH
CLR 0BH
CLR 0CH
CLR 0DH
CLR 0EH
CLR 0FH
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H
LCALL WRITE
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#80H
LCALL WRITE
GWAIT: LCALL DISPLAY
JNB P1.1,GWAIT
SETG1: LCALL DISPLAY
JNB P1.1,SETG2
JNB P1.2,GADDYEAR
AJMP SETG1
GADDYEAR: MOV R7,66H
LCALL ADD1
MOV 66H,A
CJNE A,#51H,GADDYEAR1
MOV 66H,#01H
GADDYEAR1: MOV DS1302_ADDR,#8CH
MOV DS1302_DATA,66H
LCALL WRITE
MOV R0,66H
LCALL DIVIDE
MOV 4BH,R1
MOV 7BH,R1
MOV 4CH,R2
MOV 7CH,R2
WAITT1: LCALL DISPLAY
JNB P1.2,WAITT1
AJMP SETG1
SETG2: SETB 0AH
GWAITT2: LCALL DISPLAY
JNB P1.1,GWAITT2
SETG3: LCALL DISPLAY
JNB P1.1,SETG4
JNB P1.2,GADDMONTH
AJMP SETG3
GADDMONTH: MOV R7,65H
LCALL ADD1
MOV 65H,A
CJNE A,#13H,GADDMONTH1
MOV 65H,#01H
GADDMONTH1: MOV DS1302_ADDR,#88H
MOV DS1302_DATA,65H
LCALL WRITE
MOV R0,65H
LCALL DIVIDE
MOV 49H,R1
MOV 79H,R1
MOV 4AH,R2
MOV 7AH,R2
WAITT2: LCALL DISPLAY
JNB P1.2,WAITT2
AJMP SETG3
SETG4: SETB 0BH
GWAIT4: LCALL DISPLAY
JNB P1.1,GWAIT4
SETG5: LCALL DISPLAY
JNB P1.1,SETG6
JNB P1.2,GADDDAY
AJMP SETG5
GADDDAY: MOV R7,63H
LCALL ADD1
MOV 63H,A
CJNE A,#32H,GADDDAY1
MOV 63H,#01H
GADDDAY1: MOV DS1302_ADDR,#86H
MOV DS1302_DATA,63H
LCALL WRITE
MOV R0,63H
LCALL DIVIDE
MOV 46H,R1
MOV 76H,R1
MOV 47H,R2
MOV 77H,R2
WAITT3: LCALL DISPLAY
JNB P1.2,WAITT3
AJMP SETG5
SETG6: SETB 0CH
GWAIT6: LCALL DISPLAY
JNB P1.1,GWAIT6
SETG7: LCALL DISPLAY
JNB P1.1,SETG8
JNB P1.2,GADDWEEK
AJMP SETG7
GADDWEEK: MOV R7,64H
LCALL ADD1
MOV 64H,A
CJNE A,#08H,GADDWEEK1
MOV 64H,#01H
GADDWEEK1: MOV DS1302_ADDR,#8AH
MOV DS1302_DATA,64H
LCALL WRITE
MOV R0,64H
LCALL DIVIDE
MOV 48H,R1
MOV 78H,R1
WAITT4: LCALL DISPLAY
JNB P1.2,WAITT4
AJMP SETG7
SETG8: SETB 0DH
GWAIT8: LCALL DISPLAY
JNB P1.1,GWAIT8
SETG9: LCALL DISPLAY
JNB P1.1,SETG10
JNB P1.2,GADDHOUR
AJMP SETG9
GADDHOUR: MOV R7,62H
LCALL ADD1
MOV 62H,A
CJNE A,#24H,GADDHOUR1
MOV 62H,#00H
GADDHOUR1: MOV DS1302_ADDR,#84H
MOV DS1302_DATA,62H
LCALL WRITE
MOV R0,62H
LCALL DIVIDE
MOV 44H,R1
MOV 74H,R1
MOV 45H,R2
MOV 75H,R2
WAITT5: LCALL DISPLAY
JNB P1.2,WAITT5
AJMP SETG9
SETG10: SETB 0EH
GWAIT10: LCALL DISPLAY
JNB P1.1,GWAIT10
SETG11: LCALL DISPLAY
JNB P1.1,SETGOUT
JNB P1.2,GADDMINUTE
AJMP SETG11
GADDMINUTE: MOV R7,61H
LCALL ADD1
MOV 61H,A
CJNE A,#60H,GADDMINUTE1
MOV 61H,#00H
GADDMINUTE1: MOV DS1302_ADDR,#82H
MOV DS1302_DATA,61H
LCALL WRITE
MOV R0,61H
LCALL DIVIDE
MOV 42H,R1
MOV 72H,R1
MOV 43H,R2
MOV 73H,R2
WAITT6: LCALL DISPLAY
JNB P1.2,WAITT6
AJMP SETG11
SETGOUT: LCALL DISPLAY
JNB P1.1,SETGOUT
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H ;允许写1302
LCALL WRITE
CLR 08H
CLR 09H
CLR 0AH
CLR 0BH
CLR 0CH
CLR 0DH
CLR 0EH
CLR 0FH
CLR ET1
CLR TR1
LJMP MAIN1
;*********************************
;* 散动 *
;*********************************
INTT1: PUSH ACC
PUSH PSW
GFLASH: CPL 0FH
JB 0FH,GFLASH1
MOV 7CH,4CH
MOV 7BH,4BH
MOV 7AH,4AH
MOV 79H,49H
MOV 78H,48H
MOV 77H,47H
MOV 76H,46H
MOV 75H,45H
MOV 74H,44H
MOV 73H,43H
MOV 72H,42H
MOV 71H,41H
MOV 70H,40H
GFLASHOUT: POP PSW
POP ACC
RETI
GFLASH1: JB 0AH,GFLASH2
MOV 7CH,#0AH
MOV 7BH,#0AH
AJMP GFLASHOUT
GFLASH2: JB 0BH,GFLASH3
MOV 7AH,#0AH
MOV 79H,#0AH
AJMP GFLASHOUT
GFLASH3: JB 0CH,GFLASH4
MOV 77H,#0AH
MOV 76H,#0AH
AJMP GFLASHOUT
GFLASH4: JB 0DH,GFLASH5
MOV 78H,#0AH
AJMP GFLASHOUT
GFLASH5: JB 0EH,GFLASH6
MOV 75H,#0AH
MOV 74H,#0AH
AJMP GFLASHOUT
GFLASH6:
MOV 73H,#0AH
MOV 72H,#0AH
AJMP GFLASHOUT
;*********************************
;* 加1 *
;*********************************
ADD1: MOV A,R7
ADD A,#01H
DA A
RET
;*********************************
;* 分离 *
;*********************************
DIVIDE: MOV A,R0
ANL A,#0FH
MOV R1,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV R2,A
RET
;*********************************
;* 写1302程序 *
;*********************************
WRITE: CLR SCLK
NOP
SETB RST
NOP
MOV A,DS1302_ADDR
MOV R4,#8
WRITE1: RRC A ;送地址给1302
NOP
NOP
CLR SCLK
NOP
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE1
CLR SCLK
NOP
MOV A,DS1302_DATA
MOV R4,#8
WRITE2: RRC A
NOP ;送数据给1302
CLR SCLK
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE2
CLR RST
RET
;*******************************
;* 读1302程序 *
;*******************************
READ: CLR SCLK
NOP
NOP
SETB RST
NOP
MOV A,DS1302_ADDR
MOV R4,#8
READ1: RRC A
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
NOP
CLR SCLK
NOP
NOP
DJNZ R4,READ1
MOV R4,#8
READ2: CLR SCLK
NOP
NOP
SETB IO
MOV C,IO
NOP
NOP
NOP
NOP
NOP
RRC A
NOP
NOP
NOP
NOP
SETB SCLK
NOP
DJNZ R4,READ2
MOV DS1302_DATA,A
CLR RST
RET
;*********************************
;* 显示 *
;*********************************
DISPLAY: MOV 7EH,#02H
MOV 7DH,#00H
MOV R0,#76H
MOV R1,#70H
MOV R2,79H
MOV R3,#79H
MOV R5,#0FEH
PLAY1: MOV A,#0FFH
MOV P2,A
MOV A,@R0
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,@R1
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,R2
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
INC R1
INC R3
MOV A,R3
SETB PSW.4
MOV R0,A
MOV A,@R0
CLR PSW.4
MOV R2,A
MOV A,R0
CJNE A,#78H,PLAY2
MOV R0,#50H
PLAY2: CJNE A,#54H,PLAY3
MOV R0,#78H
PLAY3: MOV A,R5
MOV P2,A
LCALL DL1MS
MOV A,R5
JNB ACC.6,PLAYOUT
RL A
MOV R5,A
LJMP PLAY1
PLAYOUT: SETB P2.6
RET
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
TAB1: ;DB 0C0H,0F9H,0A4H,0B0H
; DB 99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
DB 03H,9FH,25H,0DH,99H
DB 49H,41H,1FH,01H,09H,0FFH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -