const int redLed = 2;
const int yellowLed = 3;
const int greenLed = 4;
const int buttonPin = 5; // 按钮引脚
// 数码管段位定义
const int segmentPins[7] = {8, 9, 10, 11, 12, 13, 14};
// 数码管显示的数字对应的段码(共阴极)
const byte numbers[10] = {
B00111111, // 0
B00000110, // 1
B01011011, // 2
B01001111, // 3
B01100110, // 4
B01101101, // 5
B01111101, // 6
B00000111, // 7
B01111111, // 8
B01101111 // 9
};
int currentNumber = 30; // 初始倒计时时间(秒)
bool isCountingDown = true; // 是否在倒计时
unsigned long previousMillis = 0; // 上一次更新的时间
const long interval = 1000; // 间隔时间(毫秒)
void setup() {
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // 使用内部上拉电阻
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
}
}
void loop() {
if (digitalRead(buttonPin) == LOW) { // 如果按下按钮,重置倒计时
currentNumber = 30;
isCountingDown = true;
delay(200); // 防抖处理
}
if (isCountingDown) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
currentNumber--;
if (currentNumber < 0) {
currentNumber = 30; // 重置倒计时
}
}
}
displayNumber(currentNumber);
controlTrafficLights(currentNumber);
}
void displayNumber(int num) {
int digits[2];
digits[0] = num / 10; // 十位
digits[1] = num % 10; // 个位
for (int i = 0; i < 2; i++) {
digitalWrite(segmentPins[i], LOW); // 关闭当前位的显示
for (int j = 0; j < 7; j++) {
digitalWrite(segmentPins[j], bitRead(numbers[digits[i]], j));
}
delay(5); // 确保显示稳定
digitalWrite(segmentPins[i], HIGH); // 打开当前位的显示
}
}
void controlTrafficLights(int num) {
if (num > 25) { // 绿灯亮
digitalWrite(greenLed, HIGH);
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, LOW);
} else if (num > 20) { // 黄灯亮
digitalWrite(greenLed, LOW);
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, HIGH);
} else { // 红灯亮
digitalWrite(greenLed, LOW);
digitalWrite(redLed, HIGH);
digitalWrite(yellowLed, LOW);
}
}