📄 11232.asm
字号:
.include "8535def.inc"
.org $0000
rjmp reset
.org $00b
rjmp UART_RXC
.org $00d
rjmp UART_TXC
tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f ;七段码表
reset: ldi r16,low(ramend) ;栈指针置初值
out spl,r16
ldi r16,high(ramend)
out sph,r16
ldi r16,$ff ;定义PB口为输出口
out ddrb,r16
ldi r16,$7f ;定义PD7为带上拉的输入,PD0~PD6为输出
out ddrd,r16
sbi portd,7
ldi r16,$d8 ;允许串发、串收及相应中断
out ucr,r16
ldi r16,51 ;波特率为9600
out ubrr,r16
sei ;开中断
ldi r18,0 ;四位显示送初值BCD码
ldi r19,1
ldi r20,2
ldi r21,3
ldi Xl,$10 ;X发送缓冲区指针置初值
ldi Xh,$01
ldi Yl,$12 ;Y接收缓冲区(显示)指针置初值
ldi Yh,$00
ldi r16,5 ;发送缓冲区(四个BCD码)送初值
sts $110,r16
ldi r16,6
sts $111,r16
ldi r16,7
sts $112,r16
ldi r16,8
sts $113,r16
aa: rcall smiao4
in r16,pind ;读PD7,有键按下就转异步发送
sbrs r16,7
rjmp bb
rjmp aa ;否则继续动态扫描
bb: ldi r17,$03 ;要发送四个字节
ld r16,X+ ;主程序先发送第一个字节
out udr,r16
cc: rcall smiao4 ;动态扫描显示
rjmp cc
UART_RXC: ;串收中断子程
in r1,sreg ;保护标志寄存器
in r22,udr ;读串收数据寄存器
st Y+,r22 ;送接收缓冲区
out sreg,r1 ;恢复标志寄存器
reti
UART_TXC: ;串收中断子程
in r1,sreg ;保护标志寄存器
ld r24,X+ ;串发一个字节
out udr,r24
dec r17
brne ee ;没发完,中断返回,下次中断再发
cbi ucr,txcie ;发完规定的字节数,清发送中断使能位
ee: out sreg,r1 ;恢复标志寄存器
reti
smiao4:ldi r16,$fb ;选中PD2,先显示个位
out portd, r16
mov r23,r18 ;将待显示的数放在R23中
rcall cqb ;查七段码送字线
rcall t1ms ;延时1ms
ldi r16,$f7 ;选中PD3,先显示十位
out portd, r16
mov r23,r19 ;将待显示的数放在R23中
rcall cqb ;查七段码送字线
rcall t1ms ;延时1ms
ldi r16,$ef ;选中PD4,先显示百位
out portd,r16
mov r23,r20 ;将待显示的数放在R23中
rcall cqb ;查七段码送字线
rcall t1ms ;延时1ms
ldi r16,$df ;选中PD5,先显示千位
out portd,r16
mov r23,r21 ;将待显示的数放在R23中
rcall cqb ;查七段码送字线
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
t1ms: ldi r24,71 ;延时1毫秒子程
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 + -