📄 wannieli.asm
字号:
MOV DS1302_ADDR,#0C9H
LCALL READ
MOV ALARM2ON_L,DS1302_DATA
MOV DS1302_ADDR,#0CBH
LCALL READ
MOV ALARM3ON_H,DS1302_DATA
MOV DS1302_ADDR,#0CDH
LCALL READ
MOV ALARM3ON_L,DS1302_DATA
MOV DS1302_ADDR,#0CFH
LCALL READ
MOV ALARMTIME,DS1302_DATA
MOV DS1302_ADDR,#0D1H
LCALL READ
MOV ALARM4ON_H,DS1302_DATA
MOV DS1302_ADDR,#0D3H
LCALL READ
MOV ALARM4ON_L,DS1302_DATA
MOV DS1302_ADDR,#0D5H
LCALL READ
MOV OUT1ON_H,DS1302_DATA
MOV DS1302_ADDR,#0D7H
LCALL READ
MOV OUT1ON_L,DS1302_DATA
MOV DS1302_ADDR,#0D9H
LCALL READ
MOV OUT1OFF_H,DS1302_DATA
MOV DS1302_ADDR,#0DBH
LCALL READ
MOV OUT1OFF_L,DS1302_DATA
MOV DS1302_ADDR,#0DDH
LCALL READ
MOV OUT2ON_H,DS1302_DATA
MOV DS1302_ADDR,#0DFH
LCALL READ
MOV OUT2ON_L,DS1302_DATA
MOV DS1302_ADDR,#0E1H
LCALL READ
MOV OUT2OFF_H,DS1302_DATA
MOV DS1302_ADDR,#0E3H
LCALL READ
MOV OUT2OFF_L,DS1302_DATA
MOV DS1302_ADDR,#0E5H
LCALL READ
MOV OUT3ON_H,DS1302_DATA
MOV DS1302_ADDR,#0E7H
LCALL READ
MOV OUT3ON_L,DS1302_DATA
MOV DS1302_ADDR,#0E9H
LCALL READ
MOV OUT3OFF_H,DS1302_DATA
MOV DS1302_ADDR,#0EBH
LCALL READ
MOV OUT3OFF_L,DS1302_DATA
MOV DS1302_ADDR,#0EDH
LCALL READ
MOV OUT4ON_H,DS1302_DATA
MOV DS1302_ADDR,#0EFH
LCALL READ
MOV OUT4ON_L,DS1302_DATA
MOV DS1302_ADDR,#0F1H
LCALL READ
MOV OUT4OFF_H,DS1302_DATA
MOV DS1302_ADDR,#0F3H
LCALL READ
MOV OUT4OFF_L,DS1302_DATA
RET
;*********************************
;* BCD码转换为十进制程序 *
;*********************************
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 ;第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
;******************************
;* 自动更新农历 *
;******************************
GENGXIN: MOV R2,#00H
MOV R3,#00H
MOV A,MONTH
CJNE A,#01H,GM2
MOV R0,DAY ;当前月为1月
LCALL BCD_10 ;当前日转换为十进制,送R2
MOV A,R0
MOV R2,A
AJMP TIAOZHENG1
GM2: CJNE A,#02H,GM3
MOV R0,DAY ;当前月为2月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加31送R2
ADD A,#31
MOV R2,A
AJMP TIAOZHENG1
GM3: CJNE A,#03H,GM4
MOV R0,DAY ;当前月为3月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加59送R2
ADD A,#59
MOV R2,A
AJMP TIAOZHENG1
GM4: CJNE A,#04H,GM5
MOV R0,DAY ;当前月为4月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加90送R2
ADD A,#90
MOV R2,A
AJMP TIAOZHENG1
GM5: CJNE A,#05H,GM6
MOV R0,DAY ;当前月为5月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加120送R2
ADD A,#120
MOV R2,A
AJMP TIAOZHENG1
GM6: CJNE A,#06H,GM7
MOV R0,DAY ;当前月为6月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加151送R2
ADD A,#151
MOV R2,A
AJMP TIAOZHENG1
GM7: CJNE A,#07H,GM8
MOV R0,DAY ;当前月为7月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加181送R2
ADD A,#181
MOV R2,A
AJMP TIAOZHENG1
GM8: CJNE A,#08H,GM9
MOV R0,DAY ;当前月为8月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加212送R2
ADD A,#212
MOV R2,A
AJMP TIAOZHENG1
GM9: CJNE A,#09H,GM10
MOV R0,DAY ;当前月为9月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加243
CLR C
ADD A,#243
JC GGG
MOV R2,A ;A没溢出,送R2
AJMP TIAOZHENG1
GGG: MOV R3,#0FFH ;R3中送#0FFH
INC A ;A溢出,A加1送R2
MOV R2,A
AJMP TIAOZHENG1
GM10: CJNE A,#10H,GM11
MOV R0,DAY ;当前月为10月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加18送R2
ADD A,#18
MOV R2,A ;R3中送#0FFH
MOV R3,#0FFH
AJMP TIAOZHENG1
GM11: CJNE A,#11H,GM12
MOV R0,DAY ;当前月为11月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加49送R2
ADD A,#49
MOV R2,A ;R3中送#0FFH
MOV R3,#0FFH
AJMP TIAOZHENG1
GM12: MOV R0,DAY ;当前月为12月
LCALL BCD_10 ;当前日转换为十进制
MOV A,R0 ;再加79送R2
ADD A,#79
MOV R2,A
MOV R3,#0FFH ;R3中送#0FFH
AJMP TIAOZHENG1
TIAOZHENG1: MOV A,YEAR
MOV B,#04
DIV AB
MOV A,B
JNZ GGG1
MOV A,65H ;当前月是1
CJNE A,#01H,AAAA
AJMP GGG1 ;当前月是2
AAAA: CJNE A,#02H,BBBB
AJMP GGG1
BBBB: CJNE R2,#0FFH,GGG2
MOV R3,#0FFH ;当前月不是1和2
MOV R2,#01H ;R1和R2总和加1
AJMP GGG1
GGG2: INC R2
GGG1: MOV R0,YEAR ;查意一年数据
LCALL CHECKMONTH
MOV A,R2
CLR C
SUBB A,R7
MOV RYEAR,C
CJNE A,#01H,GGG3
MOV R2,#01H
MOV A,R3
CJNE A,#00H,NEW1
MOV NMONTH,#01H ;R2和R3总和减R7
MOV NDAY,#01H ;为0,则为春节
LJMP S_PLAY
GGG3: CJNE A,#00H,GGG6
MOV R2,A
AJMP OLD
GGG6: JNB RYEAR,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 RYEAR,C
MOV R6,A
MOV A,R5
JB ACC.0,AAA ;12月为小月,转到AAA
MOV A,R2
CLR C
SUBB A,#30
MOV RYEAR,C
MOV R6,A
AAA: MOV A,R6
CJNE A,#00H,BBB
MOV NDAY,#29H ;为0,则为11月最后一天
MOV A,R5 ;小月为11月29
JB ACC.1,CCC
MOV NDAY,#30H ;大月为11月30
CCC: MOV NMONTH,#11H
LJMP S_PLAY
BBB: JNB RYEAR,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 NDAY,A
MOV NMONTH,#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 NDAY,A
MOV NMONTH,#11H
LJMP S_PLAY
;*************************
;* NEW *
;*************************
;农历和公历为同一年,此时R2中值为FFH时,R3有值,否则为0
NEW: NOP
M1: MOV A,R2 ;R2减1月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R6
JB ACC.6,SM11
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
SM11: JC SM12
MOV A,R1 ;R2减1月天数 够减
MOV R2,A ;转2月
AJMP M2
SM12: CJNE R3,#00H,M13 ;R2减1月天数
LJMP Y1 ;不够减,判断R3为0否
M13: MOV A,R2 ;不为0,R3加到R2中
ADD A,R3 ;再让1月减
MOV R2,A ;还不够转Y1
MOV R3,#00H
AJMP M1
M2: CLR C ;R2减1月天数 够减
MOV A,R2 ;转3月
SUBB A,#29
MOV R1,A
MOV A,R6
JB ACC.5,M21
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
M21: JC M22
MOV A,R1 ;R2减2月天数 够减
MOV R2,A
AJMP MM2
M22: CJNE R3,#00H,M23 ;R2减2月天数
LJMP Y2 ;不够减,判断R3为0否
M23: MOV A,R2 ;不为0,R3加到R2中
ADD A,R3 ;再让2月减
MOV R2,A ;还不够转Y2
MOV R3,#00H
AJMP M2
MM2: LCALL CHECKRE ;查2月,如果不为闰月
CJNE A,#02H,M3 ;转3月
RM2: MOV A,R4
ANL A,#0FH ;R2减闰2月天数
JNZ RM21
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
AJMP RM22
RM21: MOV A,R2
CLR C
SUBB A,#29
MOV R1,A
RM22: JC RM23
MOV A,R1 ;R2减闰2月天数,够减
MOV R2,A ;转3月
AJMP M3
RM23: CJNE R3,#00H,RM24 ;R2减润2月天数
LJMP RY2 ;不够减,判断R3为0否
RM24: MOV A,R2 ;不为0,R3加到R2中
ADD A,R3 ;再让闰2月减
MOV R3,#00H ;还不够转RY2
AJMP RM2
M3: MOV A,R2 ;R2减3月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R6
JB ACC.4,M31
CLR C
MOV A,R2
SUBB A,#30
MOV R1,A
M31: JC M32
MOV A,R1 ;R2减3月天数,够减
MOV R2,A
AJMP MM3
M32: CJNE R3,#00H,M33 ;R2减3月天数
LJMP Y3 ;不够减,判断R3为0否
M33: MOV A,R2 ;不为0,R3加到R2中
ADD A,R3 ;再让3月减
MOV R2,A ;还不够,则转Y3
MOV R3,#00H
AJMP M3
MM3: LCALL CHECKRE ;查3月,如果不为闰月
CJNE A,#03H,M4 ;转4月
RM3: MOV A,R4
ANL A,#0FH ;R2减闰3月天数
JNZ RM31
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
AJMP RM32
RM31: MOV A,R2
CLR C
SUBB A,#29
MOV R1,A
RM32: JC RM33
MOV A,R1 ;R2减闰3月天数,够减
MOV R2,A ;转4月
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -