#include <Arduino.h>
// 定義七段顯示器的引腳 (A, B, C, D, E, F, G, DP)
const int segmentPins[] = {2, 4, 5, 18, 19, 21, 22, 23};
// 定義按鈕引腳
const int button1 = 32;
const int button2 = 33;
const int button3 = 25;
const int button4 = 26;
// 共陰極七段顯示器數字對應
const byte digits[10] =
{
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
volatile bool button1Pressed = false;
volatile bool button2Pressed = false;
volatile bool button3Pressed = false;
volatile bool button4Pressed = false;
int currentNumber = 0; // 紀錄當前顯示的數字
unsigned long debounceTime = 50; // 消除彈跳的時間間隔
unsigned long lastButton3Press = 0; // 記錄按鈕3最後按下的時間
bool isRunning = false; // 執行鎖,確保功能互不干擾
void IRAM_ATTR handleButton1()
{
if (!isRunning) button1Pressed = true;
}
void IRAM_ATTR handleButton2()
{
if (!isRunning) button2Pressed = true;
}
void IRAM_ATTR handleButton3()
{
unsigned long currentTime = millis();
if (!isRunning && (currentTime - lastButton3Press > debounceTime))
{
button3Pressed = true;
lastButton3Press = currentTime;
}
}
void IRAM_ATTR handleButton4()
{
if (!isRunning) button4Pressed = true;
}
void setup()
{
// 初始化七段顯示器引腳
for (int i = 0; i < 8; i++)
{
pinMode(segmentPins[i], OUTPUT);
digitalWrite(segmentPins[i], LOW);
}
// 初始化按鈕引腳
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);
// 設置中斷
attachInterrupt(button1, handleButton1, FALLING);
attachInterrupt(button2, handleButton2, FALLING);
attachInterrupt(button3, handleButton3, FALLING);
attachInterrupt(button4, handleButton4, FALLING);
}
void displayDigit(int num)
{
for (int i = 0; i < 8; i++)
{
digitalWrite(segmentPins[i], digits[num] & (1 << i));
}
}
void clearDisplay()
{
for (int i = 0; i < 8; i++)
{
digitalWrite(segmentPins[i], LOW);
}
}
void loop()
{
if (button1Pressed && !isRunning)
{
isRunning = true;
button1Pressed = false;
for (int i = currentNumber; i < 10; i++)
{
displayDigit(i);
currentNumber = i; // 更新當前數字
delay(1000);
if (digitalRead(button1) == LOW) break; // 中途重新觸發則跳出
}
isRunning = false;
}
if (button2Pressed && !isRunning)
{
isRunning = true;
button2Pressed = false;
for (int i = currentNumber; i >= 0; i--)
{
displayDigit(i);
currentNumber = i; // 更新當前數字
delay(1000);
if (digitalRead(button2) == LOW) break; // 中途重新觸發則跳出
}
isRunning = false;
}
if (button3Pressed && !isRunning)
{
isRunning = true;
button3Pressed = false;
int randomNum = random(0, 10);
displayDigit(randomNum);
currentNumber = randomNum; // 更新當前數字
while (digitalRead(button3) == LOW)
{
delay(2000); // 等待按鈕釋放
}
isRunning = false;
}
if (button4Pressed && !isRunning)
{
isRunning = true;
button4Pressed = false;
clearDisplay();
currentNumber = 0; // 清除時將當前數字重置
while (digitalRead(button4) == LOW)
{
delay(10); // 等待按鈕釋放
}
isRunning = false;
}
}