📄 sg7.asm
字号:
.device AT90S8535
.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 TIMSK =$39
.equ TIFR =$38
.equ SREG =$3F
.equ TCCR0 =$33
.equ TCNT0 =$32
.def ZH =r31
.def ZL =r30
.org $0000
rjmp reset
.org $009
rjmp t0_ovf
reset: ldi r16,$02 ;栈指针置初值
out sph,r16
ldi r16,$5f
out spl,r16
ldi r16,$ff ;定义PB、PD为输出
out DDRB,r16
out DDRD,r16
ldi r17,$ff ;设初值在r17、r16
ldi r16,$ff
rcall btd ;调二转十子程序
mov r23,r16 ;查7段码,送给$100~$104
rcall cqml
sts $100,r0
mov r23,r17
rcall cqml
sts $101,r0
mov r23,r18
rcall cqml
sts $102,r0
mov r23,r19
rcall cqml
sts $103,r0
mov r23,r20
rcall cqml
sts $104,r0
ldi r16,$01 ;允许T/C0溢出中断
out TIMSK,r16
ldi r16,$03 ;64分频,2ms 1位
out TCCR0,R16
ldi r16,$00 ;T/C0置初值0
out TCNT0,r16
out TIFR,r16
ldi r21,$fe ;位线置初值
sei
here: rjmp here
t0_ovf: in r1,SREG ;保存SREG
cpi r21,$fe ;该显示个位?
brne t21 ;否则转t21
lds r20,$100 ;送个位7段码给字线
out PORTB,r20
out PORTD,r21 ;送个位位线
ldi r21,$fd ;修改位线(下次显示十位)
rjmp t25
t21: cpi r21,$fd ;该显示十位?
brne t22 ;否则转t22
lds r20,$101 ;送十位7段码给字线
out PORTB,r20
out PORTD,r21 ;送十位位线
ldi r21,$fb ;修改位线(下次显示百位)
rjmp t25
t22: cpi r21,$fb ;该显示百位?
brne t23 ;否则转t23
lds r20,$102 ;送百位7段码给字线
out PORTB,r20
out PORTD,r21 ;送百位位线
ldi r21,$f7 ;修改位线(下次显示千位)
rjmp t25
t23: cpi r21,$f7 ;该显示千位?
brne t24 ;否则转t23
lds r20,$103 ;送千位7段码给字线
out PORTB,r20
out PORTD,r21 ;送千位位线
ldi r21,$ef ;修改位线(下次显示万位)
rjmp t25
t24: lds r20,$104 ;送万位7段码给字线
out PORTB,r20
out PORTD,r21 ;送万位位线
ldi r21,$fe ;修改位线(下次显示个位)
t25: out SREG,r1 ;恢复sreg'
reti
btd: ser r20 ;r20先送-1
btd_1: inc r20 ;r20增1
subi r16,low(10000) ;(r17:r16)-10000
sbci r17,high(10000)
brcc btd_1 ;够减则返回btd_1
subi r16,low(-10000) ;不够减+10000,恢复余数
sbci r17,high(-10000)
ser r19 ;r19先送-1
btd_2: inc r19 ;r19增1
subi r16,low(1000) ;(r17:r16)-1000
sbci r17,high(1000)
brcc btd_2 ;够减则返回btd_2
subi r16,low(-1000) ;不够减+1000,恢复余数
sbci r17,high(-1000)
ser r18 ;r18先送-1
btd_3: inc r18 ;r18增1
subi r16,low(100) ;(r17:r16)-100
sbci r17,high(100)
brcc btd_3 ;够减则返回btd_3
subi r16,low(-100) ;不够减+100,恢复余数
sbci r17,high(-100)
ser r17 ;r17先送-1
btd_4: inc r17 ;r17增1
subi r16,10 ;(r17:r16)-10
brcc btd_4 ;够减则返回btd_4
subi r16,-10 ;不够减+10,恢复余数
ret
cqml: ldi ZH,high(tab*2) ;查个位7段码
ldi ZL,low(tab*2)
add ZL,r23
lpm
ret
tab: .db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -