?? 11232.asm
字號:
.include "8535def.inc"
.org $0000
rjmp reset
.org $00b
rjmp UART_RXC
.org $00d
rjmp UART_TXC
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口為輸出口
out ddrb,r16
ldi r16,$7f ;定義PD7為帶上拉的輸入,PD0~PD6為輸出
out ddrd,r16
sbi portd,7
ldi r16,$d8 ;允許串發、串收及相應中斷
out ucr,r16
ldi r16,51 ;波特率為9600
out ubrr,r16
sei ;開中斷
ldi r18,0 ;四位顯示送初值BCD碼
ldi r19,1
ldi r20,2
ldi r21,3
ldi Xl,$10 ;X發送緩沖區指針置初值
ldi Xh,$01
ldi Yl,$12 ;Y接收緩沖區(顯示)指針置初值
ldi Yh,$00
ldi r16,5 ;發送緩沖區(四個BCD碼)送初值
sts $110,r16
ldi r16,6
sts $111,r16
ldi r16,7
sts $112,r16
ldi r16,8
sts $113,r16
aa: rcall smiao4
in r16,pind ;讀PD7,有鍵按下就轉異步發送
sbrs r16,7
rjmp bb
rjmp aa ;否則繼續動態掃描
bb: ldi r17,$03 ;要發送四個字節
ld r16,X+ ;主程序先發送第一個字節
out udr,r16
cc: rcall smiao4 ;動態掃描顯示
rjmp cc
UART_RXC: ;串收中斷子程
in r1,sreg ;保護標志寄存器
in r22,udr ;讀串收數據寄存器
st Y+,r22 ;送接收緩沖區
out sreg,r1 ;恢復標志寄存器
reti
UART_TXC: ;串收中斷子程
in r1,sreg ;保護標志寄存器
ld r24,X+ ;串發一個字節
out udr,r24
dec r17
brne ee ;沒發完,中斷返回,下次中斷再發
cbi ucr,txcie ;發完規定的字節數,清發送中斷使能位
ee: out sreg,r1 ;恢復標志寄存器
reti
smiao4:ldi r16,$fb ;選中PD2,先顯示個位
out portd, r16
mov r23,r18 ;將待顯示的數放在R23中
rcall cqb ;查七段碼送字線
rcall t1ms ;延時1ms
ldi r16,$f7 ;選中PD3,先顯示十位
out portd, r16
mov r23,r19 ;將待顯示的數放在R23中
rcall cqb ;查七段碼送字線
rcall t1ms ;延時1ms
ldi r16,$ef ;選中PD4,先顯示百位
out portd,r16
mov r23,r20 ;將待顯示的數放在R23中
rcall cqb ;查七段碼送字線
rcall t1ms ;延時1ms
ldi r16,$df ;選中PD5,先顯示千位
out portd,r16
mov r23,r21 ;將待顯示的數放在R23中
rcall cqb ;查七段碼送字線
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
t1ms: ldi r24,71 ;延時1毫秒子程
push r24
del2: push r24
del3: dec r24
brne del3
pop r24
dec r24
brne del2
pop r24
ret
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -