|
回复: 求,,万年历不知那里程序写错了。。请大虾门帮手看看。。。
;******************************
;* 自动更新农历 *
;******************************
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 P1.6,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 P1.6,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 P1.6,C
MOV R6,A
MOV A,R5
JB ACC.0,AAA ;12月为小月,转到AAA
MOV A,R2
CLR C
SUBB A,#30
MOV P1.6,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 P1.6,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时,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月
AJMP M4
RM33: CJNE R3,#00H,RM34
LJMP RY3 ;R2减润3月天数
RM34: MOV A,R2 ;不够减,判断R3为0否
ADD A,R3 ;不为0,R3加到R2中
MOV R2,A ;再让闰3月减
MOV R3,#00H ;还不够转RY3
AJMP RM3
M4: MOV A,R2 ;R2减4月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R6
JB ACC.2,M41
CLR C
MOV A,R2
SUBB A,#30
MOV R1,A
M41: JC M42
MOV A,R1 ;R2减4月天数,够减
MOV R2,A
AJMP MM4
M42: CJNE R3,#00H,M43 ;R2减4月天数
LJMP Y4;不够减,判断R3为0否
M43: MOV A,R2;不为0,R3加到R2中
ADD A,R3;再让4月减
MOV R2,A ;还不够,则转Y4
MOV R3,#00H
AJMP M4
MM4: LCALL CHECKRE ;查4月,如果不为闰月
CJNE A,#04H,M5 ;转5月
RM4: MOV A,R4
ANL A,#0FH ;R2减闰4月天数
JNZ RM41
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
AJMP RM42
RM41: MOV A,R2
CLR C
SUBB A,#29
MOV R1,A
RM42: JC RM43
MOV A,R1 ;R2减闰4月天数,够减
MOV R2,A ;转5月
AJMP M5
RM43: CJNE R3,#00H,RM44
LJMP RY4 ;R2减润4月天数
RM44: MOV A,R2 ;不够减,判断R3为0否
ADD A,R3 ;不为0,R3加到R2中
MOV R2,A ;再让闰4月减
MOV R3,#00H ;还不够转RY4
AJMP RM4
M5: MOV A,R2 ;R2减5月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R6
JB ACC.1,M51
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
M51: JC M52
MOV A,R1 ;R2减5月天数,够减
MOV R2,A
AJMP MM5
M52: CJNE R3,#00H,M53 ;R2减5月天数
LJMP Y5 ;不够减,判断R3为0否
M53: MOV A,R2;不为0,R3加到R2中
ADD A,R3;再让5月减
MOV R2,A ;还不够,则转Y5
MOV R3,#00H
LJMP M5
MM5: LCALL CHECKRE ;查5月,如果不为闰月
CJNE A,#05H,M6 ;转6月
RM5: MOV A,R4
ANL A,#0FH ;R2减闰5月天数
JNZ RM51
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
AJMP RM52
RM51: MOV A,R2
CLR C
SUBB A,#29
MOV R1,A
RM52: JC RM53
MOV A,R1 ;R2减闰5月天数,够减
MOV R2,A ;转6月
LJMP M6
RM53: CJNE R3,#00H,RM54
LJMP RY5 ;R2减润5月天数
RM54: MOV A,R2 ;不够减,判断R3为0否
ADD A,R3 ;不为0,R3加到R2中
MOV R2,A ;再让闰5月减
MOV R3,#00H ;还不够转RY5
LJMP RM5
M6: MOV A,R2 ;R2减6月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R6
JB ACC.0,M61
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
M61: JC M62
MOV A,R1 ;R2减6月天数,够减
MOV R2,A
AJMP MM6
M62: CJNE R3,#00H,M63 ;R2减6月天数
LJMP Y6 ;不够减,判断R3为0否
M63: MOV A,R2;不为0,R3加到R2中
ADD A,R3;再让6月减
MOV R2,A ;还不够,则转Y6
MOV R3,#00H
AJMP M6
MM6: LCALL CHECKRE ;查6月,如果不为闰月
CJNE A,#06H,M7 ;转7月
RM6: MOV A,R4
ANL A,#0FH ;R2减闰6月天数
JNZ RM61
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
AJMP RM62
RM61: MOV A,R2
CLR C
SUBB A,#29
MOV R1,A
RM62: JC RM63
MOV A,R1 ;R2减闰6月天数,够减
MOV R2,A ;转7月
LJMP M7
RM63: CJNE R3,#00H,RM64
LJMP RY6 ;R2减润6月天数
RM64: MOV A,R2 ;不够减,判断R3为0否
ADD A,R3 ;不为0,R3加到R2中
MOV R2,A ;再让闰6月减
MOV R3,#00H ;还不够转RY6
LJMP RM6
M7: MOV A,R2 ;R2减7月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R5
JB ACC.6,M71
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
M71: JC M72
MOV A,R1 ;R2减7月天数,够减
MOV R2,A
AJMP MM7
M72: CJNE R3,#00H,M73 ;R2减7月天数
LJMP Y7 ;不够减,判断R3为0否
M73: MOV A,R2;不为0,R3加到R2中
ADD A,R3;再让7月减
MOV R2,A ;还不够,则转Y7
MOV R3,#00H
AJMP M7
MM7: LCALL CHECKRE ;查7月,如果不为闰月
CJNE A,#07H,M8 ;转8月
RM7: MOV A,R4
ANL A,#0FH ;R2减闰7月天数
JNZ RM71
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
LJMP RM72
RM71: MOV A,R2
CLR C
SUBB A,#29
MOV R1,A
RM72: JC RM73
MOV A,R1 ;R2减闰7月天数,够减
MOV R2,A ;转8月
LJMP M8
RM73: CJNE R3,#00H,RM74
LJMP RY7 ;R2减润5月天数
RM74: MOV A,R2 ;不够减,判断R3为0否
ADD A,R3 ;不为0,R3加到R2中
MOV R2,A ;再让闰7月减
MOV R3,#00H ;还不够转RY7
LJMP RM7
M8: MOV A,R2 ;R2减8月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R5
JB ACC.5,M81
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
M81: JC M82
MOV A,R1 ;R2减8月天数,够减
MOV R2,A
LJMP M9 ;转9月
M82: CJNE R3,#00H,M83 ;R2减8月天数
LJMP Y8 ;不够减,判断R3为0否
M83: MOV A,R2;不为0,R3加到R2中
ADD A,R3;再让8月减
MOV R2,A ;还不够,则转Y8
MOV R3,#00H
LJMP M8
M9: MOV A,R2 ;R2减9月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R5
JB ACC.4,M91
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
M91: JC M92
MOV A,R1 ;R2减9月天数,够减
MOV R2,A
LJMP MM9
M92: CJNE R3,#00H,M93 ;R2减9月天数
LJMP Y9 ;不够减,判断R3为0否
M93: MOV A,R2;不为0,R3加到R2中
ADD A,R3;再让9月减
MOV R2,A ;还不够,则转Y7
MOV R3,#00H
LJMP M9
MM9: LCALL CHECKRE ;查7月,如果不为闰月
CJNE A,#09H,M10 ;转10月
RM9: MOV A,R4
ANL A,#0FH ;R2减闰9月天数
JNZ RM91
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
LJMP RM92
RM91: MOV A,R2
CLR C
SUBB A,#29
MOV R1,A
RM92: JC RM93
MOV A,R1 ;R2减闰9月天数,够减
MOV R2,A ;转10月
LJMP M10
RM93: CJNE R3,#00H,RM94
LJMP RY9 ;R2减润9月天数
RM94: MOV A,R2 ;不够减,判断R3为0否
ADD A,R3 ;不为0,R3加到R2中
MOV R2,A ;再让闰9月减
MOV R3,#00H ;还不够转RY9
LJMP RM9
M10: MOV A,R2 ;R2减10月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R5
JB ACC.2,M101
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
M101: JC M102
MOV A,R1 ;R2减10月天数,够减
MOV R2,A
LJMP M11 ;转11月
M102: CJNE R3,#00H,M103 ;R2减10月天数
LJMP Y10 ;不够减,判断R3为0否
M103: MOV A,R2;不为0,R3加到R2中
ADD A,R3;再让10月减
MOV R2,A ;还不够,则转Y10
MOV R3,#00H
LJMP M10
M11: MOV A,R2 ;R2减11月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R5
JB ACC.1,M111
MOV A,R2
CLR C
SUBB A,#30
MOV R1,A
M111: JC M112
MOV A,R1 ;R2减11月天数,够减
MOV R2,A
LJMP M12
M112: CJNE R3,#00H,M113 ;R2减11月天数
LJMP Y11 ;不够减,判断R3为0否
M113: MOV A,R2;不为0,R3加到R2中
ADD A,R3;再让10月减
MOV R2,A ;还不够,则转Y10
MOV R3,#00H
LJMP M11
M12: MOV A,R2 ;R2减12月天数
CLR C
SUBB A,#29
MOV R1,A
MOV A,R5
JB ACC.0,M121
CLR C
MOV A,R2
SUBB A,#30
MOV R1,A
M121: CJNE R3,#00H,M122 ;R2减12月天数
LJMP Y12 ;不够减,判断R3为0否
M122: MOV A,R2;不为0,R3加到R2中
ADD A,R3;再让10月减
MOV R2,A ;还不够,则转Y10
MOV R3,#00H
LJMP M12
Y1: MOV A,R2
MOV R0,A ;R2中为日的值
LCALL D_BCD
MOV 56H,A
MOV 57H,#01H
CLR F0 ;非闰月
LJMP S_PLAY
Y2: CJNE R2,#00H,Y21
MOV A,R6 ;R2为0,则为前一月最后一天
MOV 56H,#29H
JB ACC.6,Y22
MOV 56H,#30H
Y22: MOV 57H,#01H
CLR F0
LJMP S_PLAY
Y21: MOV A,R2
MOV R0,A ;R2中为日的值
LCALL D_BCD
MOV 56H,A
MOV 57H,#02H
CLR F0
LJMP S_PLAY
RY2: CJNE R2,#00H,RY21
MOV 56H,#29H ;R2为0,则为前一月最后一天
MOV A,R6
JB ACC.5,RY22
MOV 56H,#30H
RY22: MOV 57H,#02H
CLR F0
LJMP S_PLAY
RY21: MOV A,R2 ;R2中为日的值
MOV R0,A
LCALL D_BCD
MOV 56H,A
MOV 57H,#02H
SETB F0 ;闰月
LJMP S_PLAY
Y3: CJNE R2,#00H,Y31
LCALL CHECKRE;查前一个月是否为闰月
CJNE A,#02H,Y32
MOV 56H,#29H ;前一个月是闰月
MOV A,R4
ANL A,#0FH ;R2中为0,则为前一个月的最后一天
JNZ Y33
MOV 56H,#30H
MOV 57H,#02H
SETB F0
LJMP S_PLAY
Y33: MOV 57H,#02H
SETB F0
LJMP S_PLAY
Y32: MOV 56H,#29H ;前一个月不是闰月
MOV A,R6
JB ACC.5,Y34
MOV 56H,#30H
Y34: MOV 57H,#02H
CLR F0
LJMP S_PLAY
Y31: MOV A,R2
MOV R0,A ;R2中为日的值
LCALL D_BCD
MOV 56H,A
MOV 57H,#03H
CLR F0
LJMP S_PLAY
RY3: CJNE R2,#00H,RY31
MOV 56H,#29H ;R2为0,则为前一月最后一天
MOV A,R6
JB ACC.4,RY32
MOV 56H,#30H
RY32: MOV 57H,#03H
CLR F0
LJMP S_PLAY
RY31: MOV A,R2 ;R2中为日的值
MOV R0,A
LCALL D_BCD
MOV 56H,A
MOV 57H,#03H
SETB F0 ;闰月
LJMP S_PLAY
Y4: CJNE R2,#00H,Y41
LCALL CHECKRE;查前一个月是否为闰月
CJNE A,#03H,Y42
MOV 56H,#29H ;前一个月是闰月
MOV A,R4
ANL A,#0FH ;R2中为0,则为前一个月的最后一天
JNZ Y43
MOV 56H,#30H
MOV 57H,#03H
SETB F0
LJMP S_PLAY
Y43: MOV 57H,#03H
SETB F0
LJMP S_PLAY
Y42: MOV 56H,#29H ;前一个月不是闰月
MOV A,R6
JB ACC.4,Y44
MOV 56H,#30H
Y44: MOV 57H,#03H
CLR F0
LJMP S_PLAY
Y41: MOV A,R2
MOV R0,A ;R2中为日的值
LCALL D_BCD
MOV 56H,A
MOV 57H,#04H
CLR F0
LJMP S_PLAY |
|