📄 sg171.asm
字号:
.device AT90S8535
.equ SREG =$3F
.equ sph =$3E
.equ spl =$3D
.equ PORTA =$1B
.equ DDRA =$1A
.equ PINA =$19
.equ PORTC =$15
.equ DDRC =$14
.equ PINC =$13
.equ PORTD =$12
.equ DDRD =$11
.equ PIND =$10
.equ UDR =$0C
.equ USR =$0B
.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
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 ;定义PA口为输出口
out DDRA,r16
ldi r16,$0f ;定义PC口低4位为输出,高4位为输入口
out DDRC,r16
sbi PORTC,7 ;定义PD7带口上拉输入
ldi r16,$ff ;定义PD口为输出口
out DDRD,r16
ldi r16,$98 ;定义串收、串发,且允许中断
out UCR,r16
sei
ldi r16,51 ;定义波特率为9600
out UBRR,r16
ldi r18,0
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,PINC ;读PC7,有键按下就转异步发送
sbrs r16,7
rjmp bb
rjmp aa ;否则,继续动态扫描
bb: ldi r17,4 ;共发4个字节
cc: ld r16,X+ ;发1个字节
out UDR,r16
dd: sbis USR,5
rjmp dd
dec r17 ;没发完4个,继续发
brne cc
ee: rcall smiao ;动态扫描
rjmp ee
smiao: ldi r16,$fe ;选中PC0,先显示个位
out PORTC,r16
mov r23,r18 ;将待显示的数放在r23中
rcall cqb ;查7段码送字线
rcall t1ms ;延时1ms
ldi r16,$fd ;选中PC1,先显示十位
out PORTC,r16
mov r23,r19 ;将待显示的数放在r23中
rcall cqb ;查7段码送字线
rcall t1ms ;延时1ms
ldi r16,$fb ;选中PC2,先显示百位
out PORTC,r16
mov r23,r20 ;将待显示的数放在r23中
rcall cqb ;查7段码送字线
rcall t1ms ;延时1ms
ldi r16,$f7 ;选中PC3,先显示千位
out PORTC,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 ;查表送A口输出
out PORTA,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
U_RXC: in r1,SREG ;保护标志寄存器
in r22,UDR ;读UART数据寄存器
st Y+,r22 ;送r18~r21中1个寄存器
out SREG,r1 ;恢复标志寄存器
reti
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -