?? 951.asm
字號:
.include "8535def.inc"
.org $000
rjmp main
.org $009
rjmp tim0_ovf
tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f ;七段碼表
main: ldi r16,low(ramend) ;棧指針置初值
out spl,r16
ldi r16,high(ramend)
out sph,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置初值0
out tcnt0,r16
cbi ddrb,1 ;PB1定義為輸入口
ldi r24,$06 ;T1(PB1)引腳每一次上升沿計數一次
out tccr1b,r24
ldi r27,125
rcall t2pwm1 ;PD7產生頻率為15686的PWM方波
sei
loop: mov r16,r10 ;將TCNT1的增量值送r17:r16
mov r17,r11
rcall b16td5 ;二轉十
mov r22,r20 ;送r18~r22
mov r21,r19
mov r20,r18
mov r19,r17
mov r18,r16
rcall smiao ;動態掃描顯示
rjmp loop
t1ms: ldi r24,71 ;延時1毫秒子程
push r24
del2: push r24
del3: dec r24
brne del3
pop r24
dec r24
brne del2
pop r24
ret
t2pwm1:
ldi r16,$71 ;PWM2使能,向上計數置引腳
out tccr2,r16 ;向下計數清引腳,時鐘1分頻
ldi r16,$80
out ocr2,r16
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
smiao: ldi r16,$fe ;送個位位線
out portd, r16
mov r23,r18 ;將個位的BCD碼送R23
rcall cqb ;查七段碼,送B口輸出
rcall t1ms ;延時1ms
ldi r16,$fd ;送十位位線
out portd, r16
mov r23,r19 ;將十位的BCD碼送R23
rcall cqb ;查七段碼,送B口輸出
rcall t1ms ;延時1ms
ldi r16,$fb ;送百位位線
out portd,r16
mov r23,r20 ;將百位的BCD碼送R23
rcall cqb ;查七段碼,送B口輸出
rcall t1ms ;延時1ms
ldi r16,$f7 ;送千位位線
out portd,r16
mov r23,r21 ;將千位的BCD碼送R23
rcall cqb ;查七段碼,送B口輸出
rcall t1ms ;延時1ms
ldi r16,$ef ;送萬位位線
out portd,r16
mov r23,r22 ;將萬位的BCD碼送R23
rcall cqb ;查七段碼,送B口輸出
rcall t1ms ;延時1ms
ret
cqb: ldi zh,high(tab*2) ;七段碼的首地址給Z
ldi zl,low(tab*2)
add zl,r23 ;首地址+偏移量
lpm ;查表送B口輸出
out portb,r0
ret
tim0_ovf:in r1,sreg ;保護現場
ldi r24,6 ;T/C0送初值
out TCNT0,r24
subi r27,1 ;中斷計數減1
brne qq ;不為0,則返回
in r10,tcnt1l ;讀TCNT1計數值到R11:R10
in r11,tcnt1h
push r10 ;入棧保存
push r11
sub r10,r12 ;求兩次T/C1計數差值
sbc r11,r13
pop r13 ;將本次T/C1計數值放入R13:R12中,
pop r12 ;為下次計算計數器差值作準備
ldi r27,125
qq: out sreg,r1 ;恢復現場
reti
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -