更新时间2018-10-31 12:26:34
.include "m128def.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"
ldi r21,1;
ldi r22,1;
ldi r23,1;
ldi r24,1;
ldi r25,1;
sts $0150,r21;
sts $0151,r22;
sts $0152,r23;
sts $0153,r24;
ldi r16,90;
loop:
rol r21;
mov r21,r25;
rol r24;
rol r23;
rol r22;
rol r21;
mov r25,r21;
sts $0150,r21;
sts $0151,r22;
sts $0152,r23;
sts $0153,r24;
rcall delay;
rjmp loop
loop1:
cbi portc,0 ;值PORTC.0位为"0",LED亮
rcall delay ;调用延时子程序,延时一秒
sbi portc,0 ;值PORTC.0位为"1",LED灭
rcall delay ;调用延时子程序,延时一秒
rjmp loop1 ;循环跳转到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)
汗!问这个问题说明你对时钟周期、机器周期、定时器周期都不太了解吧。延时100毫秒的程序可以是一个函数,也可以是利用定时器的一段代码。如果是用汇编延时那么你要把单片机指令周期表翻一下了,看看整个循环语句用了哪些指令,每个指令多少个机器周期,然后计算每个机器周期耗时多少时长,你就知道循环多少次了。如果用c语言延时,那么就要借助仪器了,你同样要估算一下机器周期和循环次数,然后要精确到100ms就需要把这个延时时间作为频率从单片机IO口输出,用仪器来辅助测量,最后得出叫准确的100ms的循环次数的值。如:void delay_100ms(uint8 n){uint16 i;while(n){for(i=0;i<xxx;i++)//此循环应为运行100ms,用仪器辅助得到xxx的值。不够就再在FOR一次。}}