📄 用1602显示日期和时间.txt
字号:
源程序~~~~
ORG 0000H;
LJMP START;
ORG 000BH;时间定时
AJMP TIME;
ORG 001BH;调时闪烁定时
LJMP SETTIME;
ORG 0030H;
START:
RS EQU P3.7
RW EQU P3.6
E EQU P3.5
MOV P1,#01H;;清除屏幕
ACALL ENABLE
MOV P1,#38H;8位点阵方式
ACALL ENABLE
MOV P1,#0CH;开显示
ACALL ENABLE
MOV P1,#06H;移动光标
ACALL ENABLE
MOV 2AH,#7FH;赋初值
MOV 2CH,#00H;
MOV 20H,#00H;
MOV 21H,#00;
MOV 22H,#00;
MOV 23H,#00;
MOV 24H,#20;
MOV 25H,#01;
MOV 26H,#06;
MOV 43H,#08;
MOV 46H,#00;
MOV R5,#06H;
SETB EA;
SETB ET0;
MOV TMOD,#11H;
MOV TL0,#0B0H;
MOV TH0,#3CH;
MOV TL1,#0B0H;
MOV TH1,#3CH;
SETB TR0;
MOV SP,#50H;
MOV R2,#02H;
MOV R1,#0C6H;
MOV DPTR,#TABLE;
YCL:MOV P1,R1;显示时间\日期的间隔符号
LCALL ENABLE;
MOV A,#3AH;
LCALL WRITE2;
MOV R1,#0C9H;
DJNZ R2,YCL;
MOV R2,#02H;
MOV R1,#87H;
YCL2:MOV P1,R1;
LCALL ENABLE;
MOV A,#2dH;
LCALL WRITE2;
MOV R1,#8AH;
DJNZ R2,YCL2;
MOV R2,#02H;
MOV R1,#83H;
MOV A,#'2';显示年的前两位
YCL3:MOV P1,R1;
LCALL ENABLE;
LCALL WRITE2;
MOV A,#'0';
MOV R1,#84H;
DJNZ R2,YCL3;
LOOP:LCALL DISP;
LCALL KEY;
JZ LOOP;
LCALL ANKEY;
AJMP LOOP;
TIME:
PUSH ACC;
PUSH PSW;
MOV TL0,#0B0H;定时器初始值50ms(50000us)(可以自己更改)
MOV TH0,#3CH;
INC 20H;
MOV A,20H;
CJNE A,#20,RETI1;
MOV 20H,#00H;
MOV A,21H;秒计数
INC A;
MOV 21H,A;
SETB 2AH.2;
CJNE A,#60,RETI1;
MOV 21H,#00H;
MOV A,22H;分计数
INC A;
MOV 22H,A;
SETB 2AH.1;
CJNE A,#60,RETI1;
MOV 22H,#00H;
MOV A,23H;时计数
INC A;
MOV 23H,A;
SETB 2AH.0;
CJNE A,#24,RETI1;
MOV 23H,#00H;
MOV A,24H;日计数
INC A;
MOV 24H,A;
SETB 2AH.3;
CJNE A,40H,RETI1;
MOV 24H,#01;
MOV A,25H;月计数
INC A;
MOV 25H,A;
SETB 2AH.4;
CJNE A,#13,RETI1;
MOV 25H,#01;
MOV A,26H;年计数
INC A;
MOV 26H,A;
SETB 2AH.5;
CJNE A,#99,RETI1;
MOV 26H,#00;
RETI1:
MOV 2CH,#00H;
POP PSW;
POP ACC;
RETI;
NOP
NOP
NOP
;闪动调时程序
SETTIME:
PUSH ACC;
PUSH PSW;
MOV TL1,#0B0H;定时器1赋初值
MOV TH1,#3CH;
DJNZ R5,OUTSET;0.3秒未到,退出
MOV R5,#06H;
MOV A,2CH; ------------------放入相应的闪动熄灭符
JB 2BH.0,SETN;
JB 2BH.1,SETY;
JB 2BH.2,SETR;
JB 2BH.3,SETS;
JB 2BH.4,SETF;
JB 2BH.5,SETM;
AJMP SETOUT;
OUTSET:LJMP SETOUT;
SETN:
ANL A,#01H;
MOV 2CH,A;
CPL 2CH.0;
SETB 2AH.5;
MOV 36H,#20H;
MOV 37H,#20H;
AJMP SETOUT;
SETY:
ANL A,#02H;
MOV 2CH,A;
CPL 2CH.1;
SETB 2AH.5
SETB 2AH.4;
MOV 38H,#20H;
MOV 39H,#20H;
AJMP SETOUT;
SETR:
ANL A,#04H;
MOV 2CH,A;
CPL 2CH.2;
SETB 2AH.4;
SETB 2AH.3;
MOV 4AH,#20H;
MOV 4BH,#20H;
AJMP SETOUT;
SETS:
ANL A,#08H;
MOV 2CH,A;
CPL 2CH.3;
SETB 2AH.3;
SETB 2AH.0;
MOV 30H,#20H;
MOV 31H,#20H;
AJMP SETOUT;
SETF:
ANL A,#16;
MOV 2CH,A;
CPL 2CH.4;
SETB 2AH.0;
SETB 2AH.1;
MOV 32H,#20H;
MOV 33H,#20H;
AJMP SETOUT;
SETM:
ANL A,#32;
MOV 2CH,A;
CPL 2CH.5;
SETB 2AH.1;
SETB 2AH.2;
MOV 34H,#20H;
MOV 35H,#20H;
SETOUT:LCALL DISP;
POP PSW;
POP ACC;
RETI;
NOP
NOP
NOP
;按键检测与处理
KEY:MOV 46H,#00H;
MOV A,P3;
CPL A;
ANL A,#1CH;
JZ KEYOUT1;
LCALL D20MS;
MOV A,P3;
CPL A;
ANL A,#1CH;
MOV 46H,A;
KEEY22:
MOV A,P3;
CPL A;
ANL A,#1CH;
JNZ KEEY22;
KEYOUT1:MOV A,46H;
RET;
KEY2:MOV 46H,#00H;按键检测
MOV A,P3;
CPL A;
ANL A,#1CH;
JZ KEY2;
LCALL D20MS;消抖
MOV A,P3;
CPL A;
ANL A,#1CH;
JZ KEY2;
MOV 46H,A;
KEEY2: ;-------等待按键释放
MOV A,P3;
CPL A;
ANL A,#1CH;
JNZ KEEY2;
ANKEY:; -------------------按键处理
MOV A,46H;
JB ACC.4,L2;-----------是加1键跳转到L2
JB ACC.2,L3;-----------减1键跳转到L3
JB ACC.3,GL_L;
AJMP KEY2;
GL_L:LJMP GL;----------------功能键处理
L2:JB 2BH.0,NJ1;-------------加1键处理
JB 2BH.1,YJ1;
JB 2BH.2,RJ1;
JB 2BH.3,SJ1;
JB 2BH.4,FJ1;
JB 2BH.5,MJ1;
AJMP KEY2;
L3:JB 2BH.0,NJJ1;------------减1键处理
JB 2BH.1,YJJ1;
JB 2BH.2,RJJ10;
JB 2BH.3,SJJ10;
JB 2BH.4,FJJ10;
JB 2BH.5,MJJ10;
AJMP KEY2;
RJJ10:LJMP RJJ1;
SJJ10:LJMP SJJ1;
FJJ10:LJMP FJJ1;
MJJ10:LJMP MJJ1;
NJ1:MOV A,26H;---------------年加1
INC A;
CJNE A,#100,NOUT;
MOV A,#00H;
NOUT:
MOV 26H,A;
SETB 2AH.5;
AJMP KEY2;
YJ1:MOV A,25H;-------------- 月加1
INC A;
CJNE A,#13,YOUT;
MOV A,#01H;
YOUT:
MOV 25H,A;
SETB 2AH.4;
AJMP KEY2;
RJ1:MOV A,24H;----------------日加1
INC A;
CJNE A,40H,ROUT;
MOV A,#01H;
ROUT:
MOV 24H,A;
SETB 2AH.3;
AJMP KEY2;
SJ1:MOV A,23H;---------------时加1
INC A;
CJNE A,#24,SOUT;
MOV A,#00H;
SOUT:
MOV 23H,A;
SETB 2AH.0;
AJMP KEY2;
FJ1:MOV A,22H;---------------分加1
INC A;
CJNE A,#60,FOUT;
MOV A,#00H;
FOUT:
MOV 22H,A;
SETB 2AH.1;
AJMP KEY2;
MJ1:MOV A,21H;--------------秒加1
INC A;
CJNE A,#60,MOUT;
MOV A,#00H;
MOUT:
MOV 21H,A;
SETB 2AH.2;
AJMP KEY2;
NOP
NOP
;-----------------------------------------------------减1键处理----------------
NJJ1:MOV A,26H;
DEC A;
CJNE A,#0FFH,NJJ;
MOV A,#99;
NJJ:
MOV 26H,A;
SETB 2AH.5;
AJMP KEY2;
YJJ1:MOV A,25H;
DEC A;
CJNE A,#00H,YJJ;
MOV A,#12;
YJJ:
MOV 25H,A;
SETB 2AH.4;
AJMP KEY2;
RJJ1:MOV A,24H;
DEC A;
CJNE A,#00H,RJJ;
MOV A,40H;
RJJ:
MOV 24H,A;
SETB 2AH.3;
AJMP KEY2;
SJJ1:MOV A,23H;
DEC A;
CJNE A,#0FFH,SJJ;
MOV A,#23;
SJJ:
MOV 23H,A;
SETB 2AH.0;
AJMP KEY2;
FJJ1:MOV A,22H;
DEC A;
CJNE A,#0FFH,FJJ;
MOV A,#59;
FJJ:
MOV 22H,A;
SETB 2AH.1;
AJMP KEY2;
MJJ1:MOV A,21H;
DEC A;
CJNE A,#0FFH,MJJ;
MOV A,#59;
MJJ:
MOV 21H,A;
SETB 2AH.2;
AJMP KEY2;
;-----------------功能键处理----------------------
GL:CLR ET0;
CLR TR0;
SETB ET1;
SETB TR1;
JB 2BH.0,YTZ;
JB 2BH.1,RTZ;
JB 2BH.2,STZ;
JB 2BH.3,FTZ;
JB 2BH.4,MTZ;
JB 2BH.5,KEYOUT;
NTZ:MOV 2BH,#01H;
AJMP KEY2;
YTZ:MOV 2BH,#02H;
AJMP KEY2;
RTZ:MOV 2BH,#04H;
AJMP KEY2;
STZ:MOV 2BH,#08H;
AJMP KEY2;
FTZ:MOV 2BH,#16;
AJMP KEY2;
MTZ:MOV 2BH,#32;
AJMP KEY2;
KEYOUT:;------------------按键退出
CLR ET1;
CLR TR1;
MOV 2AH,#7FH;
MOV 2BH,#00H;
MOV 2CH,#00H;
SETB ET0;
SETB TR0;
RET;
NOP
NOP
DISP:MOV DPTR,#TABLE;
JNB 2AH.5,Y_CL;年更新缓存?
MOV A,26H;
MOV B,#04;计算是否闰年
DIV AB;
MOV A,B;
JZ NCL;
MOV 41H,#29;不是闰年2月有28天
AJMP NYX;
NCL:MOV 41H,#30;闰年2月有29天
NYX:MOV A,26H;
MOV B,#10;
DIV AB;
JB 2CH.0,NSD; 年显示是否熄灭
MOV 36H,A;
MOV 37H,B;
NSD:
CLR 2AH.5;
MOV R4,#02;
MOV R0,#86H;
MOV A,37H;
NCL1:MOV P1,R0;
ACALL ENABLE;
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,36H;
DEC R0;
DJNZ R4,NCL1;
Y_CL:JNB 2AH.4,RCL;月更新缓存?
MOV A,25H;
CJNE A,#02,Y_CL_1;不是二月,跳转Y_CL2
MOV 40H,41H;把2月份天数送到40H,
AJMP SYY;
Y_CL_1: MOV A,25H;8月以上双月31天,8月以下单月31天
CLR C;
SUBB A,43H;
JC DXCL;
SETB 2AH.7;
AJMP Y_CL2;
DXCL: CLR 2AH.7;8月以上2AH.7=0..
Y_CL2:
JB 2AH.7,SY2; 计算是大月还是小月(31天还是30天)
MOV A,25H;
MOV B,#02;
DIV AB;
MOV A,B;
JZ XY30;双月跳转
AJMP DY31;
SY2:
MOV A,25H;
MOV B,#02;
DIV AB;
MOV A,B;
JZ DY31;双月跳转
AJMP XY30;
DY31:MOV 40H,#32;有31天
AJMP SYY;
XY30:MOV 40H,#31;30天
SYY:JB 2CH.1,YSD;
MOV A,25H;
MOV B,#10;
DIV AB;
MOV 38H,A;
MOV 39H,B;
YSD: CLR 2AH.4;
MOV R4,#02;
MOV R0,#89H;
MOV A,39H;
Y_CL1:MOV P1,R0;
ACALL ENABLE;
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,38H;
DEC R0;
DJNZ R4,Y_CL1;
RCL:JNB 2AH.3,SCL;日更新缓存?
JB 2CH.2,RSD;
MOV A,24H;
MOV B,#10;
DIV AB;
MOV 4AH,A;
MOV 4BH,B;
RSD:CLR 2AH.3;
MOV R4,#02;
MOV R0,#8CH;
MOV A,4BH;
RCL1:MOV P1,R0;
ACALL ENABLE;
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,4AH;
DEC R0;
DJNZ R4,RCL1;
SCL:JNB 2AH.0,FCL;时更新缓存?
JB 2CH.3,SSD;
MOV A,23H;
MOV B,#10;
DIV AB;
MOV 31H,B;
MOV 30H,A;
SSD:CLR 2AH.0;
MOV R4,#02H;
MOV R0,#0C5H;显示位置
MOV A,31H;
SCL1:MOV P1,R0;
ACALL ENABLE
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,30H;
DEC R0;
DJNZ R4,SCL1;
FCL:JNB 2AH.1,MCL;分更新缓存?
JB 2CH.4,FSD;
MOV A,22H;
MOV B,#10;
DIV AB;
MOV 33H,B;
MOV 32H,A;
FSD:CLR 2AH.1;
MOV A,33H;
MOV R0,#0C8H;显示位置
MOV R4,#02H;
FCL1:MOV P1,R0;
ACALL ENABLE
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,32H;
DEC R0;
DJNZ R4,FCL1;
MCL:
JNB 2AH.2,NEXTX;秒更新缓存?
JB 2CH.5,MSD;
MOV A,21H;
MOV B,#10;
DIV AB;
MOV 35H,B;
MOV 34H,A;
MSD:CLR 2AH.2;
MOV R0,#0CBH;显示位置
MOV R4,#02H;
MOV A,35H;
MCL1:MOV P1,R0;
ACALL ENABLE
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,34H;
DEC R0;
DJNZ R4,MCL1;
NEXTX: RET
NOP
NOP
WRITE2:
mov p1,a
setb rs
clr rw
clr e
call delay
setb e
ret
;写指令子程序
ENABLE:
CLR RS
CLR RW
CLR E
ACALL DELAY
SETB E
RET
delay:
mov r7,#25
d1: mov r6,#255
d2: djnz r6,$
djnz r7,d1
ret
D20MS: MOV R7,#25;
D11: MOV R6,#30;
DJNZ R6,$;
DJNZ R7,D11;
RET;
TABLE: DB '0123456789'
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -