#include<iom16v.h>
#define uint unsigned int
#define uchar undigned char
void delay()
{
asm(" push r16");
asm("ldi r16,255")
asm(" del1: push r16");
asm(" del2: push r16");
asm(" del3: dec r16");
asm(" brne del3");
asm(" pop r16");
asm(" dec r16");
asm(" brne del2");
asm(" pop r16");
asm(" dec r16");
asm(" brne del1");
asm(" pop r16");
}
void main()
{
DDRB = 0xff;
PORTB = 0x00;
while(1)
{
PORTB = ~PORTB;
delay();
}
}
用软件延时实现起来是非常的不稳定,我试过了,用汇编编写的延时程几乎是很准确的,上面就是写好的程序,更改r16的值就可以该延时时间。
具体的参数为:
参数 延时时间
1,6.25us
2,13us
3,23.5us
4,38.5us
5,58.75us
6,85us
7,118us
8,158us
9,207us
10,265us
18,1ms
22,2ms
26,3ms
29,4ms
40,10ms
52,20ms
71,50ms
90,100ms
114,200ms
131,300ms
156,500ms
197,1000ms
255,2000ms
以上数据是时钟4M晶振,可以根据你的晶振频率更改。
文章评论(0条评论)
登录后参与讨论