📄 sg8.asm
字号:
.device AT90S8535
.equ sph =$3E
.equ spl =$3D
.equ PORTB =$18
.equ DDRB =$17
.equ PINB =$16
.equ PORTC =$15
.equ DDRC =$14
.equ PINC =$13
.equ PORTD =$12
.equ DDRD =$11
.equ PIND =$10
.equ TIMSK =$39
.equ TCCR1B =$2E
.equ SREG =$3F
.equ TCCR0 =$33
.equ TCNT0 =$32
.equ TCNT1H =$2D
.equ TCNT1L =$2C
.def ZH =r31
.def ZL =r30
.org $0000
rjmp main
.org $009
rjmp t0_ovf
tab: .db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f
main: ldi r16,$02 ;栈指针置初值
out sph,r16
ldi r16,$5f
out spl,r16
ldi r16,0
mov r12,r16
mov r13,r16
ldi r16,$ff ;定义C口、D口为输出
out DDRD,r16
out DDRC,r16
ldi r16,$01 ;允许T/C0中断
out TIMSK,r16
ldi r16,$04 ;定时器8分频
out TCCR0,r16
ldi r16,6 ;定时器0置初值6
out TCNT0,r16
cbi DDRB,1 ;PB1定义为输入口
ldi r24,$06 ;T1(PB1)引脚每一次上升沿计数1次
out TCCR1B,r24
ldi r27,125
sei
loop: mov r16,r10 ;将TCNT1的增量值送r17、r16
mov r17,r11
rcall btd ;调二转十子程序
mov r22,r20
mov r21,r19
mov r20,r18
mov r19,r17
mov r18,r16
rcall smiao ;调动态扫描显示子程序
rjmp loop
t0_ovf: in r1,sreg ;保护现场
ldi r24,6 ;T/C0送初值
out TCNT0,r24
subi r27,1 ;中断计数减1
brne tt ;不为0,则返回
in r10,TCNT1L ;读TCNT1计数值到r11、r10
in r11,TCNT1H
push r10 ;入栈保存
push r11
sub r10,r12 ;求2次T/C1计数差值
sbc r11,r13
pop r13 ;将本次T/C1计数值放入r13、r12中
pop r12 ;为下次计算计数器差值做准备
ldi r27,125
tt: out sreg,r1 ;恢复现场
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
smiao: ldi r16,$fe ;送个位位线
out PORTD,r16
mov r23,r18 ;将个位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$fd ;送十位位线
out PORTD,r16
mov r23,r19 ;将十位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$fb ;送百位位线
out PORTD,r16
mov r23,r20 ;将百位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$f7 ;送千位位线
out PORTD,r16
mov r23,r21 ;将千位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$ef ;送万位位线
out PORTD,r16
mov r23,r22 ;将万位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
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
cqb: ldi ZH,high(tab*2) ;查个位7段码
ldi ZL,low(tab*2)
add ZL,r23
lpm
out PORTC,r0
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -