📄 watch.asm
字号:
KEY1 equ P2.7
KEY2 equ P2.6
KEY3 equ P2.5
KEY4 equ P2.4
bseg ;位变量
stop: ;停止/计秒
dseg at 30h ;内部RAM变量
buf: ds 4 ;显示缓冲区
ms: ds 1 ;计秒辅助变量
disppoint: ds 1 ;显示数码管指针
CSEG AT 0
jmp start
org 0003h ;外部中断0
reti
org 000bh ;定时器0溢出
jmp timer0
org 0013h ;外部中断1
reti
org 001bh ;定时器1溢出
reti
org 0023h ;串行口
reti
org 002bh ;定时器2溢出
reti
org 20h
seg: db 022h
db 0fah
db 031h
db 025h
db 0ach
db 064h
db 060h
db 02fh
db 020h
db 024h
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
sel: db 0feh
db 0fdh
db 0fbh
db 0f7h
timer0: ;定时器0服务程序
clr EA
mov th0,#(256-4) ;about 1000uS on 12MHz
mov tl0,#0
;轮换显示数码管:
mov a,disppoint
add a,#buf ;显示缓冲区
mov r0,a
mov a,@r0
anl a,#0fh
mov dptr,#seg
movc a,@a+dptr
mov p0,a
mov a,disppoint
mov dptr,#sel
movc a,@a+dptr
mov p2,a
mov a,disppoint
inc a
anl a,#3
mov disppoint,a
;秒表计时:
jb stop,b0009 ;如果在停止状态,不计时
dec ms
mov a,ms
jnz b0009
mov ms,#100
inc buf+3 ;个位数码管+1
mov a,buf+3
cjne a,#10,b0009 ;>10?
mov buf+3,#0
inc buf+2 ;十位数码管+1
mov a,buf+2
cjne a,#10,b0009
mov buf+2,#0
inc buf+1 ;百位数码管+1
mov a,buf+1
cjne a,#10,b0009
mov buf+1,#0
inc buf+0 ;千位数码管+1
mov a,buf+0
cjne a,#10,b0009
mov buf+0,#0
b0009:
setb EA
reti
delay:
mov r7,#0
mov r6,#0
d001:
djnz r7,d001
djnz r6,d001
ret
;------------
start:
mov buf,#0
mov buf+1,#0
mov buf+2,#0
mov buf+3,#0
clr stop
mov tmod,#01h
mov th0,#(256-4) ;about 1000uS on 12MHz
mov tl0,#0
setb TR0
setb EA
loop:
setb ET0
jb KEY1,l001
clr stop ;开始计秒
call delay
l001:
jb KEY2,l002
setb stop ;停止计秒
call delay
l002:
jb KEY3,l003 ;清零并且停止
setb stop
mov buf,#0
mov buf+1,#0
mov buf+2,#0
mov buf+3,#0
call delay
l003:
jmp loop
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -