万年历,源码1
2021/6/13 12:24:35
本文主要是介绍万年历,源码1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
;***************************** ;* 万年历程序 * ;***************************** ;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 MINTUE 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,#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 MINTUE,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,MINTUE ;分分离,送显示缓存 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 LCALL GENGXIN ;更新农历程序 JNB P1.1,SETG JNB F0,SSS CLR P1.3 ;闰月,则p1.3清0,指示灯亮 LJMP MAIN1 SSS: SETB P1.3 ;非闰月,则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 ;允许写1302 LCALL WRITE MOV DS1302_ADDR,#80H MOV DS1302_DATA,#80H ;1302停止振荡 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 ;年加1 LCALL ADD1 MOV 66H,A CJNE A,#51H,GADDYEAR1 MOV 66H,#01H GADDYEAR1: MOV DS1302_ADDR,#8CH ;年值送1302 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 ;调月时闪标志 GWAIT2: LCALL DISPLAY JNB P1.1,GWAIT2 SETG3: LCALL DISPLAY JNB P1.1,SETG4 JNB P1.2,GADDMONTH AJMP SETG3 GADDMONTH: MOV R7,65H ;月加1 LCALL ADD1 MOV 65H,A CJNE A,#13H,GADDMONTH1 MOV 65H,#01H GADDMONTH1: MOV DS1302_ADDR,#88H ;月值送1302 MOV DS1302_DATA,65H LCALL WRITE MOV R0,65H LCALL DIVIDE ;月分离送显示缓冲 MOV 79H,R1 MOV 49H,R1 MOV 7AH,R2 MOV 4AH,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 ;日加1 LCALL ADD1 MOV 63H,A CJNE A,#32H,GADDDAY1 MOV 63H,#01H GADDDAY1: MOV DS1302_ADDR,#86H ;日值送1302 MOV DS1302_DATA,63H LCALL WRITE MOV R0,63H LCALL DIVIDE ;日分离送显示缓冲 MOV 76H,R1 MOV 46H,R1 MOV 77H,R2 MOV 47H,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 ;星期加1 LCALL ADD1 MOV 64H,A CJNE A,#08H,GADDWEEK1 MOV 64H,#01H GADDWEEK1: MOV DS1302_ADDR,#8AH ;星期值送1302 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 ;小时加1 LCALL ADD1 MOV 62H,A CJNE A,#24H,GADDHOUR1 MOV 62H,#00H GADDHOUR1: MOV DS1302_ADDR,#84H ;小时值送1302 MOV DS1302_DATA,62H LCALL WRITE MOV R0,62H LCALL DIVIDE ;小时分离送显示缓冲 MOV 74H,R1 MOV 44H,R1 MOV 75H,R2 MOV 45H,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,GADDMINTUE AJMP SETG11 GADDMINTUE: MOV R7,61H ;分加1 LCALL ADD1 MOV 61H,A CJNE A,#60H,GADDMINTUE1 MOV 61H,#00H GADDMINTUE1: MOV DS1302_ADDR,#82H ;分值送1302 MOV DS1302_DATA,61H LCALL WRITE MOV R0,61H LCALL DIVIDE ;分分离送显示缓冲 MOV 72H,R1 MOV 42H,R1 MOV 73H,R2 MOV 43H,R2 WAITT6: LCALL DISPLAY JNB P1.2,WAITT6 AJMP SETG11 SETGOUT: LCALL DISPLAY JNB P1.1,SETGOUT LCALL GENGXIN 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 NOP 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 ;********************************* ;* 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 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 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 MOV 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 AJMP 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 AJMP 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 AJMP MM9 ;转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 AJMP 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 AJMP 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 AJMP 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,M93 ;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 MOV A,R2 CLR C 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 RY4: CJNE R2,#00H,RY41 MOV 56H,#29H ;R2为0,则为前一月最后一天 MOV A,R6 JB ACC.2,RY42 MOV 56H,#30H RY42: MOV 57H,#04H CLR F0 LJMP S_PLAY RY41: MOV A,R2 ;R2中为日的值 MOV R0,A LCALL D_BCD MOV 56H,A MOV 57H,#04H SETB F0 ;闰月 LJMP S_PLAY Y5: CJNE R2,#00H,Y51 LCALL CHECKRE ;查前一个月是否为闰月 CJNE A,#04H,Y52 MOV 56H,#29H ;前一个月是闰月 MOV A,R4 ANL A,#0FH ;R2中为0,则为前一个月的最后一天 JNZ Y53 MOV 56H,#30H MOV 57H,#04H SETB F0 LJMP S_PLAY Y53: MOV 57H,#04H SETB F0 LJMP S_PLAY Y52: MOV 56H,#29H ;前一个月不是闰月 MOV A,R6 JB ACC.2,Y44 MOV 56H,#30H Y54: MOV 57H,#04H CLR F0 LJMP S_PLAY Y51: MOV A,R2 MOV R0,A ;R2中为日的值 LCALL D_BCD MOV 56H,A MOV 57H,#05H CLR F0 LJMP S_PLAY RY5: CJNE R2,#00H,RY51 MOV 56H,#29H ;R2为0,则为前一月最后一天 MOV A,R6 JB ACC.1,RY52 MOV 56H,#30H RY52: MOV 57H,#05H CLR F0 LJMP S_PLAY RY51: MOV A,R2 ;R2中为日的值 MOV R0,A LCALL D_BCD MOV 56H,A MOV 57H,#05H SETB F0 ;闰月 LJMP S_PLAY Y6: CJNE R2,#00H,Y61 LCALL CHECKRE ;查前一个月是否为闰月 CJNE A,#05H,Y62 MOV 56H,#29H ;前一个月是闰月 MOV A,R4 ANL A,#0FH ;R2中为0,则为前一个月的最后一天 JNZ Y63 MOV 56H,#30H MOV 57H,#05H SETB F0 LJMP S_PLAY Y63: MOV 57H,#05H SETB F0 LJMP S_PLAY Y62: MOV 56H,#29H ;前一个月不是闰月 MOV A,R6 JB ACC.1,Y64 MOV 56H,#30H Y64: MOV 57H,#05H CLR F0 LJMP S_PLAY Y61: MOV A,R2 MOV R0,A ;R2中为日的值 LCALL D_BCD MOV 56H,A MOV 57H,#06H CLR F0 LJMP S_PLAY RY6: CJNE R2,#00H,RY61 MOV 56H,#29H ;R2为0,则为前一月最后一天 MOV A,R6 JB ACC.0,RY62 MOV 56H,#30H RY62: MOV 57H,#06H CLR F0 LJMP S_PLAY RY61: MOV A,R2 ;R2中为日的值 MOV R0,A LCALL D_BCD MOV 56H,A MOV 57H,#06H SETB F0 ;闰月 LJMP S_PLAY Y7: CJNE R2,#00H,Y71 LCALL CHECKRE ;查前一个月是否为闰月 CJNE A,#06H,Y72 MOV 56H,#29H ;前一个月是闰月 MOV A,R4 ANL A,#0FH ;R2中为0,则为前一个月的最后一天 JNZ Y73 MOV 56H,#30H MOV 57H,#06H SETB F0 LJMP S_PLAY Y73: MOV 57H,#06H SETB F0 LJMP S_PLAY Y72: MOV 56H,#29H ;前一个月不是闰月 MOV A,R6 JB ACC.0,Y74 MOV 56H,#30H Y74: MOV 57H,#06H CLR F0 LJMP S_PLAY Y71: MOV A,R2 MOV R0,A ;R2中为日的值 LCALL D_BCD MOV 56H,A MOV 57H,#07H CLR F0 LJMP S_PLAY RY7: CJNE R2,#00H,RY71 MOV 56H,#29H ;R2为0,则为前一月最后一天 MOV A,R6 JB ACC.6,RY72 MOV 56H,#30H RY72: MOV 57H,#07H CLR F0 LJMP S_PLAY RY71: MOV A,R2 ;R2中为日的值 MOV R0,A LCALL D_BCD MOV 56H,A MOV 57H,#07H SETB F0 ;闰月 LJMP S_PLAY Y8: CJNE R2,#00H,Y81 LCALL CHECKRE ;查前一个月是否为闰月 CJNE A,#07H,Y82 MOV 56H,#29H ;前一个月是闰月 MOV A,R4 ANL A,#0FH ;R2中为0,则为前一个月的最后一天 JNZ Y83 MOV 56H,#30H MOV 57H,#07H SETB F0 LJMP S_PLAY Y83: MOV 57H,#07H SETB F0 LJMP S_PLAY Y82: MOV 56H,#29H ;前一个月不是闰月 MOV A,R6 JB ACC.6,Y84 MOV 56H,#30H Y84: MOV 57H,#07H CLR F0 LJMP S_PLAY Y81: MOV A,R2 MOV R0,A ;R2中为日的值 LCALL D_BCD MOV 56H,A MOV 57H,#08H CLR F0 LJMP S_PLAY Y9: CJNE R2,#00H,Y91 MOV 56H,#29H MOV A,R5 JB ACC.5,Y94 MOV 56H,#30H Y94: MOV 57H,#08H CLR F0 LJMP S_PLAY Y91: MOV A,R2 MOV R0,A ;R2中为日的值 LCALL D_BCD MOV 56H,A MOV 57H,#09H CLR F0 LJMP S_PLAY RY9: CJNE R2,#00H,RY91 MOV 56H,#29H ;R2为0,则为前一月最后一天 MOV A,R5 JB ACC.4,RY92 MOV 56H,#30H RY92: MOV 57H,#09H CLR F0 LJMP S_PLAY RY91: MOV A,R2 ;R2中为日的值 MOV R0,A LCALL D_BCD MOV 56H,A MOV 57H,#09H SETB F0 ;闰月 LJMP S_PLAY Y10: CJNE R2,#00H,Y101 LCALL CHECKRE ;查前一个月是否为闰月 CJNE A,#09H,Y102 MOV 56H,#29H ;前一个月是闰月 MOV A,R4 ANL A,#0FH ;R2中为0,则为前一个月的最后一天 JNZ Y103 MOV 56H,#30H MOV 57H,#09H SETB F0 LJMP S_PLAY Y103: MOV 57H,#09H SETB F0 LJMP S_PLAY Y102: MOV 56H,#29H ;前一个月不是闰月 MOV A,R5 JB ACC.4,Y104 MOV 56H,#30H Y104: MOV 57H,#09H CLR F0 LJMP S_PLAY Y101: MOV A,R2 MOV R0,A ;R2中为日的值 LCALL D_BCD MOV 56H,A MOV 57H,#010H CLR F0 LJMP S_PLAY Y11: CJNE R2,#00H,Y111 MOV 56H,#29H MOV A,R5 JB ACC.2,Y112 MOV 56H,#30H Y112: MOV 57H,#10H CLR F0 LJMP S_PLAY Y111: MOV A,R2 MOV R0,A ;R2中为日的值 LCALL D_BCD MOV 56H,A MOV 57H,#11H CLR F0 LJMP S_PLAY Y12: CJNE R2,#00H,Y121 MOV 56H,#29H MOV A,R5 JB ACC.1,Y122 MOV 56H,#30H Y122: MOV 57H,#11H CLR F0 LJMP S_PLAY Y121: MOV A,R2 MOV R0,A ;R2中为日的值 LCALL D_BCD MOV 56H,A MOV 57H,#12H CLR F0 LJMP S_PLAY S_PLAY: MOV R0,57H LCALL DIVIDE ;月分离送显示缓存 MOV 52H,R1 MOV 53H,R2 MOV R0,56H LCALL DIVIDE ;日分离送显示缓存 MOV 50H,R1 MOV 51H,R2 RET ;******************************** ;* 查是否闰月程序 * ;******************************** CHECKRE: MOV A,R4 SWAP A ANL A,#0FH RET ;******************************** ;* 十进制转换为BCD码程序 * ;******************************** D_BCD: MOV A,R0 MOV B,#10 DIV AB SWAP A ORL A,B 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 ;送第1字节 JNB TI,$ CLR TI MOV A,@R1 MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV SBUF,A ;送第2字节 JNB TI,$ CLR TI MOV A,@R1 MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV SBUF,A ;送第3字节 JNB TI,$ CLR TI INC R0 INC R1 INC R3 MOV A,R3 SETB PSW.4 ;选2组寄存器 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 03H,9FH,25H,0DH,99H DB 49H,41H,1FH,01H,09H,0FFH TAB: DB 35,15H,51H,00H,23,11H,52H,41H,42,12H,65H,00H DB 31,11H,32H,00H,21,42H,52H,21H,39,52H,25H,00H DB 28,25H,04H,71H,48,66H,42H,00H,37,33H,32H,00H DB 25,15H,24H,51H,44,05H,52H,00H,33,22H,65H,00H DB 22,21H,25H,41H,40,24H,52H,00H,30,52H,42H,91H DB 49,55H,05H,00H,38,26H,44H,00H,27,53H,50H,60H DB 46,53H,24H,00H,35,25H,54H,00H,24,41H,52H,41H DB 42,45H,25H,00H,31,24H,52H,00H,21,51H,12H,21H DB 40,55H,11H,00H,28,26H,21H,61H,47,26H,61H,00H DB 36,13H,31H,00H,25,05H,31H,51H,43,12H,54H,00H DB 33,51H,25H,00H,22,42H,25H,31H,41,32H,22H,00H DB 30,55H,02H,71H,49,55H,22H,00H,38,26H,62H,00H DB 27,13H,64H,60H,45,13H,32H,00H,34,12H,55H,00H DB 23,10H,53H,51H,42,22H,45H,00H,31,52H,22H,00H DB 21,52H,44H,21H,40,55H,44H,00H,29,26H,50H,71H DB 47,26H,64H,00H,36,25H,32H,00H,25,23H,32H,50H DB 44,44H,55H,00H,32,24H,45H,00H,22,55H,11H,30H END
这篇关于万年历,源码1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南