收藏 分销(赏)

单片机万年历程序.doc

上传人:pc****0 文档编号:7775284 上传时间:2025-01-16 格式:DOC 页数:3 大小:27KB 下载积分:10 金币
下载 相关 举报
单片机万年历程序.doc_第1页
第1页 / 共3页
单片机万年历程序.doc_第2页
第2页 / 共3页


点击查看更多>>
资源描述
;真正的万年历: 84 bytes 的 51 ASM ;==SUB_WNL=== 万年历 ==* Deng Miao *  2004-06-01 ***** GuangZhou ******           SJ    DATA   30H ; 世纪  BCD  00 TO 99              NH    DATA   31H ; 年号  BCD  00 TO 99    0000 TO 9999 年           YF    DATA   32H ; 月份  BCD  01 TO 12    org 000h      MOV SP, #40H      MOV SJ, #21H ;2004-05      MOV NH, #01H      MOV YF, #4H         ACALL SUB_WNL      SJMP $    ;===============SUB_WNL===================      ; 入口:         ;  SJ    DATA   30H ; 世纪  BCD  00 TO 99            ;  NH    DATA   31H ; 年号  BCD  00 TO 99    0000 TO 9999 年         ;  YF    DATA   32H ; 月份  BCD  01 TO 12      ; 出口         ; ACC   --  本月天数 BCD 28 to 31         ; B     --  本月1日的星期数 1 to 6 == 星期1 to 星期6         ;                                0 -- 星期日      ; 使用:  ACC, B, R5, R6       ; STACK:  3 bytes (不包括调用)       ORG 50H SUB_WNL:       PUSH PSW       MOV A, SJ        ACALL BCD2BIN_MOD4             ; x 400年: (大周期)        ;       =146097天 = 7 * 20871 + 0 天       ; x 100年:        ; 000年 = 7 * 0     + 0 + 1 - 1       1  =  0 * 2 + 1 ****       ; 100年 = 7 * 5217  + 7 + 1 - 2       2  =  1 * 2        ; 200年 = 7 * 10435 + 7 + 1 - 4       4  =  2 * 2         ; 300年 = 7 * 15653 + 7 + 1 - 6       6  =  3 * 2        ;                                 {1,2,4,6}                     MOV A, R6  ; A=R6= SJ_BIN MOD 4       RLC A   ; A=A*2+C       A =       {1,2,4,6}           ****       XRL A, #10000111B ;     A = 87H - A  ; 边界调整       MOV R5, A         ;     A =   {86H, 85H, 83H, 81H} ; R5: 星期         MOV A, NH         JZ  WNL_1         ACALL BCD2BIN_MOD4         XCH A, R5              SUBB A, R5 ; 0 年 ;  0  =   0 +   0 + 1 + (-1) ***         MOV R5, A WNL_1:       MOV A, YF       ADD A, #(WNL_TAB-$-4)       MOVC A, @A+PC       MOV R6, A               SWAP A       ACALL WNL_F0; 大年对>=3月调整准备       ADDC A, R5  ; 月调整       MOV B, #7       DIV AB      ; B = A MOD 7       MOV A, R6       ACALL WNL_F0; 大年调整准备       ADDC A, #28       POP PSW       RET WNL_TAB:       DB 3*2 + 5 * 32+0 ;1     BIT 0   :  "2月" 标志       DB 0*2+1+1 * 32+0 ;2 **  BIT 1..2: 月大小       DB 3*2 + 1 * 32+16 ;3              00:28 天         DB 2*2 + 4 * 32+16 ;4              01:----        DB 3*2 + 6 * 32+16 ;5              10: 30 天        DB 2*2 + 2 * 32+16 ;6              11: 31 天       DB 3*2 + 4 * 32+16 ;7    BIT 3: 0 -----        DB 3*2 + 7 * 32+16 ;8    BIT 4:  0: 1/2月                       DB 2*2 + 3 * 32+16 ;9            1: >=3月  WNL_F0:        ; 6 BYTES ; 大年调整准备         RRC A            ;0AH          ANL A, #07H      ;0BH                          ;0CH          ANL C, F0        ;0DH                          ;0EH         RET              ;0FH       DB 3*2 + 5 * 32+16 ;10H  BIT 5..7:  星期调整数                 DB 2*2 + 1 * 32+16 ;11H            0:---                DB 3*2 + 3 * 32+16 ;12H          1-7: 调整数  BCD2BIN_MOD4:      ; 功能:A. 1 BYTES BCD TO BIN           ;  B. MOD 4           ;  C. MUL 2       ; 入口:         ;  A  :  SJ OR NH            ;  F0 :  大世纪      ; 出口         ; ACC   --  (BIN(A) \ 4) * 2 - (BIN(A) MOD 4) - F0         ; R6    --  BIN(A) MOD 4         ;  C    --  IIF( (BIN(A) MOD 4)=0, 1, 0 )      ; 使用:  ACC, B, R6, PSW       ; STACK:  0 bytes (不包括调用)       MOV R6, A        ;   BCD ==> BIN        ANL A, #0F0H     ; 16X+Y ==> 10X+Y        SWAP A       MOV B, #(256-6)  ; (256-6)*X + (16X+Y)         MUL AB           ;       ADD A, R6        ; = 256X + (10X+Y)               MOV R6, A        ; MOD4          ANL A, #3       XCH A, R6       ; R6 = BIN MOD 4   = {0,1,2,3}                  ; X 4年:3 * 365 + 366 = 7*209 + (-2) **       XRL A, R6              ; A = (BIN \ 4)       RR A                   ; A = (BIN \4 ) *      2  **       MOV C, F0   ; 大世纪调整       SUBB A, R6        ;X 1 年:                                      ;0 年  0  =   0 +             0 + 1 + (-1) ***             ;1 年 366 = 7*52 +            1 + 1            ;2 年 366 + 365 = 7*104 +     2 + 1            ;3 年 366 + 365 + 365 = 7*156+3 + 1            ;                         {-1,1,2,3}        CJNE R6, #1, $ + 3 ; C = IIF(R6>=1, 0, 1)       MOV F0, C          ; C=1 为大年/大世纪         RET         ;-----------------------------     END ;======== END OF FILE
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服