⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 万年历.asm

📁 一个单片机+实时时钟芯片实现的万年历程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        CALL    DATA1
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN4
        JNB     P1.5,MOVE3
        JNB     P1.6,SET3
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN4
        JNB     P1.5,MOVE3
        JNB     P1.6,SET3;              闪烁实现及按键判断
        AJMP    AA3
MOVE3:  LJMP    MOVE
SET3:   LJMP    SETA
RGAIN4: LJMP    MAIN1
AA3:    MOV     A,#8BH
        CALL    CODE1
        MOV     A,R5;
        ORL     A,#30H;
        CALL    DATA1;                  显示周日
        MOV     A,R2;
        JNB     ACC.7,AA20;             判断24/12制
        JNB     ACC.5,AM1;              判断上/下午
        MOV     A,#0C1H;
        CALL    CODE1;
        MOV     A,#50H;
        CALL    DATA1;
        MOV     A,#4DH;
        CALL    DATA1;                  显示“PM”
        AJMP    AAA1;
AM1:    MOV     A,#0C1H;
        CALL    CODE1;
        MOV     A,#41H;
        CALL    DATA1;
        MOV     A,#4DH;
        CALL    DATA1;                  显示“AM”
AAA1:   MOV     A,#0C4H
        CALL    CODE1;                  DD RAM地址设置
        JB      BIT2,AAA2;
        MOV     A,#20H
        CALL    DATA1
        CALL    DATA1
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN5
        JNB     P1.5,MOVE4
        JNB     P1.6,SET4
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN5
        JNB     P1.5,MOVE4
        JNB     P1.6,SET4;              闪烁实现及按键判断
        AJMP    AAA2
MOVE4:  LJMP    MOVE
SET4:   LJMP    SETA
RGAIN5: LJMP    MAIN1
AAA2:   MOV     A,#0C4H
        CALL    CODE1
        MOV     A,R2;
        ANL     A,#10H;
        SWAP    A;
        ORL     A,#30H;
        CALL    DATA1;
        MOV     A,R2;
        ANL     A,#0FH;
        ORL     A,#30H;
        CALL    DATA1;                  显示时
        AJMP    DOT;
AA20:   JB      BIT2,AA2;
        MOV     A,#0C4H
        CALL    CODE1
        MOV     A,#20H
        CALL    DATA1
        CALL    DATA1
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN6
        JNB     P1.5,MOVE5
        JNB     P1.6,SET5
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN6
        JNB     P1.5,MOVE5
        JNB     P1.6,SET5;              闪烁实现及按键判断
        AJMP    AA2
MOVE5:  LJMP    MOVE
SET5:   LJMP    SETA
RGAIN6: LJMP    MAIN1
AA2:    MOV     A,#0C4H
        CALL    CODE1
        MOV     A,R2;
        ANL     A,#0F0H;
        SWAP    A;
        ORL     A,#30H;
        CALL    DATA1;
        MOV     A,R2;
        ANL     A,#0FH;
        ORL     A,#30H;
        CALL    DATA1;                  显示时
DOT:    MOV     A,#3AH;
        CALL    DATA1;                  显示双间隔点
        JB      BIT1,AA1;
        MOV     A,#20H
        CALL    DATA1
        CALL    DATA1
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN7
        JNB     P1.5,MOVE6
        JNB     P1.6,SET6
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN7
        JNB     P1.5,MOVE6
        JNB     P1.6,SET6;              闪烁实现及按键判断
        AJMP    AA1
MOVE6:  LJMP    MOVE
SET6:   LJMP    SETA
RGAIN7: LJMP    MAIN1
AA1:    MOV     A,#0C7H
        CALL    CODE1
        MOV     A,R1;
        ANL     A,#0F0H;
        SWAP    A;
        ORL     A,#30H;
        CALL    DATA1;
        MOV     A,R1;
        ANL     A,#0FH;
        ORL     A,#30H;
        CALL    DATA1;                  显示分
        MOV     A,#3AH;
        CALL    DATA1;                  显示双间隔点
        JB      BIT0,AA0;
        MOV     A,#20H
        CALL    DATA1
        CALL    DATA1
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN8
        JNB     P1.5,MOVE7
        JNB     P1.6,SET7
        CALL    D100MS
        CALL    DIMS
        JNB     P1.4,RGAIN8
        JNB     P1.5,MOVE7
        JNB     P1.6,SET7;              闪烁实现及按键判断
        AJMP    AA0
