我们可以使用Atmega8的定时器来测量按下按钮的时间。以下是实现此功能的代码示例:
#include
#include
#define F_CPU 1000000UL
volatile uint16_t count = 0; //计数器变量
void InitTimer0()
{
TCCR0B |= (1 << CS02) | (1 << CS00); //设置计时器分频比为1024
TIMSK0 |= (1 << TOIE0); //启用计时器0的溢出中断
sei(); //开启全局中断
}
ISR(TIMER0_OVF_vect) //定时器0溢出中断
{
count++; //每次溢出计数器加1
}
int main(void)
{
DDRD &= ~(1 << PD2); //设置PD2为输入模式
PORTD |= (1 << PD2); //PD2上拉电阻
InitTimer0(); //初始化定时器0
while(1)
{
if(!(PIND & (1 << PD2))) //检测PD2是否被按下
{
count = 0; //清除上一次计数结果
while(!(PIND & (1 << PD2))); //当PD2被松开时退出循环
}
if(count >= 781) //当计数器大于等于781时,按下按钮已超过3秒
{
//执行相应的操作
count = 0; //重置计数器
}
}
}
上面的代码使用了Atmega8的定时器0来实现按下按钮的时间测量,当按下按钮时,计数器开始计数,当按钮松开时,计数器停止。可以通过修改计数器的值来实现不同时间的测量。