const int segments[] = {2, 3, 4, 5, 6, 7, 8, 9}; // 七段顯示器的 a~dot 接腳
const int digits[] = {10, 11, 12, 13}; // 顯示器的共陰極 COM1~COM4
// 定義數字對應的編碼 (共陰極)
const byte numbers[10] = {
0x3F, // 0 - 0111111
0x06, // 1 - 0000110
0x5B, // 2 - 1011011
0x4F, // 3 - 1001111
0x66, // 4 - 1100110
0x6D, // 5 - 1101101
0x7D, // 6 - 1111101
0x07, // 7 - 0000111
0x7F, // 8 - 1111111
0x6F // 9 - 1101111
};
int displayValue = 0; // 要顯示的數值
unsigned long previousMillis = 0; // 上次更新的時間
const long interval = 50; // 更新間隔 (0.3秒)
void setup() {
for (int i = 0; i < 8; i++) {
pinMode(segments[i], OUTPUT);
}
for (int i = 0; i < 4; i++) {
pinMode(digits[i], OUTPUT);
digitalWrite(digits[i], HIGH); // 初始化為高電平
}
}
// 顯示數字的函數
void displayNumber(int number, int position) {
for (int i = 0; i < 8; i++) {
digitalWrite(segments[i], (numbers[number] >> i) & 0x01 ? 0 : 1);
}
digitalWrite(digits[position], 1); // 選擇位置
delay(5); // 短暫延遲
digitalWrite(digits[position], 0); // 關閉位置
}
void loop() {
unsigned long currentMillis = millis();
// 每0.3秒加1
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
displayValue++;
if (displayValue == 10000) {
displayValue = 0;
}
}
// 取得數字的每一位
int thousands = (displayValue / 1000) % 10;
int hundreds = (displayValue / 100) % 10;
int tens = (displayValue / 10) % 10;
int units = displayValue % 10;
// 顯示四位數字
displayNumber(thousands, 0);
displayNumber(hundreds, 1);
displayNumber(tens, 2);
displayNumber(units, 3);
}