MOVE7:  LJMP    MOVE
SET7:   LJMP    SETA
RGAIN8: LJMP    MAIN1
AA0:    MOV     A,#0CAH
        CALL    CODE1
        MOV     A,R0;
        ANL     A,#70H;                 最终显示:
        SWAP    A;                      ================
        ORL     A,#30H;                 02.05.02  *4 #01
        CALL    DATA1;                   AM 01:50:40
        MOV     A,R0;                   ================
        ANL     A,#0FH;
        ORL     A,#30H;
        CALL    DATA1;                  显示秒
        LCALL   D100MS;
        CALL    DIMS;
        JNB     P1.4,RGAIN0
        JNB     P1.5,MOVE
        JNB     P1.6,SETA
        CALL    D100MS
        CALL    DIMS
A0:     JNB     P1.5,MOVE;              S3,闪烁选择
        JNB     P1.6,SETA;              S4,时间设置
        JNB     P1.4,RGAIN0;            S2,定时写入
        LJMP    AA;                     回显示
RGAIN0: LJMP    MAIN1
MOVE:   JB      BIT0,BB1;
        SETB    BIT0;
        CLR     BIT1;
        LJMP    AA;
BB1:    JB      BIT1,BB2;
        SETB    BIT1;
        CLR     BIT2;
        LJMP    AA;
BB2:    JB      BIT2,BB3;
        SETB    BIT2;
        CLR     BIT3;
        LJMP    AA;
BB3:    JB      BIT3,BB4;
        SETB    BIT3;
        CLR     BIT4;
        LJMP    AA;
BB4:    JB      BIT4,BB5;
        SETB    BIT4;
        CLR     BIT5;
        LJMP    AA;
BB5:    JB      BIT5,BB6;
        SETB    BIT5;
        CLR     BIT6;
        LJMP    AA;
BB6:    SETB    BIT6;
        CLR     BIT0;
        LJMP    AA;
SETA:   JB      BIT6,MONTH;             年
        MOV     A,R6;
        LCALL   BCDH;
        MOV     R6,A;
        MOV     A,#62H;
        CLR     C;
        SUBB    A,R6;
        JC      YA0;                    判断有无溢出
        INC     R6;
        MOV     A,R6;
        LCALL   HBCD;
        MOV     R6,A;                   加一
        AJMP    YA1;
YA0:    MOV     R6,#00H;                重新设置
YA1:    MOV     A,R0
        PUSH    A
        MOV     A,R6;
        MOV     R0,A;
        MOV     A,#09H;
        LCALL   DSIN;                   设置的值写入DS12887
        POP     A
        MOV     R0,A
        LJMP    AA;                     回显示
MONTH:  JB      BIT5,DATE;              月
        MOV     A,R4;
        LCALL   BCDH;
        MOV     R4,A;
        MOV     A,#0BH;
        CLR     C;
        SUBB    A,R4;
        JC      MA0;                     判断有无溢出
        INC     R4;
        MOV     A,R4;
        LCALL   HBCD;
        MOV     R4,A;                    加一
        AJMP    MA1;
MA0:    MOV     R4,#01H;                 重新设置
MA1:    MOV     A,R0
        PUSH    A
        MOV     A,R4;
        MOV     R0,A;
        MOV     A,#08H;
        LCALL   DSIN;                    设置的值写入DS12887
        POP     A
        MOV     R0,A
        LJMP    AA;
DATE:   JB      BIT4,WEEK;               日
        MOV     A,R3;
        LCALL   BCDH;
        MOV     R3,A;
        MOV     A,#1EH;
        CLR     C;
        SUBB    A,R3;
        JC      DA0;                     判断有无溢出
        INC     R3;
        MOV     A,R3;
        LCALL   HBCD;
        MOV     R3,A;                   加一
        AJMP    DA1;
DA0:    MOV     R3,#01;                 重新设置
DA1:    MOV     A,R0
        PUSH    A
        MOV     A,R3;
        MOV     R0,A;
        MOV     A,#07H;
        LCALL   DSIN;                   设置的值写入DS12887
        POP     A
        MOV     R0,A
        LJMP    AA;
WEEK:   JB      BIT3,HOUR;              周日
        MOV     A,R5;
        LCALL   BCDH;
        MOV     R5,A;
        MOV     A,#06H;
        CLR     C;
        SUBB    A,R5;
        JC      WA0;                    判断有无溢出
        INC     R5;
        MOV     A,R5;
        LCALL   HBCD;
        MOV     R5,A;                   加一
        AJMP    WA1;
WA0:    MOV     R5,#01H;                重新设置
WA1:    MOV     A,R0
        PUSH    A
        MOV     A,R5;
        MOV     R0,A;
        MOV     A,#06H;
        LCALL   DSIN;                   设置的值写入DS12887
        POP     A
        MOV     R0,A
        LJMP    AA;
HOUR:   JB      BIT2,MINE1;             时
        AJMP    MINE2
MINE1:  LJMP    MINUTE
MINE2:  MOV     A,R2;
        JNB     ACC.7,HM24;             24时制?
        JNB     ACC.5,HAM;              上午?
        CJNE    A,#10110010B,HPM1;      下午12时?
        MOV     R2,#10100001B;          变成下午1时
        LJMP    HA1;                    返回显示
HPM1:   ANL     A,#1FH;                 PM
        LCALL   BCDH;
        MOV     R2,A;
        MOV     A,#0AH;
        CLR     C;
        SUBB    A,R2;
        JC      HPM0;                   判断有无溢出
        INC     R2;
        MOV     A,R2;
        LCALL   HBCD;
        SETB    ACC.7;
        SETB    ACC.5;
        MOV     R2,A;                   加一
        LJMP    HA1;
HPM0:   MOV     R2,#00H;                PM--->24
        CALL    CLRDP
        LJMP    HA1;
HAM:    CJNE    A,#10010010B,HAM1;      上午12时?
        MOV     R2,#10000001B;          变成上午1时
        LJMP    HA1;                    返回显示
HAM1:   ANL     A,#1FH;                 AM
        LCALL   BCDH;
        MOV     R2,A;
        MOV     A,#0AH;
        CLR     C;
        SUBB    A,R2;
        JC      HAM0;                   判断有无溢出
        INC     R2;
        MOV     A,R2;
        LCALL   HBCD;
        SETB    ACC.7;
        MOV     R2,A;                    加一
        LJMP    HA1;
HAM0:   MOV     R2,#10110010B;           AM--->PM
        LJMP    HA1;
HM24:   LCALL   BCDH;                    24
        MOV     R2,A;
        MOV     A,#16H;
        CLR     C;
        SUBB    A,R2;
        JC      HA0;                    判断有无溢出
        INC     R2;
        MOV     A,R2;
        LCALL   HBCD;
        MOV     R2,A;                   加一
        LJMP    HA1;
HA0:    MOV     R2,#10010010B;          24--->AM
HA1:    MOV     A,R2;
        MOV     R0,A;
        MOV     A,#04H;
        LCALL   DSIN;                    改变后的值写入DS12887
        LJMP    AA;
MINUTE: JB      BIT1,SECOND;             分
        MOV     A,R1;
        LCALL   BCDH;
        MOV     R1,A;
        MOV     A,#3AH;
        CLR     C;
        SUBB    A,R1;
        JC      MIA0;                   判断有无溢出
        INC     R1;
        MOV     A,R1;
        LCALL   HBCD;
        MOV     R1,A;                   加一
        AJMP    MIA1;
MIA0:   MOV     R1,#00H;                重新设置
MIA1:   MOV     A,R0
        PUSH    A
        MOV     A,R1;
        MOV     R0,A;
        MOV     A,#02H;
        LCALL   DSIN;                   改变后的值写入DS12887
        POP     A
        MOV     R0,A
        LJMP    AA;
SECOND: MOV     R0,#00H;                秒
        MOV     A,#00H;
        LCALL   DSIN;                   清0后写入DS12887
        LJMP    AA;


;单字节BCD码整数转换成单字节十六进制整数子程序
;(待转换的单字节BCD码整数在累加器A中)
;(转换后的单字节十六进制整数仍在累加器A中)
BCDH:    MOV     B,#10H;                 分离十位和个位
         DIV     AB;
	 MOV     R7,B;                   暂存个位
	 MOV     B,#10;                  将十位转换成十六进制
         MUL     AB;
         ADD     A,R7;                   按十六进制加上个位
	 RET


;单字节十六进制整数转换成单字节BCD码整数子程序
;(待转换的单字节十六进制整数在累加器A中)
;(转换后的BCD码整数<十位和个位>仍在累加器A中,百位在R7中)
HBCD:    MOV    B,#100;                 分离出百位,存放在R7中
	 DIV    AB;
	 MOV    R7,A;
	 MOV    A,#10;                   余数继续分离十位和个位
	 XCH    A,B;
	 DIV    AB;
	 SWAP   A;
	 ORL    A,B;                     将十位和个位拼装成BCD码
         RET


;延时100MS子程序
D100MS:  MOV      A,R6;
         PUSH     A;
         MOV      R6,#64H;
DD1:     MOV      R7,#64H;                   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -