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


const int segPins[]   = {6, 7, 8, 9, 10, 11, 12, 13};
const int digitPins[] = {5, 4, 3, 2};
const int buttonPin   = A2;

// Цифры 0..9 (бит7=a, ... бит0=dp)
const byte digitMasks[10] = {
  0b11111100, 0b01100000, 0b11011010, 0b11110010, 0b01100110,
  0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110
};

unsigned long startTime   = 0;
unsigned long elapsed     = 0;
bool          running     = false;
bool          lastButton  = HIGH;
unsigned long lastDebounce = 0;

void setup() {
  for (int i = 0; i < 8; i++) {
    pinMode(segPins[i], OUTPUT);
    digitalWrite(segPins[i], LOW);
  }
  for (int i = 0; i < 4; i++) {
    pinMode(digitPins[i], OUTPUT);
    digitalWrite(digitPins[i], HIGH);
  }
  pinMode(buttonPin, INPUT_PULLUP);
}

void updateButton() {
  bool btn = digitalRead(buttonPin);
  if (btn != lastButton && millis() - lastDebounce > 50) {
    lastDebounce = millis();
    lastButton = btn;
    if (btn == LOW) {                       // нажатие
      if (running) {
        elapsed += millis() - startTime;    // пауза
        running = false;
      } else {
        startTime = millis();               // старт/продолжение
        running = true;
      }
    }
  }
}

void loop() {
  updateButton();

  unsigned long totalMs  = elapsed + (running ? millis() - startTime : 0);
  unsigned long totalSec = totalMs / 1000;
  int sec = totalSec % 60;
  int min = (totalSec / 60) % 100;

  byte d0 = digitMasks[min / 10];
  byte d1 = digitMasks[min % 10];
  byte d2 = digitMasks[sec / 10];
  byte d3 = digitMasks[sec % 10];

  // Точка-разделитель мигает при работе
  if (!running || (millis() / 500) % 2 == 0)
    d1 |= 0b00000001;

  byte digits[4] = {d0, d1, d2, d3};

  // Динамическая индикация
  for (int i = 0; i < 4; i++) {
    for (int d = 0; d < 4; d++) digitalWrite(digitPins[d], HIGH);
    for (int s = 0; s < 8; s++) digitalWrite(segPins[s], bitRead(digits[i], 7 - s));
    digitalWrite(digitPins[i], LOW);
    delay(2);
  }
}