📄 万年历.asm
字号:
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 + -