第1个回答 2020-03-14
HOUR
EQU
40H
;存放时信息的单元
MINUTE
EQU
41H
;存放分信息的单元
SECOND
EQU
42H
;存放秒信息的单元
NUM
EQU
43H
;存放T0溢出次数的单元
ORG
0000H
;程序入口
AJMP
MAIN
ORG
0030H
;主程序入口
MAIN:MOV
SP,#60H
;指定堆栈栈底
MOV
HOUR,#00H
MOV
MINUTE,#00H
MOV
SECOND,#00H
;将时、分、秒分别清零
MOV
NUM,#0
MOV
TMOD,#01H
;设T0工作于方式1,用于定时
MOV
TH0,#4CH
;设置T0的初始值
MOV
TL0,#00H
MOV
IE,#00H
;关中断
SETB
TR0
;开启定时器T0
LOOP:NOP
NOP
ACALL
DISPLAY
;调用显示子程序
NOP
NOP
LOOP1:JB
TF0,TIME
;等待定时溢出
LJMP
LOOP1
TIME:CLR
TR0
;关闭定时器
PUSH
DPL
;保护现场
PUSH
DPH
PUSH
ACC
MOV
TH0,#4CH
;重新设置T0的值
MOV
TL0,#00H
SETB
TR0
;开启T0
MOV
A,NUM
INC
A
;溢出次数+1
MOV
NUM,A
CJNE
A,#0AH,TT1
;检测键盘
MOV
P1,#0FH
;设键盘初值
MOV
R0,#04H
;延时消抖
LCALL
DELAY
JNB
P1.0,T0C1
;为0表示P1.0按下,转T0C1调整秒
JNB
P1.1,T0C2
;为0表示P1.1按下,转T0C2调整分
JNB
P1.2,T0C3
;为0表示P1.2按下,转T0C3调整时
TT1:
CJNE
A,#140,RR4
MOV
NUM,#00H
T0C1:MOV
A,SECOND
INC
A
;秒单元内容加1
DA
A
;调整为BCD码
MOV
SECOND,A
CJNE
A,#60H,RR4
;不为60秒继续等待
setb
flag:
clr
flag
RR1:
MOV
SECOND,#00H
;为60秒将秒单元清零
T0C2:MOV
A,MINUTE
INC
A
;分单元内容加1
DA
A
;调整为BCD码
MOV
MINUTE,A
CJNE
A,#60H,RR4
;不为60分继续等待
RR2:
MOV
MINUTE,#00H
;为60分,分单元清零
T0C3:MOV
P1,#0F0H
;
1小时闪一次
LCALL
DELAY
;延时
MOV
P1,#0FH
MOV
A,HOUR
INC
A
;时单元内容加1
DA
A
;调整为BCD码
MOV
HOUR,A
CJNE
A,#24H,RR4
;不为24小时继续等待
RR3:
MOV
HOUR,#00H
;为24小时,时单元清零
RR4:
POP
ACC
;恢复现场
POP
DPH
POP
DPL
LJMP
LOOP
DELAY:MOV
R1,#10H
;延时子程序
DELAY1:MOV
R2,#20H
DJNZ
R2,$
DJNZ
R1,DELAY1
DJNZ
R0,DELAY
RET
DISPLAY:MOV
DPTR,#TAB
;送表头基地址
MOV
A,HOUR
ANL
A,#0FH
;屏蔽时高位
MOVC
A,@A+DPTR
;查时高位
MOV
P0,A
CLR
P2.6
;开显示
MOV
R0,#1
;延时消除鬼影
LCALL
DELAY
SETB
P2.6
;关显示
MOV
A,HOUR
ANL
A,#0F0H
SWAP
A
MOVC
A,@A+DPTR
MOV
P0,A
CLR
P2.7
MOV
R0,#1
LCALL
DELAY
SETB
P2.7
MOV
A,MINUTE
ANL
A,#0FH
MOVC
A,@A+DPTR
MOV
P0,A
CLR
P2.4
MOV
R0,#1
LCALL
DELAY
SETB
P2.4
MOV
A,MINUTE
ANL
A,#0F0H
SWAP
A
MOVC
A,@A+DPTR
MOV
P0,A
CLR
P2.5
MOV
R0,#1
LCALL
DELAY
SETB
P2.5
MOV
A,SECOND
ANL
A,#0FH
MOVC
A,@A+DPTR
MOV
P0,A
CLR
P2.2
MOV
R0,#1
LCALL
DELAY
SETB
P2.2
MOV
A,SECOND
ANL
A,#0F0H
SWAP
A
MOVC
A,@A+DPTR
MOV
P0,A
CLR
P2.3
MOV
R0,#1
LCALL
DELAY
SETB
P2.3
RET
TAB:
DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END