📄 s52wnl.asm
字号:
JNB P0.3,WAITT6
AJMP SETG11
SETGOUT:
LCALL DISPLAY
JNB P0.1,SETGOUT
LCALL GENGXIAN
MOV 32H,#80H
MOV 31H,#00H ;1302晶振开始振荡
LCALL WRITE
MOV 32H,#8EH
MOV 31H,#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,#0FH
MOV 7BH,#0FH
AJMP GFLASHOUT
GFLASH2:
JB 0BH,GFLASH3 ;调月闪
MOV 7AH,#0FH
MOV 79H,#0FH
AJMP GFLASHOUT
GFLASH3:
JB 0CH,GFLASH4 ;调日闪
MOV 77H,#0FH
MOV 76H,#0FH
AJMP GFLASHOUT
GFLASH4:
JB 0DH,GFLASH5 ;调星期闪
MOV 78H,#0FH
AJMP GFLASHOUT
GFLASH5:
JB 0EH,GFLASH6 ;调小时闪
MOV 75H,#0FH
MOV 74H,#0FH
AJMP GFLASHOUT
GFLASH6:
MOV 73H,#0FH ;调分钟闪
MOV 72H,#0FH
AJMP GFLASHOUT
;加一程序~~~~~~~~~~~~~~~~~~~~~~~~~
ADD1:
MOV A,R7
ADD A,#1
DA A
RET
;减一程序~~~~~~~~~~~~~~~~~~~~~~~~~
JIAN1:
MOV A,R7
DEC A
CJNE A,#4FH,KK1
MOV A,#49H
KK1:
CJNE A,#3FH,KK2
MOV A,#39H
KK2:
CJNE A,#2FH,KK3
MOV A,#29H
KK3:
CJNE A,#1FH,KK4
MOV A,#19H
KK4:
CJNE A,#0FH,KK5
MOV A,#09H
KK5:
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,32H
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,31H
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,32H
MOV R4,#8
READ1:
RRC A ;送地址给1302
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 ;从1302中读出数据
NOP
NOP
MOV C,IO
NOP
NOP
NOP
NOP
NOP
RRC A
NOP
NOP
NOP
NOP
SETB SCLK
NOP
DJNZ R4,READ2
MOV 31H,A
CLR RST
RET
;BCD码转换为10进制程序~~~~~
BCD_10:
MOV A,R0
ANL A,#0FH
MOV R1,A ;高位×10, 加低位
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#10
MUL AB
ADD A,R1
MOV R0,A
RET
;查一年数据程序~~~~~~~~~~~~~~~~
CHECKMONTH:
LCALL BCD_10
MOV A,R0
MOV B,#04
MUL AB
MOV R1,A
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV R7,A ;第一字节送R7
INC R1
MOV A,R1
MOVC A,@A+DPTR
MOV R6,A ;第二字节送R6
INC R1
MOV A,R1
MOVC A,@A+DPTR
MOV R5,A ;第三字节送R6
INC R1
MOV A,R1
MOVC A,@A+DPTR
MOV R4,A ;第四字节送R4
RET
;;;;;自动更新农历;;;
;;;;;;;;;;;;;;;;;;;;
GENGXIAN: MOV R2,#00H
MOV R3,#00H
MOV A,month
CJNE A,#01H,GM2
MOV R0,day ;当前月为一月
LCALL BCD_10 ;当前日转换为10进制,送R2
MOV A,R0
MOV R2,A
AJMP TIAOZHENG1
GM2: CJNE A,#02H,GM3
MOV R0,day ;当前月为二月
LCALL BCD_10 ;;当前日转换为10进制,
MOV A,R0 ;再加31,送R2
ADD A,#31
MOV R2,A
AJMP TIAOZHENG1
GM3: CJNE A,#03H,GM4
MOV R0,day ;当前月为三月
LCALL BCD_10 ;当前日转换为10进制,
MOV A,R0 ;再加59,送R2
ADD A,#59
MOV R2,A
AJMP TIAOZHENG1
GM4: CJNE A,#04H,GM5
MOV R0,day ;当前月为四月
LCALL BCD_10 ;;当前日转换为10进制,
MOV A,R0 ;再加90,送R2
ADD A,#90
MOV R2,A
AJMP TIAOZHENG1
GM5: CJNE A,#05H,GM6
MOV R0,day ;当前月为五月
LCALL BCD_10 ;当前日转换为10进制,
MOV A,R0 ;再加120,送R2
ADD A,#120
MOV R2,A
AJMP TIAOZHENG1
GM6: CJNE A,#06H,GM7
MOV R0,day ;当前月为六月
LCALL BCD_10 ;当前日转换为10进制,
MOV A,R0 ;再加151,送R2
ADD A,#151
MOV R2,A
AJMP TIAOZHENG1
GM7: CJNE A,#07H,GM8
MOV R0,day ;当前月位七月
LCALL BCD_10 ;当前日转换为10进制,
MOV A,R0 ;再加181,送R2
ADD A,#181
MOV R2,A
AJMP TIAOZHENG1
GM8:CJNE A,#08H,GM9
MOV R0,day ;当前月为八月
LCALL BCD_10 ;当前日转换为10进制,
MOV A,R0 ;再加212,送R2
ADD A,#212
MOV R2,A
AJMP TIAOZHENG1
GM9:CJNE A,#09H,GM10
MOV R0,day ;当前月为九月
LCALL BCD_10 ;当前日转换为10进制,
MOV A,R0 ;再加243
CLR C
ADD A,#243
JC GGG
MOV R2,A ;A没有溢出,送R2
AJMP TIAOZHENG1
GGG: MOV R3,#0FFH ;A溢出,A加一送R2
INC A ;R3中送#0ffh
MOV R2,A
AJMP TIAOZHENG1
GM10: CJNE A,#10H,GM11
MOV R0,day ;当前月为10月
LCALL BCD_10 ;当前日转换为10进制,
MOV A,R0 ;再加18,送R2
ADD A,#18 ;R3中送#0FFH
MOV R2,A
MOV R3,#0FFH
AJMP TIAOZHENG1
GM11:CJNE A,#11H,GM12
MOV R0,day ;当前月为11月
LCALL BCD_10 ;当前日转换为10进制,
MOV A,R0 ;再加49,送R2
ADD A,#49 ;R3中送#0FFH
MOV R2,A
MOV R3,#0FFH
AJMP TIAOZHENG1
GM12: MOV R0,day ;当前月为12月
LCALL BCD_10 ;当前日转换为10进制,
MOV A,R0 ;再加79,送R2
ADD A,#79 ;R3中送#0FFH
MOV R2,A
MOV R3,#0FFH
AJMP TIAOZHENG1
TIAOZHENG1: MOV A,year
MOV B,#04
DIV AB
MOV A,B
JNZ GGG1
MOV A,65H ;当前年为闰年
CJNE A,#01H,AAAA
AJMP GGG1 ;当前月是1
AAAA: CJNE A,#02H,BBBB
AJMP GGG1 ;当前月是2
BBBB: CJNE R2,#0FFH,GGG2
MOV R3,#0FFH ;当前月不是1和2,
MOV R2,#01H ;R1和R2总和加一
AJMP GGG1
GGG2: INC R2
GGG1: MOV R0,year ;查一年数据
LCALL CHECKMONTH
MOV A,R2
CLR C
SUBB A,R7
MOV P2.7,C
CJNE A,#01H,GGG3
MOV R2,#01H
MOV A,R3
CJNE A,#00H,NEW1
MOV 57H,#01H ;R2和R3总和减R7
MOV 56H,#01H ;为0,则为春节
LJMP S_PLAY
GGG3: CJNE A,#00H,GGG6
MOV R2,A
AJMP OLD
GGG6: JNB P2.7,NEW2
MOV A,R7
CLR C
SUBB A,R2
MOV R7,A
CJNE R3,#0FFH,GGG5
MOV A,R3
CLR C
SUBB A,R7
MOV R2,A
MOV R3,#00H
AJMP NEW
GGG5: MOV A,R7
MOV R2,A
AJMP OLD
NEW1: MOV R2,#0FFH
MOV R3,#01H
AJMP NEW
NEW2: MOV R2,A
MOV A,R3
CJNE A,#0FFH,GGG4
MOV A,R2
MOV R3,A
MOV R2,#0FFH
GGG4: AJMP NEW
;OLD 农历为公历的前一年
OLD: MOV A,year
DEC A
MOV R0,A
LCALL CHECKMONTH
MOV A,R2
CLR C
SUBB A,#29
MOV P2.7,C
MOV R6,A
MOV A,R5
JB ACC.0,AAA ;12月为小月,转到AAA
MOV A,R2
CLR C
SUBB A,#30
MOV P2.7,C
MOV R6,A
AAA:MOV A,R6
CJNE A,#00H,BBB
MOV 56H,#29H ;为0,则为11月最后一天
MOV A,R5 ;小月为11月29
JB ACC.1,CCC
MOV 56H,#30H ;大月为11月30
CCC:MOV 57H,#11H
LJMP S_PLAY
BBB:JNB P2.7, DDD
MOV A,#29 ; CY位置位,位12月
CLR C
SUBB A,R2
MOV R4,A
MOV A,R5
JB ACC.0,EEE
MOV A,#30
CLR C
SUBB A,R2
MOV R4,A
EEE: MOV A,R4
MOV R0,A
LCALL D_BCD
MOV 56H,A
MOV 57H,#12H
LJMP S_PLAY
DDD: MOV A,#29 ;CY为0,为11月
CLR C
SUBB A,R4
MOV R1,A
MOV A,R5
JB ACC.1, FFF
MOV A,#30
CLR C
SUBB A,R4
MOV R1,A
FFF: MOV A,R1
MOV R0,A
LCALL D_BCD
MOV 56H,A
MOV 57H,#11H
LJMP S_PLAY
;NEW此时R2中的值为FFH时
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -