Загрузка данных


// 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();
}