?? 933.asm
字號:
.include "8535def.inc"
.org $0000
rjmp reset
.org $009
rjmp tim0_ovf
tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f;七段碼表
reset: ldi r16,low(ramend) ;棧指針置初值
out spl,r16
ldi r16,high(ramend)
out sph,r16
ldi r16,$ff ;定義PB、PD為輸出口
out ddrb,r16
out ddrd,r16
ldi r17,$ff ;設初值在r17:r16
ldi r16,$ff
rcall b16td5 ;調用二轉十子程
mov r23,r16 ;查七段碼,送給$100~$104
rcall cqm1
sts $100,r0
mov r23,r17
rcall cqm1
sts $101,r0
mov r23,r18
rcall cqm1
sts $102,r0
mov r23,r19
rcall cqm1
sts $103,r0
mov r23,r20
rcall cqm1
sts $104,r0
ldi r16,$01 ;允許T/C0溢出中斷
out timsk,r16
ldi r16,$03 ;64分頻,2ms一位
out tccr0,r16
ldi r16,$00 ;T/C0置初值0
out tcnt0,r16
out tifr,r16
ldi r21,$fe ;位線置初值
sei
here: rjmp here
tim0_ovf:
in r1,sreg ;保存sreg
cpi r21,$fe ;該顯示個位?
brne t21 ;否則轉t21
lds r20,$100 ;送個位七段碼給字線
out portb,r20
out portd,r21 ;送個位位線
ldi r21,$fd ;修改位線(下次顯示十位)
rjmp t25
t21: cpi r21,$fd ;該顯示十位?
brne t22 ;否則轉t22
lds r20,$101 ;送十位七段碼給字線
out portb,r20
out portd,r21 ;送十位位線
ldi r21,$fb ;修改位線(下次顯示百位)
rjmp t25
t22: cpi r21,$fb ;該顯示百位?
brne t23 ;否則轉t23
lds r20,$102 ;送百位七段碼給字線
out portb,r20
out portd,r21 ;送百位位線
ldi r21,$f7 ;修改位線(下次顯示千位)
rjmp t25
t23: cpi r21,$f7 ;該顯示千位?
brne t24 ;否則轉t24
lds r20,$103 ;送千位七段碼給字線
out portb,r20
out portd,r21 ;送千位位線
ldi r21,$ef ;修改位線(下次顯示萬位)
rjmp t25
t24: lds r20,$104 ;送萬位七段碼給字線
out portb,r20
out portd,r21 ;送萬位位線
ldi r21,$fe ;修改位線(下次顯示個位)
t25: out sreg,r1 ;恢復sreg
reti
cqm1: ldi zh,high(tab*2) ;七段碼的首地址給Z
ldi zl,low(tab*2)
add zl,r23 ;首地址+偏移量
lpm ;查表送B口輸出
ret
t1ms: ldi r24,71 ;延時1毫秒子程
push r24
del2: push r24
del3: dec r24
brne del3
pop r24
dec r24
brne del2
pop r24
ret
b16td5:
ser r20 ;r20先送-1
b16td5_1:
inc r20 ;r20增1
subi r16,low(10000) ;(r17:r16)-10000
sbci r17,high(10000)
brcc b16td5_1 ;夠減則返回b16td5_1
subi r16,low(-10000) ;不夠減+10000,恢復余數
sbci r17,high(-10000)
ser r19 ;r19先送-1
b16td5_2:
inc r19 ;r19增1
subi r16,low(1000) ;(r17:r16)-10000
sbci r17,high(1000)
brcc b16td5_2 ;夠減則返回b16td5_2
subi r16,low(-1000) ;不夠減+1000,恢復余數
sbci r17,high(-1000)
ser r18 ;r18先送-1
b16td5_3:
inc r18 ;r18增1
subi r16,low(100) ;(r17:r16)-100
sbci r17,high(100)
brcc b16td5_3 ;夠減則返回b16td5_3
subi r16,low(-100) ;不夠減+100,恢復余數
sbci r17,high(-100)
ser r17 ;r17先送-1
b16td5_4:
inc r17 ;r17增1
subi r16,10 ;(r17:r16)-10
brcc b16td5_4 ;夠減則返回b16td5_4
subi r16,-10 ;不夠減+10,恢復余數
ret
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -