马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
- 下面是我学的第一篇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)
复制代码 |