原创 AVR汇编学习

2010-4-27 15:10 3015 6 6 分类: MCU/ 嵌入式

下面是我学的第一篇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)

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条