// A, B, C, D, E, F, G, DP; DIG1…DIG4 слева направо
const byte SEG[] = {12, 11, 9, 7, 6, 12, 10, 8};
const byte DIG[] = {A3, A2, A1, A0};
const byte BTN = 5;
const byte CODE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F};
byte mode = 0, sec = 0; // 0 - сброс, 1 - счет, 2 - стоп
bool last = HIGH, stable = HIGH;
unsigned long changed = 0, tick = 0;
void setup() {
for (byte pin : SEG) pinMode(pin, OUTPUT);
for (byte pin : DIG) {
digitalWrite(pin, HIGH); // общий катод: HIGH гасит разряд
pinMode(pin, OUTPUT);
}
pinMode(BTN, INPUT_PULLUP);
}
void show() {
byte values[] = {0, 0, byte(sec / 10), byte(sec % 10)};
bool dot = mode == 1 && sec % 2 == 0;
for (byte pos = 0; pos < 4; pos++) {
byte bits = CODE[values[pos]] | (dot ? 0x80 : 0);
for (byte i = 0; i < 8; i++)
digitalWrite(SEG[i], bitRead(bits, i));
digitalWrite(DIG[pos], LOW);
delay(2);
digitalWrite(DIG[pos], HIGH);
}
}
void loop() {
unsigned long now = millis();
bool reading = digitalRead(BTN);
if (reading != last) changed = now;
last = reading;
if (reading != stable && now - changed >= 30) {
stable = reading;
if (stable == LOW) {
mode = (mode + 1) % 3;
if (mode == 1) tick = now;
if (mode == 0) sec - 0;
}
}
if (mode == 1 && now - tick >= 1000) {
tick += 1000;
if (++sec == 60) mode = 2;
}
show();
}