📄 clock.asm
字号:
HOUR EQU 30H ;小时计数单元
MIN EQU 31H ;分钟计数单元
SEC EQU 32H ;秒计数单元
COUNT EQU 33H ;50ms计数单元
BUF EQU 38H ;显示缓冲区首地址,共3字节
ORG 0
LJMP START
ORG 0BH
LJMP TS
ORG 30H
START: MOV SP,#60H
MOV TMOD,#01H ;设T0为方式1
MOV TH0,#3CH
MOV TL0,#0B0H ;50ms定时初值
SETB PT0 ;设T0为高级中断
SETB ET0 ;允许T0中断
MOV COUNT,#20 ;50ms计数单元赋初值
MOV HOUR,#0 ;小时计数单元清零
MOV MIN,#0 ;分钟计数单元清零
MOV SEC,#0 ;秒计数单元清零
SETB TR0 ;启动计数
LOOP: CLR EA ;关中断,避免读数时显示跳动
MOV BUF,HOUR ;存小时数到显示缓冲区
MOV BUF+1,MIN ;存分钟数到显示缓冲区
MOV BUF+2,SEC ;存秒数到显示缓冲区
SETB EA ;开中断
LCALL DISP
SJMP LOOP
;显示程序
;将BUF单元的3字节BCD码送数码管显示
DISP: MOV R0,#BUF
MOV R2,#3 ;共显示3个字节的BCD码
MOV R3,#1 ;位码初值
DISP1: MOV A,@R0
ANL A,#0FH
MOV DPTR,#DISP_TAB
MOVC A,@A+DPTR
ANL A,#7FH ;点亮末尾小数点以便于区分时间
MOV P0,A ;送段码
MOV A,R3
MOV P2,A
RL A
MOV R3,A
LCALL DELAY ;延时1ms
MOV A,@R0
SWAP A
ANL A,#0FH
MOV DPTR,#DISP_TAB
MOVC A,@A+DPTR
MOV P0,A ;送段码
MOV A,R3
MOV P2,A
RL A
MOV R3,A
LCALL DELAY
INC R0
DJNZ R2,DISP1
RET
DISP_TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0D8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
;50ms定时中断服务程序
TS: PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
DJNZ COUNT,EXIT
MOV COUNT,#20
MOV A,SEC
ADD A,#1 ;秒加1
DA A ;调整为BCD码
MOV SEC,A ;存秒
CJNE A,#60H,EXIT ;不到60秒则退出
MOV SEC,#0 ;秒单元清零
MOV A,MIN
ADD A,#1 ;分加1
DA A ;调整为BCD码
MOV MIN,A ;存分
CJNE A,#60H,EXIT ;不到60分则退出
MOV MIN,#0
MOV A,HOUR
ADD A,#1 ;小时加1
DA A ;调整为BCD码
MOV HOUR,A ;存小时
CJNE A,#24H,EXIT ;不到24小时则退出
MOV HOUR,#0
EXIT: POP DPL
POP DPH
POP ACC
POP PSW
RETI
DELAY: MOV R6,#250
L1: NOP
NOP
DJNZ R6,L1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -