?? demo_7_1.asm
字號:
;********************************************************
;AVR匯編程序實例:Demo_7_1.asm
;使用INT0、INT1控制LED數碼管顯示
;Mega16 4MHz
;********************************************************
.include "m16def.inc"
.def temp = r23 ;臨時變量
.def counter = r24 ;計數變量
;中斷向量區配置,FLASH空間$000~$028
.org $000
jmp RESET ; 復位處理
jmp EXT_INT0 ; IRQ0 中斷向量
jmp EXT_INT1 ; IRQ1 中斷向量
reti ; Timer2 比較中斷向量
nop
reti ; Timer2 溢出中斷向量
nop
reti ; Timer1 捕捉中斷向量
nop
reti ; Timer1 比較A 中斷向量
nop
reti ; Timer1 比較B 中斷向量
nop
reti ; Timer1 溢出中斷向量
nop
reti ; Timer0 溢出中斷向量
nop
reti ; SPI 傳輸結束中斷向量
nop
reti ; USART RX 結束中斷向量
nop
reti ; UDR 空中斷向量
nop
reti ; USART TX 結束中斷向量
nop
reti ; ADC 轉換結束中斷向量
nop
reti ; EEPROM 就緒中斷向量
nop
reti ; 模擬比較器中斷向量
nop
reti ; 兩線串行接口中斷向量
nop
reti ; IRQ2 中斷向量
nop
reti ; 定時器0 比較中斷向量
nop
reti ; SPM 就緒中斷向量
nop
.org $02A
RESET: ; 上電初始化程序
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, low(RAMEND)
out SPL, r16 ; 設置堆棧指針為RAM 的頂部
ser temp
out ddra, temp ; 設置PORTA為輸出,段碼輸出
out porta,temp ; 設置PORTA輸出全1
ldi temp, 0x0a
out mcucr, temp ; INT0、INT1下降沿觸發
ldi temp, 0xc0
out gicr, temp ; 允許INT0、INT1中斷
out gifr, temp ; 清除INT0、INT1中斷標志位
clr counter
sei ; 使能中斷
MAIN:
clr r0
ldi zl, low(led_7 * 2)
ldi zh, high(led_7 * 2) ; Z寄存器取得7段碼組的首指針
add zl,counter ; 加上要顯示的數字
adc zh,r0 ; 加上低位進位
lpm ; 讀對應七段碼到R0中
out porta, r0 ; LED段碼輸出
rjmp MAIN ; 循環顯示
EXT_INT0:
in temp, sreg
push temp ; 中斷現場保護
inc counter ; 計數單元加1
cpi counter, 0x10 ; 與16比較
brne EXT_INT0_RET ; 小于16轉中斷返回
clr counter ; 計數單元清0
EXT_INT0_RET:
pop temp
out sreg, temp ; 中斷現場恢復
reti ; 中斷返回
EXT_INT1:
in temp, sreg
push temp ; 中斷現場保護
dec counter ; 計數單元減1
cpi counter, 0xFF ; 與255比較
brne EXT_INT1_RET ; 未到255轉中斷返回
ldi counter, 0x0F ; 計數單元設置為15
EXT_INT1_RET:
pop temp
out sreg, temp ; 中斷現場恢復
reti ; 中斷返回
led_7: ;7段碼表
.db 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07
.db 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -