【发布时间】:2021-10-16 15:16:03
【问题描述】:
/*
T=1/8MHz=0.125us
0>>>256=32us time for 1 clock
1/32*(10^-6)
so we need 31250 clock to generate 1 sec
for prescaling 256 we need 123 clock
*/
/*
123 CLOCK FOR 1 SEC
SO 1230 CLOCK FOR 10 SEC
*/
#define F_CPU 8000000UL
#include <avr/io.h>
void T0delay()
{
TCNT0 = 0;
TCCR0 = 0x04;
while (TIFR & (1<<TOV0)==0);
TCNT0 = 0;
TIFR =0x01;
}
int main(void)
{
int counter=0;
int i=0;
int j=6;
DDRC=0xff;
DDRD=0xff;
PORTC=i;
PORTD=j;
while (1)
{
T0delay();
counter++ ;
if(counter == 123)
{
i--;
if(i < 0)
{
i = 9;
PORTD--;
if(PORTD == 0 & PORTC == 0 )
{
PORTD =0;
PORTC =0;
}
}
PORTC=i;
}
}
}
端口 c 用于将计时器从 9 降到 0,每秒计数。 行为不准确,因为它不会等待整整一秒。 而端口 d 用于将定时器从 6 降到 0 计数端口 c 7 段的每个周期(9 到 0)。 该行为不正确,因为它从 6 计数到 0,然后显示不需要的片段。
【问题讨论】:
-
您可能需要说明您使用哪种设备来帮助回答问题。
-
我认为
if(PORTD == 0 & PORTC == 0 )中的&运算符看起来非常可疑。你的意思是if(PORTD == 0 && PORTC == 0 )? -
@JonathonS。设备 atmega 16
-
@Cheatah 还是没什么区别
-
对 PORTC 和 PORTD 进行 if 测试有什么意义:如果两者都是 0,则将它们设置为 0?