📄 zh4.asm
字号:
.device AT90S8535
.equ SREG =$3F
.equ sph =$3E
.equ spl =$3D
.equ TIMSK =$39
.equ TIFR =$38
.equ TCCR2 =$25
.equ ASSR =$22
.equ PORTA =$1B
.equ DDRA =$1A
.equ PINA =$19
.equ PORTB =$18
.equ DDRB =$17
.equ PINB =$16
.equ PORTD =$12
.equ DDRD =$11
.equ PIND =$10
.def ZH =r31
.def ZL =r30
.org $0000
rjmp reset
.org $004
rjmp t2_ovf
tab: .db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f
reset: ldi r16,$02 ;栈指针置初值
out sph,r16
ldi r16,$5f
out spl,r16
ldi r16,$ff ;定义PB、PD为输出口
out DDRB,r16
out DDRD,r16
out PORTA,r16
ldi r16,$00 ;定义PA口为带上拉的输入口
out DDRA,r16
ldi r26,0 ;设时、分、秒初值为00:00:00
ldi r27,0
ldi r28,0
ldi r16,$08 ;使用异步时钟
out ASSR,r16
ldi r16,$40 ;允许T2溢出中断
out TIMSK,r16
ldi r16,$05 ;128分频,1s中断1次
out TCCR2,r16
ldi r16,$00 ;T/C2置初值0
out TIFR,r16
sei
;**********************************************************
;判断是否有控制键按下,是哪一个键按下
a1: rcall aa
rcall smiao
in r16,PINA
sbrs r16,0
rjmp s1 ;去抖动,秒值加1
sbrs r16,1
rjmp s2 ;去抖动,分值加1
sbrs r16,2
rjmp s3 ;去抖动,小时值加1
rjmp a1
s1: rcall t1ms
in r16,PINA
sbrc r16,0
rjmp a1
inc r26
cpi r26,60 ;判断是否加到60秒
brne j0
ldi r26,$00
rjmp k1
s2: rcall t1ms
in r16,PINA
sbrc r16,1
rjmp a1
k1: inc r27
cpi r27,60 ;判断是否加到60分
brne j1
ldi r27,$00
rjmp k2
s3: rcall t1ms
in r16,PINA
sbrc r16,2
rjmp a1
k2: inc r28
cpi r28,24 ;判断是否加到24小时
brne j2
ldi r28,$00
rjmp j2
;**********************************************************
j0: ;等待按键抬起
in r16,PINA
sbrc r16,0
rjmp a1
rcall aa
rcall smiao
rjmp j0
j1: in r16,PINA
sbrc r16,1
rjmp a1
rcall aa
rcall smiao
rjmp j1
j2: in r16,PINA
sbrc r16,2
rjmp a1
rcall aa
rcall smiao
rjmp j2
t2_ovf: in r1,SREG ;保护标志
inc r26 ;秒增1
cpi r26,60 ;到60s?
brne tt
clr r26 ;到了,则秒清0
inc r27 ;分增1
cpi r27,60 ;到60min?
brne tt
clr r27 ;到了,则分清0
inc r28 ;分增1
cpi r28,24 ;到24h?
brne tt
clr r28 ;到了,则时清0
tt: out sreg,r1
reti
aa: mov r16,r26 ;秒寄存器中数二转十,送r19、r18
rcall b8td
mov r19,r17
mov r18,r16
mov r16,r27 ;分寄存器中数二转十,送r21、r20
rcall b8td
mov r21,r17
mov r20,r16
mov r16,r28 ;时寄存器中数二转十,送r25、r22
rcall b8td
mov r25,r17
mov r22,r16
ret
b8td: clr r17 ;将r16中的二进制数转换为十进制数,十位、个位分别送r17、r16
b8td1: subi r16,10
brcs b8td2
inc r17
rjmp b8td1
b8td2: subi r16,(-10)
ret
smiao: ldi r16,$fe ;送秒个位位线
out PORTD,r16
mov r23,r18 ;将秒个位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$fd ;送秒十位位线
out PORTD,r16
mov r23,r19 ;将秒十位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$fb ;送间隔位线
out PORTD,r16
ldi r16,$40
mov r0,r16
out PORTB,r0
rcall t1ms
ldi r16,$f7 ;送分个位位线
out PORTD,r16
mov r23,r20 ;将分个位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$ef ;送分十位位线
out PORTD,r16
mov r23,r21 ;将分十位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$df ;送间隔位线
out PORTD,r16
ldi r16,$40
mov r0,r16
out PORTB,r0
rcall t1ms
ldi r16,$bf ;送时个位位线
out PORTD,r16
mov r23,r22 ;将时个位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$7f ;送时十位位线
out PORTD,r16
mov r23,r25 ;将时十位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ret
cqb: ldi ZH,high(tab*2) ;7段码的首址给Z
ldi ZL,low(tab*2)
add ZL,r23 ;首地址+偏移量
lpm ;查表送B口输出
out PORTB,r0
ret
t1ms: ldi r24,71 ;延时1ms子程序
push r24
del2: push r24
del3: dec r24
brne del3
pop r24
dec r24
brne del2
pop r24
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -