📄 clock.asm
字号:
RS EQU P3.7
RW EQU P3.6
E EQU P3.5
RAM EQU 30H
RAM2 EQU 34H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP JSQZD;计数器中断
;****************主程序*********************
MAIN:MOV P2,#0FFH
MOV 31H,#24
MOV RAM,#0;设置时间移位缓存
MOV RAM2,#0;设置报警移位缓存
MOV R0,#0;寄存
MOV R1,#0;计数器累加
MOV R2,#0;秒
MOV R3,#0;分
MOV R4,#0;时
MOV R5,#11;报警时间秒
MOV R6,#0;报警时间分
MOV R7,#0;报警时间时
MOV TMOD,#01H
SETB EA
SETB ET0
MOV TH0,#46H;定时初值
MOV TL0,#0CH
SETB TR0
MOV P1,#01H ;清除屏幕
ACALL ENABLE
MOV P1,#38H ;8位点阵
ACALL ENABLE
MOV P1,#0CH ;开显示
ACALL ENABLE
MOV P1,#04H ;移动光标
ACALL ENABLE
;*************时钟显示程序******************
XS:LCALL DISPLAY;显示时间
MOV A,P0;判断设置时间键是否按下
ANL A,#40H;
LP1:JNB P0.6,NX1;等待键打开
CLR TR0;关定时中断
AJMP LP1;等待
NX1:CJNE A,#40H,QQ;无键按下
INC RAM;有键按下,缓存加1
LJMP SJSZ;时间设置子程序
QQ:MOV A,P0;判断设置警报键是否按下
ANL A,#20H
LP2:JNB P0.5,NX2
AJMP LP2
NX2:CJNE A,#20H,AA;无键按下
INC RAM2;有键按下,缓存加1
LJMP BJSZ;报警设置子程序
AA:MOV A,P0;关警报判断
ANL A,#10H
LP3:JNB P0.4,NX3
AJMP LP3
NX3:CJNE A,#10H,NX4;无键按下
MOV P2,#0FFH;有键按下,关警报
NX4:MOV A,R4;比较是否达到定时时间
MOV 27H,R7
CJNE A,27H,XS
MOV A,R3
MOV 26H,R6
CJNE A,26H,XS
MOV A,R2
MOV 25H,R5
CJNE A,25H,XS
MOV P2,#00H;达到设置时间,置P2口为0
AJMP XS;循环显示
;***************时间输出子程序***********************
DISPLAY:MOV P0,#0
MOV P1,#0CBH ;显示位置
ACALL ENABLE
MOV DPTR,#TABLE
MOV B,#10 ;秒显示
MOV A,R2
CJNE A,#60,X1
MOV R2,#0
MOV A,R2
INC R3
X1:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV P1,#3AH
ACALL WRITE
MOV B,#10
MOV A,R3 ;分显示
CJNE A,#60,X2
MOV R3,#0
MOV A,R3
INC R4
X2:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV P1,#3AH
ACALL WRITE
MOV B,#10 ;时显示
MOV A,#01H ;时制选择
ANL A,P0
CJNE A,#01H,XX;24时制
MOV 31H,#12;12时制
MOV A,R4
SUBB A,#12;24转12进制
JC XX1
MOV R4,A
AJMP XX1
XX:
MOV 31H,#24
XX1: MOV A,R4
CJNE A,31H,X3
MOV R4,#0
MOV A,R4
X3:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
RET
;*************时间设置子程序**************
SJSZ:MOV A,RAM;时间设置
CJNE A,#4,N1;判断是否返回
MOV RAM,#0;返回显示
MOV P1,#80H;清显示提示
ACALL ENABLE
MOV P1,#20H
ACALL WRITE
SETB TR0;开计数器中断
LJMP XS
N1:
CJNE A,#1,XGM;跳转分设置
XGS: MOV P1,#80H;秒设置
LCALL ENABLE;显示提示
MOV P1,#53H
LCALL WRITE
LCALL PD1;判断按键
INC R2
AJMP XGS
XGM:MOV A,RAM;分设置
CJNE A,#2,XGH;跳转时设置
MOV P1,#80H
LCALL ENABLE
MOV P1,#4DH
LCALL WRITE
LCALL PD1;判断按键
INC R3
AJMP XGM
XGH:MOV P1,#80H;时设置
LCALL ENABLE
MOV P1,#48H
LCALL WRITE
LCALL PD1
INC R4
AJMP XGH
RET
;************判断按键子程序1*********************
PD1:MOV A,P0;判断按键
ANL A,#40H
LP6:JNB P0.6,NX6;判断键是否打开
AJMP LP6
NX6:CJNE A,#40H,NN3;没有按下
INC RAM;按下
LJMP SJSZ;返回
NN3:ACALL DISPLAY
MOV A,#80H
ANL A,P0
CJNE A,#80H,PD1;判断是否改变时间
RET
;************输出警报时间子程序****************
DISPLAY2:MOV P0,#0;设置报警时间显示
MOV P1,#0CBH ;显示位置
ACALL ENABLE
MOV DPTR,#TABLE
MOV B,#10 ;秒显示
MOV A,R5
CJNE A,#60,Y1
MOV R5,#0
MOV A,R5
INC R6
Y1:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV P1,#3AH
ACALL WRITE
MOV B,#10
MOV A,R6 ;分显示
CJNE A,#60,Y2
MOV R6,#0
MOV A,R6
INC R7
Y2:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV P1,#3AH
ACALL WRITE
MOV B,#10 ;时显示
MOV A,#01H ;时制选择
ANL A,P0
CJNE A,#01H,yy;24时制
MOV 31H,#12;12时制
MOV A,R7
SUBB A,#12;24转12进制
JC yy1
MOV R7,A
AJMP yy1
yy:
MOV 31H,#24
yy1: MOV A,R7
CJNE A,31H,Y3
MOV R7,#0
MOV A,R7
Y3:DIV AB
MOV R0,A
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL WRITE
MOV A,R2;当前时间保护
CJNE A,#60,c1
MOV R2,#0
INC R3
c1:MOV A,R3
CJNE A,#60,c2
MOV R3,#0
INC R4
c2:
RET
;****************报警时间设置子程序*******************
BJSZ:LCALL DISPLAY2;报警设置子程序,基本与时间设置相同
MOV A,RAM2
CJNE A,#4,N12
MOV RAM2,#0
MOV P1,#80H
ACALL ENABLE
MOV P1,#20H
ACALL WRITE
MOV P1,#0c0H
ACALL ENABLE
MOV P1,#20H
ACALL WRITE
SETB TR0
LJMP XS
N12:
CJNE A,#1,XGM2
XGS2: MOV P1,#80H
LCALL ENABLE
MOV P1,#53H
LCALL WRITE
MOV P1,#0c0H
LCALL ENABLE
MOV P1,#57H
LCALL WRITE
LCALL PD2
INC R5
AJMP XGS2
XGM2:MOV A,RAM2
CJNE A,#2,XGH2
MOV P1,#80H
LCALL ENABLE
MOV P1,#4DH
LCALL WRITE
MOV P1,#0c0H
LCALL ENABLE
MOV P1,#57H
LCALL WRITE
LCALL PD2
INC R6
AJMP XGM2
XGH2:MOV P1,#80H
LCALL ENABLE
MOV P1,#48H
LCALL WRITE
MOV P1,#0c0H
LCALL ENABLE
MOV P1,#57H
LCALL WRITE
LCALL PD2
INC R7
AJMP XGH2
RET
;************判断按键子程序2*********************
PD2:MOV A,P0;判断设置报警按键,与设置时间按键基本相同
ANL A,#20H
LP62:JNB P0.5,NX62
AJMP LP62
NX62:CJNE A,#20H,NN32
INC RAM2
LJMP BJSZ
NN32:ACALL DISPLAY2
MOV A,#80H
ANL A,P0
CJNE A,#80H,PD2
RET
;************记时器中断**************************
JSQZD:INC R1 ;定时器中断
CJNE R1,#21,X;没到1S跳转
INC R2 ;秒加1
MOV R1,#0
X:MOV TH0,#46H
MOV TL0,#0CH
RETI
;************LCD命令程序***********************
WRITE: ;显示命令
SETB RS
CLR RW
CLR E
ACALL DELAY
SETB E
RET
ENABLE: ;送命令
CLR RS
CLR RW
CLR E
ACALL DELAY
SETB E
RET
DELAY: ;延时子程序
mov 32H,#250
d1:mov 33H,#100
d2:djnz 33H,d2
djnz 32H,d1
ret
;*******************LCD码表**********************8
TABLE:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H;显示字符表
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -