📄 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 + -