文档介绍:早就知道AVR的编译器有自带的延时子函数(或者说是头文件),但一直没时间一探究竟,今天终于揭开了其内幕。
AVR编译器众多,可谓是百家齐鸣,本人独尊WinAVR.
说明:编译器版本WinAVR-20080610
,进去一看果然有,可打开一看,其曰:“This file has been moved to <util/>."
在util文件夹中找到delay头文件如下:
--------------------------------------------------------------------------------------------------------------------------------------------
void
_delay_us(double __us)
{
uint8_t __ticks;
double __tmp = ((F_CPU) / 3e6) * __us; //3e6=3000000
if (__tmp < )
   __ticks = 1;
else if (__tmp > 255)
{
   _delay_ms(__us / );
   return;
}
else
   __ticks = (uint8_t)__tmp;
_delay_loop_1(__ticks);
}
-----------------------------------------------------------------------------------------------------------------------------------------------
_delay_ms(double __ms)
{
uint16_t __ticks;
double __tmp = ((F_CPU) / 4e3) * __ms;
if (__tmp < )
   __ticks = 1;
else if (__tmp > 65535)
{
   // __ticks = requested delay in 1/10 ms
   __ticks = (uint16_t) (__ms * );
   while(__ticks)
   {
    // wait 1/10 ms
    _delay_loop_2(((F_CPU) / 4e3) / 10);
    __ticks --;
   }
   return;
}
else
   __ticks = (uint16_t)__tmp;
_delay_loop_2(__ticks);
}
1、分析程序发现上面两个子函数,分别using _delay_loop_1() and using_delay_loop2()
2、还有一点,用此头文件时,必须设置主频和优化项,否则会出现如下提示:
   #ifndef F_CPU
   /* piler error by supplying a default */
   # warning "F_C