我有以下程序…
"写一个程序连续切换PORTB的所有位,有一些延迟。使用Timer0,正常模式,没有预分频器选项。"
#include….
void T0Delay()
int main ()
DDRB= 0xFF;
while (1) {
PORTB=0x55;
T0Delay();
PORTB=0xAA;
T0Delay();
}
void T0Delay ()
{
TCNT0=0x20;
TCCR0=0x01;
while ((TIFR&01)==0);
TCCR0=0;
TIFR=0x01;
}
在"TODelay()"函数中,"while ((TIFR&01)==0)"语句的函数是什么?为什么这个循环设置TCCR0=0和TIFR=0x01?有人能解释一下这段代码吗?
语句while ((TIFR&01)==0);
是整个循环。后面的两条语句不属于这个循环,在循环结束后执行。
这个循环的目的是等待直到TIFR
的最低有效位被设置。假定它在某处被声明为易失性整数,并映射到控制输入端口的地址(否则该循环将永远不会终止)。
while ((TIFR&01)==0);
为忙等待循环。它继续循环,直到表示计时器已过期的标志变为1。只有这样,流才会退出循环。
TIFR=0x01;
是一个特殊的指令。它实际上清除了国旗;也就是说,它将标志设置为0
而不是您可能期望的1
。
因此延迟函数设置定时器计数,启动定时器,然后忙忙碌碌地循环等待,直到定时器到达终点。之后,它清除计时器标志,允许再次使用计时器。
用循环检查整行,它不是以分号结束吗?这意味着循环体是一个空语句,并且用于循环。
赋值不是循环的一部分。
while循环继续检查并等待计时器溢出,一旦计时器溢出,它再次设置计时器,并返回