一种不使用延迟的方式来闪烁LED的解决方法是使用定时器和中断。
以下是一个示例的代码:
#define LED_PIN 13
volatile bool toggle = false; // 全局变量,用于表示LED的状态
void setup() {
pinMode(LED_PIN, OUTPUT); // 将LED引脚设置为输出模式
// 设置定时器1工作模式
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// 设置定时器1的比较值
OCR1A = 15624; // 16MHz / (256 * 2Hz) - 1
// 启用定时器1的比较匹配A中断
TIMSK1 |= (1 << OCIE1A);
// 启用中断
sei();
}
void loop() {
// 主循环中不需要做任何事情
}
// 定时器1的比较匹配A中断处理函数
ISR(TIMER1_COMPA_vect) {
// 切换LED状态
toggle = !toggle;
if (toggle) {
digitalWrite(LED_PIN, HIGH); // 打开LED
} else {
digitalWrite(LED_PIN, LOW); // 关闭LED
}
}
以上代码通过定时器1的比较匹配A中断来控制LED的闪烁。定时器每次比较匹配后会调用中断处理函数,在处理函数中切换LED的状态并更新引脚的电平。
这种方法不使用延迟函数,可以实现LED的闪烁而不阻塞其他代码的执行。