📄 sg191.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 SPDR =$0F
.equ SPSR =$0E
.equ SPCR =$0D
.def XL =r26
.def XH =r27
.def YL =r28
.def YH =r29
.def ZH =r31
.def ZL =r30
.org $000
rjmp reset
.org $00a
rjmp SPI_S
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
ldi XL,$00 ;发送缓冲区指针X置初值
ldi XH,$01
ldi r16,1 ;SRAM$110~$113送5、6、7、8
sts $100,r16
ldi r16,2
sts $101,r16
ldi r16,3
sts $102,r16
ldi r16,4
sts $103,r16
ldi YL,$10 ;接收缓冲区指针Y置初值
ldi YH,$01
ldi r16,0
sts $110,r16
sts $111,r16
sts $112,r16
sts $113,r16
ldi r16,$e0 ;乙机定义从同步方式,允许同步中断,对振荡器4分频
out SPCR,r16
ldi r16,0 ;清中断标志
out SPSR,r16
ldi r17,$04 ;发4个字节
bb: sei
aa: push YH
push YL
ld r18,Y+
ld r19,Y+
ld r20,Y+
ld r21,Y
pop YL
pop YH
rcall smiao ;动态扫描
in r16,PINC ;读PC7,有键按下就转发送程序
sbrs r16,7
rjmp ff
rjmp aa
ff: ldi r16,$80 ;置中断标志
out SPSR,r16
cc: rjmp cc
SPI_S: in r1,SREG ;保护标志寄存器
in r22,SPDR ;读SPI数据寄存器
st Y+,r22 ;送$110~$113
dec r17
brne dd
rjmp ee
dd: ld r22,X+ ;读$101~$103
out SPDR,r22 ;送SPI数据寄存器
ee: out SREG,r1 ;恢复标志寄存器
reti
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
tab: .db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -