用汇编实现利用中断控制LED灯定时的亮和灭
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用汇编实现利用中断控制LED灯定时的亮和灭
;********************************************************
;AVR汇编程序实例
;使用INT0、INT1控制LED数码管显示
;Mega16 4MHz
;********************************************************
.include "m16def.inc"
.def temp = r23 ;临时变量
.def counter = r24 ;计数变量
.def flag=r25
;中断向量区配置,FLASH空间$000~$028
.org $000
jmp RESET ; 复位处理
jmp EXT_INT0 ; IRQ0 中断向量
nop
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 的顶部ldi r16, 156
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
clr flag
sei ; 使能中断
state: ldi zl, low(led_7 * 2)
ldi zh, high(led_7 * 2) ; Z寄存器取得7段码组的首指针clr counter
loop:
cpi flag,1
brbs 1,stop
cpi counter,0x10
brbs 1,state
lpm
inc counter
inc zl
out porta, r0
call delay
rjmp loop
stop: cpi flag,0
brbs 1,loop
rjmp stop
EXT_INT0: in temp, sreg
push temp
;mov temp,counter
;push temp
cpi flag,1
brbs 1,abc
inc flag
;pop temp
;mov counter, temp
pop temp
out sreg, temp ; 中断现场恢复
reti
abc: dec flag
pop temp
;mov counter,temp
;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