📄 电子钟.txt
字号:
电子钟
程序及操作指南:程序写入上电后,将在四个数码管
上显示0000,然后每隔一分钟,数码管将从低位跳变,该
程序模拟的就是时钟。用按键数显键可将时间调至正确时
间。按按键数键一下,数码管将在低位闪烁,然后依次按
一下,数码管的闪烁位置就向前移一个数码管,按到第五
下时,退出。将对应的数码管按闪烁以后,长按按键数显
键,数码管将会显示从1至9,显示到所需时间,松开按键
数显键,数码管显示对应所设时间,程序也会记下这个值。
例设置成2334,
即晚上11点34分。设置步骤如下:按键一下长按至
数码管分低显示到4时松开按键一下长按至
数码管分高位显示到3时松开按键一下长按
至数码管时低位显示到3时松开按键一下长
按至数码管时高位显示到2时松开。
注意:如果小时设置超过23,数码管将显示ERR(错
误),再按一下键恢恢复。
程序实例(clock.asm):
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT ;外中断0入口
ORG 000BH
AJMP DIN0 ;定时器0入口
MAIN:
92
DISML EQU 30H
DISMH EQU 31H
DISHL EQU 32H
DISHH EQU 33H ;显示分,时的个时位
TFLAG EQU 34H ;时间秒标志,判是否到50
个0.2秒,即50*0.2=1秒
SETFLAG EQU 35H ;设置标志,依次从个位到
十位到百位到千位
ADDFLAG EQU 36H
MFLAG EQU 37H ;时间分标志,判是否到60
个一秒,即一分
MOV DISML,#00H
MOV DISMH,#00H
MOV DISHL,#00H
MOV DISHH,#00H ;显示分,时的个时位初值
MOV TFLAG,#00H ;时间秒标志初值
MOV SETFLAG,#00H ;设置标志初值
MOV ADDFLAG,#00H ;设数加标志
MOV MFLAG,#00H ;时间分标志
MOV SCON,#00H ;串行口工作于方式0(同
步移位)
MOV TMOD,#00000001B;定时器0工作于方式1
MOV TL0,#0EEH
MOV TH0,#31H ;设定时时间为0.05秒,定
时20次则一秒
SETB EA ;开总中断
SETB ET0 ;开定时器0中断允许
SETB EX0 ;开外中断0允许
93
SETB TR0 ;开定时0运行
SETB IT0 ;外中断0下降沿触发
DIS:
ACALL DISPLAY ;调用显示时钟程序
AJMP CRITERION ;调判断程序,按键是否按
了。
; ACALL DELAY
; AJMP DIS
DIN0:
PUSH ACC
;设置时是否出错,比如小时设到超过了23//////////
MOV A,DISHH
CJNE A,#02H,INCC
MOV A,DISHL
CLR C
SUBB A,#04H
JC INCC
MOV SETFLAG,#06H
AJMP RE
;/////////////////////////////////////////////
;是否到一秒///////////////////////////////////
INCC: INC TFLAG
MOV A,TFLAG
CJNE A,#19,RE
MOV TFLAG,#00H
;/////////////////////////////////////////////
;是否到一分///////////////////////////////////
INC MFLAG
94
MOV A,MFLAG
CJNE A,#60,RE
MOV MFLAG,#00H
;/////////////////////////////////////////////
;计分/////////////////////////////////////////
INC DISML
MOV A,DISML
CJNE A,#0AH,RE
MOV DISML,#00H
INC DISMH
MOV A,DISMH
CJNE A,#06H,RE
MOV DISMH,#00H
;/////////////////////////////////////////////
;计时/////////////////////////////////////////
;计时分两种情况,分为小时的高位到2和没到2,没到2时时
低位是逢10进位,到2后,时低位到4则全归0
MOV A,DISHH
CJNE A,#02H,HJ
;/////////////////////////////////////////////
;第一种情况///////////////////////////////////
INC DISHL
MOV A,DISHL
CJNE A,#04H,RE
MOV DISHL,#00H
MOV DISHH,#00H
AJMP RE
;/////////////////////////////////////////////
95
;第二种情况///////////////////////////////////
HJ: INC DISHL
MOV A,DISHL
CJNE A,#0AH,RE
MOV DISHL,#00H
INC DISHH
;/////////////////////////////////////////////
RE:
MOV TL0,#0EEH
MOV TH0,#31H ;设定时时间为0.02秒,定
时50次则一秒
POP ACC
RETI ;退出中断
INT:
PUSH ACC
JB P3.2,EXIT
MOV R3,#0FFH
DJNZ R3,$
JB P3.2,EXIT ;判键抖
MOV A,SETFLAG
CJNE A,#00H,ADD2
AJMP SETKEY
ADD2: CJNE A,#06H,B0 ;是错误了吗,是的,去恢
复
MOV SETFLAG,#00H
AJMP SETKEY
B0: MOV R4,#15H
ADD1: JB P3.2,SETKEY
96
ACALL DELAY
DJNZ R4,ADD1
MOV ADDFLAG,#01H
AJMP EXIT
;状态增值/////////////////////////////////////
SETKEY: INC SETFLAG
MOV A,SETFLAG
CJNE A,#05H,EXIT
MOV SETFLAG,#00H
;/////////////////////////////////////////////
EXIT:
POP ACC
RETI
;显示时钟/////////////////////////////////////
DISPLAY:
MOV A,DISML
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
CLR TI
MOV A,DISMH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D2: JNB TI,D2
CLR TI
MOV A,DISHL
97
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISHH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
RET
;/////////////////////////////////////////////
;判按键标志///////////////////////////////////
CRITERION:
MOV A,SETFLAG
CJNE A,#00H,ERFLAG ;设置标志为0,即没
有按键,继续去显示
AJMP RET1
ERFLAG: CJNE A,#06H,SETML1 ;设置标志为6,即错
误了,去显示错误
AJMP ERR
SETML1: CJNE A,#01H,SETMH1
AJMP SETML ;设置标志为1,显示
设分低
SETMH1: CJNE A,#02H,SETHL1
AJMP SETMH ;设置标志为2,显示
设分高
98
SETHL1: CJNE A,#03H,SETHH1
AJMP SETHL ;设置标志为3,显示
设时低
SETHH1: CJNE A,#04H,RET1 ;设置标志为5,是退
出标志
AJMP SETHH ;设置标志为4,显示
设时高
RET1: SETB TR0
ACALL DELAY
AJMP DIS
;/////////////////////////////////////////////
;设分低(分低位闪烁)/////////////////////////
SETML:
CLR TR0
MOV A,ADDFLAG
CJNE A,#01H,SETML2 ;是否按下了2秒钟,
是就开始闪烁设置
JNB P3.2,ADD3
MOV ADDFLAG,#00H ;松开了,清闪标志
AJMP SETML2
ADD3: INC DISML
MOV A,DISML
CJNE A,#0AH,SETML2
MOV DISML,#00H
SETML2: ACALL DELAY2
ACALL DISPLAY
ACALL DELAY2
MOV SBUF,#00H
99
E1: JNB TI,E1
CLR TI
MOV A,DISMH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
E2: JNB TI,E2
CLR TI
MOV A,DISHL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
E3: JNB TI,E3
CLR TI
MOV A,DISHH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
E4: JNB TI,E4
CLR TI
AJMP CRITERION
;//////////////////////////////////////////////////
;设分高(分高位闪烁)////////////////////////////////
SETMH:
CLR TR0
MOV A,ADDFLAG
CJNE A,#01H,SETMH2 ;是否按下了2秒钟,
是就开始闪烁设置
100
JNB P3.2,ADD4
MOV ADDFLAG,#00H ;松开了,清闪标志
AJMP SETMH2
ADD4: INC DISMH
MOV A,DISMH
CJNE A,#0AH,SETMH2
MOV DISMH,#00H
SETMH2: ACALL DELAY2
ACALL DISPLAY
ACALL DELAY2
MOV A,DISML
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
F1: JNB TI,F1
CLR TI
MOV SBUF,#00H
F2: JNB TI,F2
CLR TI
MOV A,DISHL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
F3: JNB TI,F3
CLR TI
MOV A,DISHH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
101
MOV SBUF,A
F4: JNB TI,F4
CLR TI
AJMP CRITERION
;//////////////////////////////////////////////////
;设时低位(时低位闪烁)////////////////////////////
SETHL:
CLR TR0
MOV A,ADDFLAG
CJNE A,#01H,SETHL2 ;是否按下了2秒钟,
是就开始闪烁设置
JNB P3.2,ADD5
MOV ADDFLAG,#00H ;松开了,清闪标志
AJMP SETHL2
ADD5: INC DISHL
MOV A,DISHL
CJNE A,#0AH,SETHL2
MOV DISHL,#00H
SETHL2: ACALL DELAY2
ACALL DISPLAY
ACALL DELAY2
MOV A,DISML
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
G1: JNB TI,G1
CLR TI
MOV A,DISMH
102
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
G2: JNB TI,G2
CLR TI
MOV SBUF,#00H
G3: JNB TI,F3
CLR TI
MOV A,DISHH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
G4: JNB TI,G4
CLR TI
AJMP C RITERION
;//////////////////////////////////////////////////
;设时高位(时高位闪烁)////////////////////////////
SETHH:
CLR TR0
MOV A,ADDFLAG
CJNE A,#01H,SETHH2 ;是否按下了2秒钟,
是就开始闪烁设置
JNB P3.2,ADD6
MOV ADDFLAG,#00H ;松开了,清闪标志
AJMP SETHH2
ADD6: INC DISHH
MOV A,DISHH
CJNE A,#03H,SETHH2
103
MOV DISHH,#00H
SETHH2: ACALL DELAY2
ACALL DISPLAY
ACALL DELAY2
MOV A,DISML
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
H1: JNB TI,H1
CLR TI
MOV A,DISMH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
H2: JNB TI,H2
CLR TI
MOV A,DISHL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
H3: JNB TI,H3
CLR TI
MOV SBUF,#00H
H4: JNB TI,H4
CLR TI
AJMP CRITERION
;//////////////////////////////////////////////////
;错误显示//////////////////////////////////////////
104
ERR: CLR TR0
ACALL DELAY2
MOV SBUF,#0EAH
I1: JNB TI,I1
CLR TI
MOV SBUF,#0EAH
I2: JNB TI,I2
CLR TI
MOV SBUF,#9EH
I3: JNB TI,I3
CLR TI
MOV SBUF,#00H
I4: JNB TI,I4
CLR TI
AJMP CRITERION
;延时/////////////////////////////////////////
DELAY:
MOV R1,#100
DE: MOV R2,#100
DJNZ R2,$
DJNZ R1,DE
RET
;//////////////////////////////////////////////////
DELAY1:
MOV R1,#0FFH
DE1: MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,DE1
105
RET
DELAY2: MOV 38H,#02H
DE3: MOV R2,#0FFH
DE2: MOV R1,#0FFH
DJNZ R1,$
DJNZ R2,DE2
DJNZ 38H,DE3
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -