📄 万年历.asm
字号:
BIT7 EQU 3FH
BIT6 EQU 3EH
BIT5 EQU 3DH
BIT4 EQU 3CH
BIT3 EQU 3BH
BIT2 EQU 3AH
BIT1 EQU 39H
BIT0 EQU 38H
ORG 0000H
AJMP MAIN
ORG 30H
MAIN: MOV SP,70H
;初始化 DS12887
MOV DPTR,#7F0AH; 寄存器A的地址
MOV A,#70H; DV2~DV0=111,分频复位
MOVX @DPTR,A;
INC DPTR; 到寄存器B地址
MOV A,#8AH; 停止更新,允许更新中断,选BCD码,24小时制
MOVX @DPTR,A;
MOV DPL,#00H; 秒单元地址
CLR A; 00秒
MOVX @DPTR,A;
MOV DPL,#02H; 分单元地址
CLR A;00分
MOVX @DPTR,A;
MOV DPL,#04H; 时单元地址
MOV A,#09H; 9时
MOVX @DPTR,A;
MOV DPL,#07H; 日单元地址
MOV A,#01H; 1日
MOVX @DPTR,A;
MOV DPL,#08H; 到月地址
MOV A,#01H; 1月
MOVX @DPTR,A;
INC DPTR; 到年单元地址
MOV A,#98H; 1998年
MOVX @DPTR,A;
INC DPTR; 到寄存器A地址
MOV A,#26H; DV2~DV0=010 RS3~RS0=0110
MOVX @DPTR,A; 选中断周期为976.5625μs,允许方波输出,频率1kHz
INC DPTR; 到寄存器B
MOV A,#1AH; 每秒更新一次,允许方波输出,24小时制,BCD码的数据
MOVX @DPTR,A; 时钟开始运行
MOV R0,#16H;
MOV @R0,#00H; 设计地址为 00H:年月日,01H:时分秒
CALL INST; 液晶初始化
CALL CLRDP
CALL D1S; 并保持1秒
RGAIN: CALL CLRDP; 清屏
MAIN1: CALL GAIN; 读取时间
CALL DISPLAY; 显示
A13: CALL D100MS
JNB P1.3,SET10; 如有按键P1.3按下,则进入更改时间子程序
AJMP MAIN1; 回显示
SET10: LJMP S21;
;液晶初始化子程序
INST: MOV R7,#4
INST1: MOV A,#38H; 5X7X2
ACALL CODE1
ACALL DIMS1
DJNZ R7,INST1
MOV A,#06H; 光标以增量方式移动,整体显示不移动
ACALL CODE1
ACALL DIMS1
MOV A,#0CH; 显示开,光标关,光标位不闪烁
ACALL CODE1
ACALL DIMS1
ACALL CLRDP
ACALL DIMS1
RET
;清屏子程序
CLRDP: MOV A,#01H; 送指令
ACALL RDBUSY; 读忙标志
ACALL CODE1; 不忙,则操作
RET
;向显示屏发送A中的命令
CODE1: NOP
ACALL RDBUSY; 读忙标志
NOP
CLR P3.4; R/W置0
CLR P3.5; RS置0
SETB P2.0; E置1,选中
MOV P0,A; 送指令
CLR P2.0; 在下降沿写入
SETB P3.4
RET
;延时5ms子程序
DIMS1: MOV R6,#5
DLAY2: MOV R5,#64H
DLAY3: NOP
NOP
NOP
NOP
DJNZ R5,DLAY3
DJNZ R6,DLAY2
RET
;读忙标志子程序
RDBUSY: PUSH ACC; 显示屏不忙则返回,否则一直等待
CLR P2.0
CLR P3.5
SETB P3.4
RBS: SETB P2.0
MOV A,P0
CLR P2.0
RLC A
JC RBS
CLR P2.0
POP ACC
RET
;向显示屏发送A中的数据显示子程序
DATA1: NOP;
ACALL RDBUSY; 读忙标志
NOP
CLR P3.4
SETB P3.5
SETB P2.0
MOV P0,A
CLR P2.0; 在下降沿写入
SETB P3.4
RET
;时间读取子程序
;依次从DS12887读出年、周日、月、日、时、分、秒
;对应的存入R6、R5、R4、R3、R2、R1、R0中(BCD码形式)
;查询方式读出数据
GAIN: MOV DPTR,#7F0AH;
MOVX A,@DPTR;
WAIT: JB ACC,WAIT;
MOV DPL,#00H; 秒地址
MOVX A,@DPTR;
MOV R0,A;
MOV DPL,#02H; 分地址
MOVX A,@DPTR;
MOV R1,A;4
MOV DPL,#04H; 时地址
MOVX A,@DPTR;
MOV R2,A;
MOV DPL,#07H; 日地址
MOVX A,@DPTR;
MOV R3,A;
MOV DPL,#08H; 月地址
MOVX A,@DPTR;
MOV R4,A;
MOV DPL,#06; 周日地址
MOVX A,@DPTR;
MOV R5,A;
MOV DPL,#09H; 年地址
MOVX A,@DPTR;
MOV R6,A;
RET
;当前时间送LCD显示子程序
DISPLAY: MOV A,#10000000B;
CALL CODE1;
MOV A,R5;
ANL A,#11110000B;
SWAP A;
ORL A,#00110000B;
CALL DATA1;
MOV A,R5;
ANL A,#00001111B;
ORL A,#00110000B;
CALL DATA1; 显示年
MOV A,#00101110B;
CALL DATA1; 间隔点
MOV A,R4;
ANL A,#11110000B;
SWAP A;
ORL A,#00110000B;
CALL DATA1;
MOV A,R4;
ANL A,#00001111B;
ORL A,#00110000B;
CALL DATA1; 显示月
MOV A,#00101110B;
CALL DATA1; 间隔点
MOV A,R3;
ANL A,#11110000B;
SWAP A;
ORL A,#00110000B;
CALL DATA1;
MOV A,R3;
ANL A,#00001111B;
ORL A,#00110000B;
CALL DATA1; 显示日
MOV A,#10001010B;
CALL CODE1; DD RAM地址设置
MOV A,#00101010B;
CALL DATA1; 显示*号
MOV A,R2;
JNB ACC.7,M24; 判断24/12制
AM: MOV A,#11000001B;
CALL CODE1;
MOV A,#01000001B;
CALL DATA1;
MOV A,#01001101B;
CALL DATA1; 显示“AM”
M240: MOV A,#11000100B;
CALL CODE1;
MOV A,R2;
ANL A,#00010000B;
SWAP A;
ORL A,#00110000B;
CALL DATA1;
AJMP M241;
M24: MOV A,#11000100B;
CALL CODE1; DD RAM地址设置
MOV A,R2;
ANL A,#11110000B;
SWAP A;
ORL A,#00110000B;
CALL DATA1
M241: MOV A,R2;
ANL A,#00001111B;
ORL A,#00110000B;
CALL DATA1; 显示时
MOV A,#00111010B;
CALL DATA1; 显示双间隔点
MOV A,R1;
ANL A,#11110000B;
SWAP A;
ORL A,#00110000B;
CALL DATA1;
MOV A,R1;
ANL A,#00001111B;
ORL A,#00110000B;
CALL DATA1; 显示分
MOV A,#00111010B;
CALL DATA1; 显示双间隔点
MOV A,R0;
ANL A,#01110000B; 最终显示:
SWAP A; ================
ORL A,#00110000B; 02.05.02 *4 #01
CALL DATA1; AM 01:50:40
MOV A,R0; ================
ANL A,#00001111B;
ORL A,#00110000B;
CALL DATA1; 显示秒
RET
;DS12887数据读出子程序(输入指令在A中,读出数据也在A中)
DSOUT: MOV DPH,#7FH;
MOV DPL,A;
MOVX A,@DPTR
RET
;DS12887数据写入子程序(输入指令在A中,写入数据在R0中)
DSIN: MOV DPH,#7FH;
MOV DPL,A;
MOV A,R0;
MOVX @DPTR,A;
RET
;延时30ms子程序
DIMS: MOV A,R6
PUSH A
MOV R6,#20H
DLAY: MOV R7,#64H
DLAY1: NOP
NOP
NOP
NOP
DJNZ R7,DLAY1
DJNZ R6,DLAY
POP A
MOV R6,A
RET
;延时1s子程序
D1S: MOV R5,#0FFH
D1S2: ACALL DIMS
DJNZ R5,D1S2
RET
;时间设置部分程序
S21: SETB BIT6;
SETB BIT5;
SETB BIT4;
SETB BIT3;
SETB BIT2;
SETB BIT1;
CLR BIT0;
CALL CLRDP; 设定初始显示
AA: LCALL GAIN; 获取当前时间
JB BIT6,AA6;
MOV A,#80H
CALL CODE1
MOV A,#20H
CALL DATA1
CALL DATA1
CALL D100MS
CALL DIMS
JNB P1.4,RGAIN1
JNB P1.5,MOVE0
JNB P1.6,SET0
CALL D100MS
CALL DIMS
JNB P1.4,RGAIN1
JNB P1.5,MOVE0
JNB P1.6,SET0; 闪烁实现及按键判断
AJMP AA6
MOVE0: LJMP MOVE
SET0: LJMP SETA
RGAIN1: LJMP MAIN1
AA6: MOV A,#80H
CALL CODE1
MOV A,R6;
ANL A,#0F0H;
SWAP A;
ORL A,#30H;
CALL DATA1;
MOV A,R6;
ANL A,#0FH;
ORL A,#30H;
CALL DATA1; 显示年
MOV A,#2EH;
CALL DATA1; 间隔点
JB BIT5,AA5;
MOV A,#20H
CALL DATA1
CALL DATA1
CALL D100MS
CALL DIMS
JNB P1.4,RGAIN2
JNB P1.5,MOVE1
JNB P1.6,SET11
CALL D100MS
CALL DIMS
JNB P1.4,RGAIN2
JNB P1.5,MOVE1
JNB P1.6,SET11; 闪烁实现及按键判断
AJMP AA5
MOVE1: LJMP MOVE
SET11: LJMP SETA
RGAIN2: LJMP MAIN1
AA5: MOV A,#83H
CALL CODE1
MOV A,R4;
ANL A,#0F0H;
SWAP A;
ORL A,#30H;
CALL DATA1;
MOV A,R4;
ANL A,#0FH;
ORL A,#30H;
CALL DATA1; 显示月
MOV A,#2EH;
CALL DATA1; 间隔点
JB BIT4,AA4;
MOV A,#20H
CALL DATA1
CALL DATA1
CALL D100MS
CALL DIMS
JNB P1.4,RGAIN3
JNB P1.5,MOVE2
JNB P1.6,SET21
CALL D100MS
CALL DIMS
JNB P1.4,RGAIN3
JNB P1.5,MOVE2
JNB P1.6,SET21; 闪烁实现及按键判断
AJMP AA4
MOVE2: LJMP MOVE
SET21: LJMP SETA
RGAIN3: LJMP MAIN1
AA4: MOV A,#86H
CALL CODE1
MOV A,R3;
ANL A,#0F0H;
SWAP A;
ORL A,#30H;
CALL DATA1;
MOV A,R3;
ANL A,#0FH;
ORL A,#30H;
CALL DATA1; 显示日
MOV A,#8AH;
CALL CODE1; DD RAM地址设置
MOV A,#2AH;
CALL DATA1; 显示*号
JB BIT3,AA3;
MOV A,#20H
CALL DATA1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -