📄 11231.asm
字号:
.include "8535def.inc"
.org $0000
rjmp reset
.org $00b
rjmp UART_RXC
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 ;定义PD7带上拉输入
ldi r16,$98 ;定义串收、串发且允许中断
out ucr,r16
sei
ldi r16,51 ;定义波特率为9600
out ubrr,r16
ldi r21,3 ;显示缓冲区先送0、1、2、3
ldi r20,2
ldi r19,1
ldi r18,0
ldi Xl,$10 ;发送缓冲区指针X置初值
ldi Xh,$01
ldi Yl,$12 ;接收缓冲区指针Y置初值
ldi Yh,$00
ldi r16,5 ;SRAM$110~$113送5、6、7、8
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,4 ;共发4个字节
cc: ld r16,X+ ;发一个字节
out udr,r16
dd: sbis usr,udre
rjmp dd
dec r17 ;没发完4个,继续发
brne cc
ee: rcall smiao4 ;动态扫描
rjmp ee
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
UART_RXC:
in r1,sreg ;保护标志寄存器
in r22,udr ;读UART数据寄存器
st Y+,r22 ;送r18~r21中1个寄存器
out sreg,r1 ;恢复标志寄存器
reti
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 + -