|
发表于 2011-9-22 17:34:24
|
显示全部楼层
回复【3楼】machao
-----------------------------------------------------------------------
;AVR汇编程序实例:Demo_5_1.asm
.include "m16def.inc"
.def temp1 = r20
.def temp2 = r21
.org $0000rjmp reset
.org $002a
reset:
ldi r16, high(ramend);RAM的最大地址 用于初始化堆栈指针
out sph, r16
ldi r16, low(ramend)
out spl, r16
ser temp1;temp1 = $ff
clr temp2;temp2 = $00
out ddrb,temp1
out portb,temp1
ldi r16, 200;R16 = 197
loop:
cbi portb, 0
rcall delay
sbi portb, 0
rcall delay
rjmp loop
delay:
push r16;<----here
del1:
push r16
del2:
push r16
del3:
dec r16
brne del3;if Z == 0, then jump to label:del3
pop r16
dec r16
brne del2
pop r16
dec r16
brne del1
pop r16<----and here
ret
请教哈马老师,您这组对堆栈的操作有什么特别的意义呢?我用的是11.0592的Hz的晶振,用示波器测得的方波为1.38Hz;当我把这组堆栈操作去掉后,用示波器测的的方波为0.86Hz。很是疑惑:延时函数的执行时间变短了,那么引脚上输出的方波频率应该变高嘛,怎么会变小呢?如果把这组堆栈操作的寄存器改为其他的寄存器(有别与延时函数里的寄存器)也是如此。劳烦马老师给讲解讲解。谢谢! |
|