📄 timer.asm
字号:
key_mm_sign bit 00h
key_hh_sign bit 01h
;;;;;;;;;;;;;;;;中断入口程序;;;;;;;;;;;;;;;;;
org 0000h
ajmp start
org 0003h
reti
org 000bh
ljmp intt0 ;定时器0中断入口地址程序
org 0013h
reti
org 001bh
reti
org 0023h
reti
;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;
org 0050h
start: mov r0,#70h
mov r7,#06h
cleardisp: mov @r0,#00h
inc r0
djnz r7,cleardisp
mov 75h,#01h
mov 74h,#02h
;定时器t0初始化;
mov tmod,#01h
mov th0,#3ch
mov tl0,#0b5h
setb ea ;开所有中断
setb et0 ; 开定时器中断
setb tr0 ;开启T0
mov r4,#14h
start1: lcall display ;调用显示程序
call key_mm
call key_hh
jmp start1
;;;;;;;;;;;;;;;;;;;;;;1s 计时程序;;;;;;;;;;;;;;;;;;;;;
intt0: push acc ;入栈保护寄存器,状态字
push psw
clr et0 ;关中断,定时器T0
clr tr0
mov tl0,#0bdh
mov th0,#3ch
setb tr0 ;开中断
djnz r4,outt0 ;1S到否?没到,退出中断服务子程序
cpl p3.0
ddss: mov r4,#14h ;到了,计数器重置初值。
INC 70h ;秒个位加1
MOV A,70h
CJNE A,#0AH,outt0 ;秒个位等于十否?不等于跳出中断
cpl p3.1
MOV 70h,#00H ;等于,秒个位清零
INC 71h ;秒十位加一
MOV A,71h
CJNE A,#06H,outt0
MOV 71h,#00H
addmm: INC 72h
MOV A,72h
CJNE A,#0AH,outt0
mov 72h,#00h
inc 73h
mov a,73h
CJNE A,#06H,outt0
mov 73h,#00h
addhh: inc 74h
mov a, 74h
cjne a,#0ah,addhh_loop ;时个位不等于0ah ,与04H比较
mov 74h,#00h ;时个位等于0ah,清零
inc 75h ;
jmp outt0
addhh_loop: cjne a,#04h,outt0 ;不等于04H,中断返回
mov a,75h ;等于就再比较时十位,如果十位等于02H
cjne a,#02h,outt0
mov 70h,#00h ;秒,分,十显示区全部清零,不等于02H就
mov 71h,#00h
mov 72h,#00h
mov 73h,#00h
mov 74h,#00h
mov 75h,#00h
outt0: ;中断返回
pop psw
pop acc
setb et0
reti
;;;;;;;;;;;;;;;;;;;;;;;时针调整程序;;;;;;;;;;;;;;;;;;;;;;;;
;当键被按下时进入此程序
;;;;;;;;;;;;;;;;;调分钟程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
key_mm:
jnb p1.1,key_mmnext
clr key_mm_sign
jmp key_mmret
key_mmnext:
jb key_mm_sign,key_mmret
setb key_mm_sign
call dk5ms
jb p1.1,key_mmret
INC 72h
MOV A,72h
CJNE A,#0AH,key_mmret
mov 72h,#00h
inc 73h
mov a,73h
CJNE A,#06H,key_mmret
MOV 72H,#00H
MOV 73H,#00H
key_mmret: ret
key_hh:
jnb p1.2,key_hhnext
clr key_hh_sign
jmp key_hhret
key_hhnext:
jb key_hh_sign,key_hhret
setb key_hh_sign
call dk5ms
jb p1.2,key_hhret
inc 74h
mov a, 74h
cjne a,#0ah,key_hh_loop
mov 74h,#00h
inc 75h
jmp key_hhret
key_hh_loop:
cjne a,#04h,key_hhret
mov a,75h
cjne a,#02h,key_hhret
mov 74h,#00h
mov 75h,#00h
key_hhret: ret
;;;;;;;;;;;;;;;;;;;;;;;;显示程序;;;;;;;;;;;;;;;;;;;;;;
;显示数据在70H-75H单元内,用六位共阳数码管显示,P0口输出段码数据,P2口作出
;扫描控制,每个LED亮1MS时间逐位循环
display:
mov r1,#70h ;指向显示缓冲区的首地址
mov r5,#00h ;数码管显示从最低位开始
play: mov a,r5
mov p2,a
mov a,@r1
mov dptr,#tab
movc a,@a+dptr
mov p0,a
lcall dl5ms
mov p0,#0ffh ;消隐
inc r1
inc r5
cjne r5,#06h,play
endout:
mov p0,#0ffh ;关动态显示屏
; mov p2,a
ret
tab: DB 0C0h,0F9h,0A4h,0B0h,099h,092h,082h,0F8h,080h,90h
;0 1 2 3 4 5 6 7 8 9 不亮
;;;;;;;;;;;;;延时程序;;;;;;;;;;;;;;;;;;;;;;;;
;1ms 延时程序,LED显示用
dl5ms: push 06h
push 07h
mov r6,#32h
dl1: mov r7,#10h
dl2: djnz r7,dl2
djnz r6,dl1
nop
nop
nop
pop 07h
pop 06h
ret
dk5ms: push 06h
push 07h
mov r6,#32h
dk1: mov r7,#20h
dk2: djnz r7,dk2
djnz r6,dk1
nop
nop
nop
pop 07h
pop 06h
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -