Arduino 按鈕按2秒 led閃爍5次
2025/01/13 21:01
瀏覽114
迴響0
推薦0
引用0
#include <avr/io.h>
#include <avr/interrupt.h>
const int buttonPin = 2; // 按鈕接腳
const int ledPin = 13; // LED 接腳
volatile bool buttonLow = false; // 記錄按鈕是否為 LOW 狀態
volatile unsigned long lowDuration = 0; // 記錄按鈕為 LOW 的時間
volatile unsigned long debounceTime = 0; // 去抖動時間計時
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // 設定按鈕為輸入,啟用內建上拉電阻
pinMode(ledPin, OUTPUT); // 設定 LED 為輸出
digitalWrite(ledPin, LOW); // 初始化 LED 為關閉
// 停止 Timer1
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// 設定 Timer1 預分頻器為 1024
TCCR1B |= (1 << CS12) | (1 << CS10);
// 啟用 CTC 模式
TCCR1B |= (1 << WGM12);
// 設定比較值,每 1 毫秒觸發一次中斷 (16 MHz 主頻,預分頻 1024)
OCR1A = 15;
// 啟用 Timer Compare A 中斷
TIMSK1 |= (1 << OCIE1A);
// 啟用全局中斷
sei();
}
void loop() {
if (lowDuration >= 2000 && buttonLow) {
// 如果按鈕為 LOW 狀態持續 2 秒,LED 閃爍
for (int i = 0; i < 5; i++) { // 閃爍 5 次
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
}
lowDuration = 0; // 重置計時
buttonLow = false; // 重置狀態
}
// 去抖動處理,只有按鈕穩定為 LOW 一段時間才開始計時
if (digitalRead(buttonPin) == LOW) {
if (debounceTime == 0) {
debounceTime = millis(); // 開始記錄去抖動時間
}
if (millis() - debounceTime > 50) { // 50ms 去抖動時間
buttonLow = true; // 按鈕為 LOW 狀態
}
} else {
buttonLow = false; // 按鈕恢復到非 LOW 狀態
lowDuration = 0; // 重置計時
debounceTime = 0; // 重置去抖動計時
}
}
// Timer1 中斷服務例程,每 1 毫秒執行一次
ISR(TIMER1_COMPA_vect) {
if (buttonLow) {
lowDuration++; // 計算按鈕為 LOW 的時間
}
}
限會員,要發表迴響,請先登入



