当前位置:   article > 正文

设计分享|基于51单片机的万年历(汇编)_单片机写的带有农历的万年历

单片机写的带有农历的万年历

目录

具体功能:

设计介绍

单片机介绍

设计思路

设计内容

仿真图

程序


具体功能:

实现年、月、日、时、分、秒、农历的显示,例如:如图显示的是2001年1月1日,农历12月7日,00点01分23秒。

设计介绍

单片机介绍

51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。

设计思路

文献研究法:搜集整理相关单片机智能手环系统相关研究资料,认真阅读文献,为研究做准备;

调查研究法:通过调查、分析、具体试用等方法,发现单片机智能手环系统的现状、存在问题和解决办法;

比较分析法:比较不同单片机智能手环系统的具体原理,以及同一类传感器性能的区别,分析单片机智能手环系统的研究现状与发展前景;

软硬件设计法:通过软硬件设计实现具体硬件实物,最后测试各项功能是否满足要求。

设计内容

仿真图

本设计利用protues8.7软件实现仿真设计,具体如图。

Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。

程序

本设计由汇编语言编写,主代码具体如下:

TIME_WEEK DATA 52H       ;星期存放单元TIME_YEAR DATA 5DH        ;年份低两位存放单元(BCD码)TIME_MONTH DATA 5EH      ;月份存放单元(BCD码)TIME_DATA DATA 5FH        ;日存放单元(BCD码)YEARH DATA 36H             ;年份高两位YEAR DATA 35H               ;年份低两位存放单元(BCD码)MONTH DATA 34H            ;月份存放单元(BCD码)DAY DATA 33H                ;日存放单元(BCD码)HOUR DATA 32H               ;时存放单元(BCD码)MINUTE DATA 31H            ;分存放单元(BCD码)SEC DATA 30H                ;秒存放单元(BCD码)AAA  BIT P3.0                 ;显示位(74LS164 数据)BBB BIT P3.1                 ;显示脉冲(74LS164时钟)AA BIT P3.3                    ;时间调整按键BB BIT P3.4                    ;加1调整CC BIT P3.5                    ;闹钟调整BL BIT P3.2                    ;闹钟输出 BZ1  BIT  21H.0TIMES    DATA    20H        ;调时标志COM     DATA    P1          ;段码数据ORG 0000H          ;程序执行开始地址LJMP      START  ;跳到标号START执行ORG 0003H          ;外中断0中断程序入口RETI                     ;外中断0中断返回ORG 000BH        ;定时器T0中断程序LJMP      INTT0  ;跳至INTTO执行ORG 0013H        ;外中断1中断程序入口RETI                   ;外中断1中断返回ORG 001BH        ;定时器T1中断程序入口RETIORG 0023H        ;串行中断程序入口地址RETI                    ;串行中断程序返回START:               ;主 程 序                 ;;MOV   R0,#30H          ;清30H-38H共11个内存单元MOV   R7,#9            ;9个字节CLEETE:MOV   @R0,#00H            INC      R0DJNZ    R7,CLEETEMOV    TIMES,#00H       ;清调时标志MOV    TMOD,#01H       ;设T016位定时器MOV    TL0,#0C0H         ;40MS定时初值(T0计时用)MOV    TH0,#63H         ;40MS定时初值MOV  SEC,#0MOV MINUTE,#0HMOV HOUR,#0HMOV DAY,#01HMOV MONTH,#01HMOV YEAR,#01HMOV YEARH,#20HSETB     EA                  ;总中断开放SETB     ET0                 ;允许T0中断SETB     TR0                 ;开启T0定时器MOV     R4,#19          ;1秒定时用(40MS×25START1:CALL      DISP              ;调用显示子程序JNB      AA,SETMM1    ;P3.3口为0时转时间调整程序JMP     START1           ;P3.3口为1时跳回START1SETMM1:    CALL       SETMM         ;调时间调整程序SETMMJMP START1SETMM:                    ;时间调整程序CALL DISPCALL DISPJB AA,SETMMO              ;是干扰跳过SETMM2:JNB AA,SETMM3CLR ET0CLR TR0                         ;关T0中断MOV SEC,#0                 ;秒清零MOV TIMES,#01H           ;分开始调整MOV R0,#MINUTE           ;SETMM4:NOPINC22:CALL OFFL                            ;灭显示CALL INC11                        ;加调整CALL DISPJB AA,INC22CALL DISPJB AA,INC22INC R0MOV A,TIMESRL AMOV TIMES,AJNB TIMES.5,SETMM4        ;继续调整下一数据SETMM12:JNB AA,SETMM11SETMMO:SETB TR0SETB ET0                         ;调整完成开始计时RETSETMM11:CALL DISPJMP SETMM12SETMM3:CALL DISP     JMP SETMM2                ;避免调整时无显示INC11:MOV R3,#40INC111:MOV A,@R0JB BB,INC17ADD A,#1                     ;加1DA ACALL  INC000                 ;数据比较  INC13:JNB BB,INC14INC17:MOV @R0,A                 ;存入调整后的数据CALL DISPDJNZ R3,INC111RETINC14:CALL DISPJMP INC13OFFL:                             ;灭显示MOV 22H,@R0MOV R6,#10OFF1:MOV R7,#10OFF2:MOV @R0,#0AAH         ;放入熄灭码CALL DISPDJNZ R7,OFF2DJNZ R6,OFF1MOV @R0,22HRETINC000:                      ;比较子程序JB TIMES.0,INC001       ;分比较JB TIMES.1,INC002       ;时比较JB TIMES.2,INC003       ;日比较JB TIMES.3,INC004       ;月比较JB TIMES.4,INC005       ;年比较JMP INCOUT                 INC005:CJNE A,#99H,INCOUTMOV A,#00H               ;超过99年为00JMP INCOUTINC004:CJNE A,#13H,INCOUTMOV A,#01H               ;超过12月为1JMP INCOUTINC003:CJNE A,#32H,INCOUTMOV A,#01H               ;超过31天为1JMP INCOUTINC002:CJNE A,#24H,INCOUTMOV A,#00H               ;超过23时为0JMP INCOUTINC001:CJNE A,#60H,INCOUTMOV A,#00H               ;超过59分为0INCOUT:RET                      ;返回INTT0:           ;1秒计时程序              ;;PUSH    ACC               ;累加器入栈保护PUSH     PSW             ;状态字入栈保护ORL      TL0,#0C0H       ;低8位初值修正MOV   TH0,#63H        ;高8位初值修正DJNZ   R4,CLKE111     ;25次中断未到JMP   LOOP11CLKE111:JMP   CLKE                  LOOP11:MOV   R4,#19H           ;25次中断到(1秒)重赋初值MOV   A,SEC                ;调整秒ADD   A,#1DA    AMOV   SEC,ACJNE  A,#60H,CLKE99  ;整分否MOV   SEC,#0             ;清秒MOV   A,MINUTE          ;调整分ADD   A,#1DA    AMOV   MINUTE,ACLK0:CJNE  A,#60H,CLKE      ;整点否MOV   MINUTE,#0       ;清分MOV   A,HOUR            ;调整时ADD   A,#1DA    AMOV   HOUR,ACJNE  A,#24H,CLKE     ;零点否MOV   HOUR,#0         ;清时MOV   A,DAY            ;调整日期ADD   A,#1DA    AMOV   DAY,AMOV   A,MONTH         ;查阅本月最大日期INC   AMOVC  A,@A+PCSJMP  CLK1DB 31H,28H,31H       ;对应月份编码:01H,02H,03HDB 30H,31H,30H       ;对应月份编码:04H,05H,06HDB 31H,31H,30H       ;对应月份编码:07H,08H,09HDB 00H,00H,00H       ;对应无效月份编码:0AH,0BH,0CHDB 00H,00H,00H       ;对应无效月份编码:0DH,0EH,0FHDB 31H,30H,31H       ;对应月份编码:10H,11H,12HCLK1:CLR   CSUBB  A,DAYJNC   CLKE                ;本月未满MOV   A,MONTHCJNE  A,#2,CLK3       ;是二月MOV   A,YEARANL   A,#13H           ;保留年份中非4的整数部分JNB   ACC.4,CLK2ADD   A,#2CLK2:ANL   A,#3             ;能否被4整除JNZ   CLK3             ;非闰年MOV   A,DAYXRL   A,#29HJZ    CLKE              ;闰年二月可以有29CLK3:MOV   DAY,#1          ;调整到下个月的1MOV   A,MONTHADD   A,#1DA    AMOV   MONTH,ACJNE  A,#13H,CLKEMOV   MONTH,#1        ;调整到下一年的一月份MOV   A,YEAR             ;调整年份ADD   A,#1DA    AMOV   YEAR,ACLKE99:CALL  CONVERT         ;农历转换子程序CLKE:                       ;时钟调整完毕,处理其它定时任务POP   PSWPOP   ACC    RETI                  ;完成DISP:     ;显示寄存器处理PUSH  PSWPUSH  ACCMOV   23H,R0         ;保存R0DISP99:MOV   R1,#40H       ;显示寄存器首址MOV   R0,#30H       ;待处理寄存器首址MOV   R2,#9           ;处理N次DISP1:MOV   A,@R0         ;低寄存器1内容存入AANL   A,#0FH MOV   @R1,A         ;将A的值存入显示寄存器1 MOV   A,@R0         ;低寄存器1内容存入ASWAP  AANL   A,#0FH INC   R1                  ;R1地址加1  MOV   @R1,A         ;将A的值存入显示寄存器2DJNZ  R2,DISP2       ;处理完N次,没有地址加1CALL  DISPLAYMOV   R0,23H        POP   ACCPOP   PSWRETDISP2:INC   R1INC   R0JMP   DISP1  DISPLAY:          MOV   R1,#40H       ;指向显示数据首址MOV    R5,#19        ;显示19个数据SETB   AAAPLAY: SETB   BBBNOPCLR    BBB                ;移一位CLR    AAA               ;清零MOV  A,@R1          ;取显示数据到AMOV  DPTR,#TAB     ;取段码表地址MOVC A,@A+DPTR ;查显示数据对应段码MOV   COM,A        ;段码放入P1CALL    DL1MS         ;显示1MSMOV   COM,#0FFH  ;P1口复位DJNZ   R5,PLAY1  CLR    BBBSETB   AAA RET                      ;返回PLAY1:INC    R1              ;显示下一位JMP    PLAYTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0A3H,8EH,0ABHDL1MS:MOV   25H,R7MOV   24H,R6      ;保存R6,R7MOV   R7,#20DS1:MOV   R6,#10DJNZ  R6,$DJNZ  R7,DS1MOV   R7,25HMOV   R6,24HRETSTART_YEAR EQU 01CONVERT_YEAR DATA 5CHCONVERT_MONTH DATA 38H ;BIT71 表示闰月CONVERT_DATE DATA 37HTEMP_BYTE1 DATA 57HTEMP_BYTE2 DATA 58HTEMP_BYTE3 DATA 59HTEMP_BYTE4 DATA 5AHTEMP_BYTE5 DATA 5BH;以下为公历转农历子程序CONVERT:MOV A,YEARMOV TIME_YEAR,AMOV A,MONTHMOV TIME_MONTH,AMOV A,DAYMOV TIME_DATA,A MOV A,TIME_YEARMOV B,#16DIV ABMOV CONVERT_YEAR,BMOV B,#10MUL ABADD A,CONVERT_YEARMOV CONVERT_YEAR,AMOV A,TIME_MONTHJNB ACC.4,CON_02CLR ACC.4 ;ACC.41 表示大于10ADD A,#10CON_02: MOV CONVERT_MONTH,AMOV A,TIME_DATAMOV B,#16DIV ABMOV CONVERT_DATE,BMOV B,#10MUL ABADD A,CONVERT_DATEMOV CONVERT_DATE,AMOV DPTR,#MONTH_DATA MOV A,CONVERT_YEARCON_06: CLR CSUBB A,#START_YEARMOV B,#3 ;表格每年3 字节MUL ABADD A,DPLMOV DPL,AMOV A,BADDC A,DPHMOV DPH,AMOV A,#2MOVC A,@A+DPTR ;读本年表格最后一字节CLR ACC.7 ;ACC.7 是闰年第13 个月大小,在此不用MOV B,#32DIV ABMOV TEMP_BYTE1,A ;春节月份MOV TEMP_BYTE2,B ;春节日; 以下计算当前日期距元旦天数MOV TEMP_BYTE3,#0 ;设距元旦天数高位为0MOV A,CONVERT_MONTHCJNE A,#10,CON_08CON_08: JC CON_09 ;9 月以前日子数小于256 天,高字节为0(9 月份过去的整月为8 个月)MOV TEMP_BYTE3,#1CON_09: MOV A,CONVERT_YEARANL A,#03H ;ACC 为除4 的余数JNZ CON_10 ;转常年处理; 年除4 余数为0 是闰年MOV A,CONVERT_MONTHLCALL GET_RUN_DAYS_LOW ;取得闰年过去月的天数的低字节SJMP CON_12CON_10: MOV A,CONVERT_MONTHLCALL GET_DAYS_LOW ;取得常年过去月的天数的低字节CON_12: MOV B,CONVERT_DATEDEC B ;因为日期从1 日起,而不是0 日起ADD A,B ;过去的整月天数加当月天数MOV TEMP_BYTE4,AJNC CON_14INC TEMP_BYTE3 ;TEMP_BYTE3,TEMP_BYTE4 分别为公历年过去的天数的高低字节; 以下求春节距元旦天数,因肯定小于256 天所以只用一字节表示CON_14: MOV A,TEMP_BYTE1LCALL GET_DAYS_LOW ;春节不会在3 月份,不用考虑闰年DEC A ;因为日期从1 日起ADD A,TEMP_BYTE2MOV TEMP_BYTE5,A ;TEMP_BYTE5,为春节距元旦天数MOV A,CONVERT_MONTHCJNE A,TEMP_BYTE1,CON_20 ;转换月与春节月比较MOV A,CONVERT_DATECJNE A,TEMP_BYTE2,CON_20 ;转换日与春节日比较CON_20: JC CON_22LJMP CON_60 ;当前日大于等于春节日期,公历年与农历年同年份CON_22: MOV A,CONVERT_YEAR ;不到春节,农历年比公历年低一年JNZ CON_24MOV A,#100 ;年有效数0-99CON_24: DEC AMOV CONVERT_YEAR,AMOV A,DPLCLR CSUBB A,#3MOV DPL,AJNC CON_26DEC DPH ;表格指针指向上一年CON_26: MOV A,TEMP_BYTE5CLR CSUBB A,TEMP_BYTE4MOV TEMP_BYTE3,A ;TEMP_BYTE3 中为当前日离春节的天数MOV CONVERT_MONTH,#12 ;农历月为12CLR F0 ;1901-2099 年没有闰12 月,清闰月标志CLR AMOVC A,@A+DPTRANL A,#0F0HSWAP A;MOV TEMP_BYTE4,A ;TEMP_BYTE4 中为闰月JZ CON_30 ;没有闰月转移MOV A,#2 ;有闰月,取第13 个月天数MOVC A,@A+DPTRMOV C,ACC.7MOV A,#1MOVC A,@A+DPTRRLC A ;ACC 中为最后6 个月的大小值SJMP CON_34CON_30: MOV A,#1MOVC A,@A+DPTR ;ACC 中为最后6 个月的大小值CON_34: MOV TEMP_BYTE5,ACON_40: MOV A,TEMP_BYTE5RRC AMOV TEMP_BYTE5,AJC CON_42MOV B,#29 ;小月29SJMP CON_44CON_42: MOV B,#30 ;大月30CON_44: MOV A,TEMP_BYTE3CLR CSUBB A,BJZ CON_46 ;正好够减,就是农历日1JNC CON_50;不够减一月天数,结束农历月调整CPL A ;求补取绝对值INC ACON_46: INC A ;加1 即为农历日MOV B,#10 ;转换并保存农历日,月,年DIV ABSWAP AORL A,BMOV CONVERT_DATE,AMOV A,CONVERT_MONTHMOV B,#10DIV ABSWAP AORL A,BMOV CONVERT_MONTH,AMOV A,CONVERT_YEARMOV B,#10DIV ABSWAP AORL A,BMOV CONVERT_YEAR,ACALL WEEK      ;星期转换子程序?RET ;结束转换CON_50: MOV TEMP_BYTE3,A ;TEMP_BYTE3 存减去一月后的天数JB F0,CON_52 ;是闰月,前推一月,月份不减DEC CONVERT_MONTH;CON_52: MOV A,CONVERT_MONTHCJNE A,TEMP_BYTE4,CON_54CPL F0 ;当前月与闰月相同,更改闰月标志CON_54: SJMP CON_40CON_60: MOV A,TEMP_BYTE4 ;春节日小于当前日,农历年同公历年CLR CSUBB A,TEMP_BYTE5MOV TEMP_BYTE4,AJNC CON_62DEC TEMP_BYTE3 ;TEMP_BYTE3 TEMP_BYTE4 中为公历日离春节的天数CON_62: MOV CONVERT_MONTH,#1 ;农历月为1CLR AMOVC A,@A+DPTRMOV TEMP_BYTE5,AANL A,#0F0HSWAP A;XCH A,TEMP_BYTE5 ;TEMP_BYTE5 中为闰月,ACC 为当年农历表第一字节CLR F0 ;第一个月肯定不是闰月ANL A,#0FHMOV TEMP_BYTE1,AMOV A,#1MOVC A,@A+DPTRMOV TEMP_BYTE2,AANL A,#0F0HORL A,TEMP_BYTE1SWAP AMOV TEMP_BYTE1,AMOV A,#2MOVC A,@A+DPTRMOV C,ACC.7MOV A,TEMP_BYTE2ANL A,#0FHSWAP AMOV ACC.3,C;MOV TEMP_BYTE2,A ;以上TEMP_BYTE1,TEMP_BYTE2BIT 存农历年大小CON_70: MOV A,TEMP_BYTE2RLC AMOV TEMP_BYTE2,AMOV A,TEMP_BYTE1RLC AMOV TEMP_BYTE1,AJC CON_72MOV B,#29 ;小月29 天处理SJMP CON_74CON_72: MOV B,#30 ;大月30CON_74: MOV A,TEMP_BYTE4CLR CSUBB A,BJNC CON_78 ;低字节够减跳转MOV B,A ;低字节不够减, B 暂存减后结果,MOV A,TEMP_BYTE3JZ CON_76 ;高字节为0,不够减DEC TEMP_BYTE3MOV TEMP_BYTE4,BSJMP CON_80CON_76: MOV A,TEMP_BYTE4 ;不够减结束月调整LJMP CON_46 ;转日期加1 后,处理并保存转换后农历年月日CON_78: MOV TEMP_BYTE4,A ;TEMP_BYTE3 TEMP_BYTE4 天数为减去一月后天数CON_80: MOV A,CONVERT_MONTHCJNE A,TEMP_BYTE5,CON_82CPL F0 ;当前月与闰月相同,更改闰月标志JNB F0,CON_82 ;更改标志后是非闰月,月份加1SJMP CON_70CON_82: INC CONVERT_MONTH;SJMP CON_70GET_DAYS_LOW:MOVC A,@A+PC ;取得常年过去月的天数的低字节RETDB 0,31,59,90,120,151,181,212,243,17,48,78GET_RUN_DAYS_LOW:MOVC A,@A+PC ;取得闰年过去月的天数的低字节RETDB 0,31,60,91,121,152,182,213,244,18,49,79MONTH_DATA:;公历年对应的农历数据,每年三字节,;格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小;第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小;月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天).;第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日DB 04DH,04AH,0B8H; 2001DB 00DH,04AH,04CH; 2002DB 00DH,0A5H,041H; 2003DB 025H,0AAH,0B6H; 2004DB 005H,06AH,049H; 2005DB 07AH,0ADH,0BDH; 2006DB 002H,05DH,052H; 2007DB 009H,02DH,047H; 2008DB 05CH,095H,0BAH; 2009DB 00AH,095H,04EH; 2010DB 00BH,04AH,043H; 2011DB 04BH,055H,037H; 2012DB 00AH,0D5H,04AH; 2013DB 095H,05AH,0BFH; 2014DB 004H,0BAH,053H; 2015DB 00AH,05BH,048H; 2016DB 065H,02BH,0BCH; 2017DB 005H,02BH,050H; 2018DB 00AH,093H,045H; 2019DB 047H,04AH,0B9H; 2020DB 006H,0AAH,04CH; 2021DB 00AH,0D5H,041H; 2022DB 024H,0DAH,0B6H; 2023DB 004H,0B6H,04AH; 2024DB 069H,057H,03DH; 2025DB 00AH,04EH,051H; 2026DB 00DH,026H,046H; 2027DB 05EH,093H,03AH; 2028DB 00DH,053H,04DH; 2029DB 005H,0AAH,043H; 2030DB 036H,0B5H,037H; 2031DB 009H,06DH,04BH; 2032DB 0B4H,0AEH,0BFH; 2033DB 004H,0ADH,053H; 2034DB 00AH,04DH,048H; 2035DB 06DH,025H,0BCH; 2036DB 00DH,025H,04FH; 2037DB 00DH,052H,044H; 2038DB 05DH,0AAH,038H; 2039DB 00BH,05AH,04CH; 2040DB 005H,06DH,041H; 2041DB 024H,0ADH,0B6H; 2042DB 004H,09BH,04AH; 2043DB 07AH,04BH,0BEH; 2044DB 00AH,04BH,051H; 2045DB 00AH,0A5H,046H; 2046DB 05BH,052H,0BAH; 2047DB 006H,0D2H,04EH; 2048DB 00AH,0DAH,042H; 2049DB 035H,05BH,037H; 2050DB 009H,037H,04BH; 2051DB 084H,097H,0C1H; 2052DB 004H,097H,053H; 2053DB 006H,04BH,048H; 2054DB 066H,0A5H,03CH; 2055DB 00EH,0A5H,04FH; 2056DB 006H,0B2H,044H; 2057DB 04AH,0B6H,038H; 2058DB 00AH,0AEH,04CH; 2059DB 009H,02EH,042H; 2060DB 03CH,097H,035H; 2061DB 00CH,096H,049H; 2062DB 07DH,04AH,0BDH; 2063DB 00DH,04AH,051H; 2064DB 00DH,0A5H,045H; 2065DB 055H,0AAH,0BAH; 2066DB 005H,06AH,04EH; 2067DB 00AH,06DH,043H; 2068DB 045H,02EH,0B7H; 2069DB 005H,02DH,04BH; 2070DB 08AH,095H,0BFH; 2071DB 00AH,095H,053H; 2072DB 00BH,04AH,047H; 2073DB 06BH,055H,03BH; 2074DB 00AH,0D5H,04FH; 2075DB 005H,05AH,045H; 2076DB 04AH,05DH,038H; 2077DB 00AH,05BH,04CH; 2078DB 005H,02BH,042H; 2079DB 03AH,093H,0B6H; 2080DB 006H,093H,049H; 2081DB 077H,029H,0BDH; 2082DB 006H,0AAH,051H; 2083DB 00AH,0D5H,046H; 2084DB 054H,0DAH,0BAH; 2085DB 004H,0B6H,04EH; 2086DB 00AH,057H,043H; 2087DB 045H,027H,038H; 2088DB 00DH,026H,04AH; 2089DB 08EH,093H,03EH; 2090DB 00DH,052H,052H; 2091DB 00DH,0AAH,047H; 2092DB 066H,0B5H,03BH; 2093DB 005H,06DH,04FH; 2094DB 004H,0AEH,045H; 2095DB 04AH,04EH,0B9H; 2096DB 00AH,04DH,04CH; 2097DB 00DH,015H,041H; 2098DB 02DH,092H,0B5H; 2099DB 00DH,053H,049H; 2100;以下子程序用于从当前公历日期,推算星期,;入口:TIME_YEAR,TIME_MONTH ,TIME_DATA ,定义公历年月日,BCD 码,其中月的;以下子程序用于从当前公历日期,推算星期,;入口:TIME_YEAR,TIME_MONTH ,TIME_DATE ,定义公历年月日,BCD 码,其中月的;年份存入R5,月份存入R6,日期存入R7(BCD码)TIME_WEEK1 DATA 52HWEEK:MOV A,TIME_YEARMOV B,#16DIV ABMOV TEMP_BYTE1,BMOV B,#10MUL ABADD A,TEMP_BYTE1MOV TEMP_BYTE1,A ;TEMP_BYTE1=MOV A,TIME_MONTHJB ACC.7,GETW02MOV A,#100ADD A,TEMP_BYTE1MOV TEMP_BYTE1,A ;20 世纪年+100MOV A,TIME_MONTHCLR ACC.7GETW02: JNB ACC.4,GETW04ADD A,#10CLR ACC.4GETW04: MOV TEMP_BYTE2,A ;TEMP_BYTE2=MOV A,TIME_DATAMOV B,#16DIV ABMOV TEMP_BYTE3,BMOV B,#10MUL ABADD A,TEMP_BYTE3MOV TEMP_BYTE3,A ;TEMP_BYTE3=MOV A,TEMP_BYTE1;ANL A,#03HJNZ GETW10 ;非闰年转移MOV A,TEMP_BYTE2CJNE A,#3,GETW06GETW06: JNC GETW10 ;月大于2 转移DEC TEMP_BYTE3 ;份小于等于2,又是闰年,日减1GETW10: MOV A,TEMP_BYTE2;LCALL GET_CORRECT ;取月校正表数据ADD A,TEMP_BYTE1MOV B,#7DIV AB ;B 放年加校正日数之和后除7 的余数不先做这一步;有可能数据溢出MOV A,TEMP_BYTE1ANL A,#0FCHRR ARR A ;以上年除4 即闰年数ADD A,BADD A,TEMP_BYTE3MOV B,#7DIV ABMOV A,BCJNE A,#0,OUTOUTMOV  B,#8OUTOUT:               ;星期日显示8MOV TIME_WEEK1,BRETGET_CORRECT:MOVC A,@A+PCRETDB 0,3,3,6,1,4,6,2,5,0,3,5ENDGET_CORRECT:MOVC A,@A+PCRETDB 0,3,3,6,1,4,6,2,5,0,3,5END
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/859437
推荐阅读
相关标签
  

闽ICP备14008679号