下面是我学的第一篇AVR汇编程序 是控制一个LED灯闪烁
感觉AVR的汇编指令还可以
每一句语句都解释得很清楚
.include "m16def.inc" ;包括器件配置定义文件,不能缺少
.def temp1=r20 ;定义寄存器R20用临时变量名temp1代表
.org $0000 ;上电复位启始地址
rjmp reset ;转上电复位后的初始化程序执行
;中断向量区
.org $002A ;跳过中断向量区
reset: ldi r16,high(RAMEND) ;取内部RAM最高地址的高位字节
out sph,r16 ;放入SP的高位
ldi r16,low(RAMEND) ;取内部RAM最低地址的低位字节
out spl,r16 ;放入SP的低位,SP中的值见器件配置文件“m16def.inc”
ser temp1 ;置temp1(R20)为0XFF
out ddrc,temp1 ;定义PC口为输出
out portc,temp1 ;PC口输出全“1”,LED不亮
ldi r16,197 ;设置一秒延时参数
loop: cbi portc,0 ;值PORTC.0位为“0”,LED亮
rcall delay ;调用延时子程序,延时一秒
sbi portc,0 ;值PORTC.0位为“1”,LED灭
rcall delay ;调用延时子程序,延时一秒
rjmp loop ;循环跳转到loop继续执行
;通用延时子程序
delay: push r16 ;压栈(2t)
del1: push r16 ;压栈(2t)
del2: push r16 ;压栈(2t)
del3: dec r16 ;r16 = r16 - 1,(1t)
brne del3 ;不为0跳转移,为0顺序执行(2t/1t)
pop r16 ;出栈(2t)
dec r16 ;r16 = r16 - 1,(1t)
brne del2 ;不为0跳转移,为0顺序执行(2t/1t)
pop r16 ;出栈(2t)
dec r16 ;r16 = r16 - 1,(1t)
brne del1 ;不为0跳转移,为0顺序执行(2t/1t)
pop r16 ;出栈(2t)
ret ;子程序返回(4t)
文章评论(0条评论)
登录后参与讨论