我有以下程序......
“编写一个程序,以一定的延迟连续切换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? 有人可以解释这段代码吗?
答案 0 :(得分:6)
语句while ((TIFR&01)==0);
是整个循环。后面的两个语句不是此循环的一部分,并在循环结束后执行。
此循环的目的是等到TIFR
的最低有效位置位。据推测,这被声明为一个易失整数,并映射到控制输入端口的地址(否则此循环将永远不会终止)。
答案 1 :(得分:2)
while ((TIFR&01)==0);
是一个忙碌的等待循环。它会继续循环,直到指示计时器已过期的标志更改为1.只有这样,流才会退出循环。
TIFR=0x01;
是一种特殊的指示。它实际上清除了旗帜;也就是说,它会将标记设置为0
而不是1
,如您所料。
因此延迟功能设置定时器计数,启动定时器,然后忙等待循环,直到定时器到达结束。之后它清除定时器标志以允许再次使用定时器。
答案 2 :(得分:0)
用循环检查整行,不要用分号结尾?这意味着循环体是一个空语句,并且它是循环。
分配不是循环的一部分。
答案 3 :(得分:0)
while循环继续检查并等待定时器溢出,一旦定时器溢出,它再次设置定时器,并返回