新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機的萬年歷匯編語言程序

        單片機的萬年歷匯編語言程序

        作者: 時間:2012-05-09 來源:網絡 收藏

        ;真正的:84bytes的51ASM

        ;==SUB_WNL=====*******
        SJDATA30H;世紀BCD00TO99
        NHDATA31H;年號BCD00TO990000TO9999年
        YFDATA32H;月份BCD01TO12

        org000h
        MOVSP,#40H
        MOVSJ,#21H;2004-05
        MOVNH,#01H
        MOVYF,#4H
        ACALLSUB_WNL
        SJMP$

        ;===============SUB_WNL===================
        ;入口:
        ;SJDATA30H;世紀BCD00TO99
        ;NHDATA31H;年號BCD00TO990000TO9999年
        ;YFDATA32H;月份BCD01TO12
        ;出口
        ;ACC--本月天數BCD28to31
        ;B--本月1日的星期數1to6==星期1to星期6
        ;0--星期日
        ;使用:ACC,B,R5,R6
        ;STACK:3bytes(不包括調用)
        ORG50H


        SUB_WNL:
        PUSHPSW
        MOVA,SJ
        ACALLBCD2BIN_MOD4
        ;x400年:(大周期)
        ;=146097天=7*20871+0天
        ;x100年:
        ;000年=7*0+0+1-11=0*2+1****
        ;100年=7*5217+7+1-22=1*2
        ;200年=7*10435+7+1-44=2*2
        ;300年=7*15653+7+1-66=3*2
        ;{1,2,4,6}
        MOVA,R6;A=R6=SJ_BINMOD4
        RLCA;A=A*2+CA={1,2,4,6}****
        XRLA,#10000111B;A=87H-A;邊界調整
        MOVR5,A;A={86H,85H,83H,81H};R5:星期
        MOVA,NH
        JZWNL_1
        ACALLBCD2BIN_MOD4
        XCHA,R5
        SUBBA,R5;0年;0=0+0+1+(-1)***
        MOVR5,A

        WNL_1:
        MOVA,YF
        ADDA,#(WNL_TAB-$-4)
        MOVCA,@A+PC
        MOVR6,A

        SWAPA
        ACALLWNL_F0;大年對>=3月調整準備
        ADDCA,R5;月調整
        MOVB,#7
        DIVAB;B=AMOD7

        MOVA,R6
        ACALLWNL_F0;大年調整準備
        ADDCA,#28
        POPPSW
        RET

        WNL_TAB:
        DB3*2+5*32+0;1BIT0:2月標志
        DB0*2+1+1*32+0;2**BIT1..2:月大小
        DB3*2+1*32+16;300:28天
        DB2*2+4*32+16;401:----
        DB3*2+6*32+16;510:30天
        DB2*2+2*32+16;611:31天
        DB3*2+4*32+16;7BIT3:0-----
        DB3*2+7*32+16;8BIT4:0:1/2月
        DB2*2+3*32+16;91:>=3月
        WNL_F0:;6BYTES;大年調整準備
        RRCA;0AH
        ANLA,#07H;0BH
        ;0CH
        ANLC,F0;0DH
        ;0EH
        RET;0FH
        DB3*2+5*32+16;10HBIT5..7:星期調整數
        DB2*2+1*32+16;11H0:---
        DB3*2+3*32+16;12H1-7:調整數

        BCD2BIN_MOD4:
        ;功能:A.1BYTESBCDTOBIN
        ;B.MOD4
        ;C.MUL2
        ;入口:
        ;A:SJORNH
        ;F0:大世紀
        ;出口
        ;ACC--(BIN(A)4)*2-(BIN(A)MOD4)-F0
        ;R6--BIN(A)MOD4
        ;C--IIF((BIN(A)MOD4)=0,1,0)
        ;使用:ACC,B,R6,PSW
        ;STACK:0bytes(不包括調用)

        MOVR6,A;BCD==>BIN
        ANLA,#0F0H;16X+Y==>10X+Y
        SWAPA
        MOVB,#(256-6);(256-6)*X+(16X+Y)
        MULAB;
        ADDA,R6;=256X+(10X+Y)

        MOVR6,A;MOD4
        ANLA,#3
        XCHA,R6;R6=BINMOD4={0,1,2,3}
        ;X4年:3*365+366=7*209+(-2)**
        XRLA,R6;A=(BIN4)
        RRA;A=(BIN4)*2**
        MOVC,F0;大世紀調整
        SUBBA,R6
        ;X1年:
        ;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}
        CJNER6,#1,$+3;C=IIF(R6>=1,0,1)
        MOVF0,C;C=1為大年/大世紀
        RET
        ;-----------------------------
        END;========ENDOFFILE

        本文引用地址:http://www.104case.com/article/171470.htm


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 当阳市| 永和县| 宁化县| 秭归县| 长岭县| 永寿县| 南汇区| 莱西市| 五家渠市| 金坛市| 翁源县| 四子王旗| 太康县| 合川市| 防城港市| 西盟| 志丹县| 镇宁| 中卫市| 贵定县| 海丰县| 蒙山县| 澄迈县| 宜都市| 九江市| 沁源县| 内江市| 驻马店市| 宽甸| 黔江区| 东乌珠穆沁旗| 莱西市| 和田市| 凌源市| 从化市| 大港区| 原平市| 凌云县| 阿坝县| 神木县| 黄龙县|