📄 954.asm
字号:
.include "8535def.inc"
.org $000
rjmp main
.org $005
rjmp tim1_capt
tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f;七段码表
main: ldi r16,low(ramend) ;栈指针置初值
out spl,r16
ldi r16,high(ramend)
out sph,r16
ldi r16,$ff ;定义B口为输出口
out ddrb,r16
ldi r16,0b10111111 ;定义PD6为输入,其余引脚为输出
out ddrd,r16
rcall t2pwm2 ;调产生周期为8160μs方波子程
clr r12 ;清上次捕获值
clr r13
ldi r16,$20 ;允许TIM1_CAPT
out timsk,r16
ldi r16,$c2 ;上升沿捕获,一分频
out tccr1b,r16
clr r16 ;清中断标志寄存器
out tifr,r16
sei ;CPU开中断
aa: mov r17,r11 ;捕获偏差值送r17:r16
mov r16,r10
rcall b16td5 ;调二转十子程
mov r22,r20 ;送显示缓冲区
mov r21,r19
mov r20,r18
mov r19,r17
mov r18,r16
rcall smiao ; 动态扫描
rjmp aa
tim1_capt: in r1,sreg ; 标志入栈
in r10,icr1l ; 读输入捕获寄存器且将其入栈保护
in r11,icr1h
push r10
push r11
sub r10,r12 ;减其上次捕获时值
sbc r11,r13
pop r13 ;将本次捕获值差送入R11:R10中
pop r12
out sreg,r1
reti
t2pwm2:
ldi r16,$75 ;定义PWM2使能,向上计数置引脚
out tccr2,r16 ;向下计数清引脚,时钟128分频
ldi r16,$80
out ocr2,r16
ret
t1ms: ldi r24,71 ;延时1毫秒子程
push r24
del2: push r24
del3: dec r24
brne del3
pop r24
dec r24
brne del2
pop r24
ret
b16td5:
ser r20 ;r20先送-1
b16td5_1:
inc r20 ;r20增1
subi r16,low(10000) ;(r17:r16)-10000
sbci r17,high(10000)
brcc b16td5_1 ;够减则返回b16td5_1
subi r16,low(-10000) ;不够减+10000,恢复余数
sbci r17,high(-10000)
ser r19 ;r19先送-1
b16td5_2:
inc r19 ;r19增1
subi r16,low(1000) ;(r17:r16)-10000
sbci r17,high(1000)
brcc b16td5_2 ;够减则返回b16td5_2
subi r16,low(-1000) ;不够减+1000,恢复余数
sbci r17,high(-1000)
ser r18 ;r18先送-1
b16td5_3:
inc r18 ;r18增1
subi r16,low(100) ;(r17:r16)-100
sbci r17,high(100)
brcc b16td5_3 ;够减则返回b16td5_3
subi r16,low(-100) ;不够减+100,恢复余数
sbci r17,high(-100)
ser r17 ;r17先送-1
b16td5_4:
inc r17 ;r17增1
subi r16,10 ;(r17:r16)-10
brcc b16td5_4 ;够减则返回b16td5_4
subi r16,-10 ;不够减+10,恢复余数
ret
smiao: ldi r16,$fe ;送个位位线
out portd, r16
mov r23,r18 ;将个位的BCD码送R23
rcall cqb ;查七段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$fd ;送十位位线
out portd, r16
mov r23,r19 ;将十位的BCD码送R23
rcall cqb ;查七段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$fb ;送百位位线
out portd,r16
mov r23,r20 ;将百位的BCD码送R23
rcall cqb ;查七段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$f7 ;送千位位线
out portd,r16
mov r23,r21 ;将千位的BCD码送R23
rcall cqb ;查七段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$ef ;送万位位线
out portd,r16
mov r23,r22 ;将万位的BCD码送R23
rcall cqb ;查七段码,送B口输出
rcall t1ms ;延时1ms
ret
cqb: ldi zh,high(tab*2) ;七段码的首地址给Z
ldi zl,low(tab*2)
add zl,r23 ;首地址+偏移量
lpm ;查表送B口输出
out portb,r0
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -