📄 万年历最终版.asm
字号:
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 ;第1字节送R7
INC R1
MOV A,R1
MOVC A,@A+DPTR
MOV R6,A ;第2字节送R6
INC R1
MOV A,R1
MOVC A,@A+DPTR
MOV R5,A ;第3字节送R5
INC R1
MOV A,R1
MOVC A,@A+DPTR
MOV R4,A ;第4字节送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 2EH.4,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 2EH.4,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 2EH.4,C
MOV R6,A
MOV A,R5
JB ACC.0,AAA ;12月为小月,转到AAA
MOV A,R2
CLR C
SUBB A,#30
MOV 2EH.4,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 2EH.4, 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 + -