📄 sg18.asm
字号:
.device AT90S8535
.equ SREG =$3F
.equ sph =$3E
.equ spl =$3D
.equ PORTB =$18
.equ DDRB =$17
.equ PINB =$16
.equ PORTD =$12
.equ DDRD =$11
.equ PIND =$10
.equ UDR =$0C
.equ UCR =$0A
.equ UBRR =$09
.def XL =r26
.def XH =r27
.def YL =r28
.def YH =r29
.def ZH =r31
.def ZL =r30
.org $000
rjmp reset
.org $00b
rjmp U_RXC
.org $00d
rjmp U_TXC
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口为输出口
out DDRB,r16
ldi r16,$7f ;定义PD7为带上拉的输入,PD0~PD6口为输出
out DDRD,r16
sbi PORTD,7 ;定义PD7带口上拉输入
ldi r16,$98 ;定义串收、串发及相应中断
out UCR,r16
ldi r16,51 ;定义波特率为9600
out UBRR,r16
sei
ldi r18,0 ;4位显示送初值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 ;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 smiao ;动态扫描
in r16,PIND ;读PD7,有键按下就转异步发送
sbrs r16,7
rjmp bb
rjmp aa ;否则,继续动态扫描
bb: ldi r17,$04 ;共发4个字节
sbi UCR,6
cc: rcall smiao
rjmp cc
U_RXC: in r1,SREG ;保护标志寄存器
in r22,UDR ;读UART数据寄存器
st Y+,r22 ;送r18~r21中1个寄存器
out SREG,r1 ;恢复标志寄存器
reti
U_TXC: in r1,SREG ;保护标志寄存器
ld r16,X+ ;串发1个字节
out UDR,r16
dec r17
brne ee ;没发完,中断返回,下次中断再发
cbi UCR,6 ;发完规定的字节数,清发送中断使能位
ee: out SREG,r1 ;恢复标志寄存器
reti
smiao: ldi r16,$fb ;选中PD2,先显示个位
out PORTD,r16
mov r23,r18 ;将待显示的数放在r23中
rcall cqb ;查7段码送字线
rcall t1ms ;延时1ms
ldi r16,$f7 ;选中PD3,先显示十位
out PORTD,r16
mov r23,r19 ;将待显示的数放在r23中
rcall cqb ;查7段码送字线
rcall t1ms ;延时1ms
ldi r16,$ef ;选中PD4,先显示百位
out PORTD,r16
mov r23,r20 ;将待显示的数放在r23中
rcall cqb ;查7段码送字线
rcall t1ms ;延时1ms
ldi r16,$df ;选中PD5,先显示千位
out PORTD,r16
mov r23,r21 ;将待显示的数放在r23中
rcall cqb ;查7段码送字线
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,101 ;延时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 + -