一种不使用延迟的方式来闪烁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的闪烁而不阻塞其他代码的执行。