const int segA = 7;
const int segB = 9;
const int segC = 5;
const int segD = 3;
const int segE = 2;
const int segF = 8;
const int segG = 6;
const int segPoint = 4;

const int digitMin = 10;    // Единицы минут
const int digitDecMin = 11; // Десятки минут
const int digitHour = 12;   // Единицы часов
const int digitDecHour = 13; // Десятки часов

const byte digits[10][7] = {
    {1, 1, 1, 1, 1, 1, 0}, // 0
    {0, 1, 1, 0, 0, 0, 0}, // 1
    {1, 1, 0, 1, 1, 0, 1}, // 2
    {1, 1, 1, 1, 0, 0, 1}, // 3
    {0, 1, 1, 0, 0, 1, 1}, // 4
    {1, 0, 1, 1, 0, 1, 1}, // 5
    {1, 0, 1, 1, 1, 1, 1}, // 6
    {1, 1, 1, 0, 0, 0, 0}, // 7
    {1, 1, 1, 1, 1, 1, 1}, // 8
    {1, 1, 1, 1, 0, 1, 1}  // 9
};

int hours = 0;  // Часы
int minutes = 0;  // Минуты
int seconds = 0;  // Секунды
int currentDigit = 0; // Переменная для текущей цифры, которую нужно отобразить

void setup() {
    // Настройка пинов как выходов
    digitalWrite(segA, OUTPUT);
    digitalWrite(segB, OUTPUT);
    digitalWrite(segC, OUTPUT);
    digitalWrite(segD, OUTPUT);
    digitalWrite(segE, OUTPUT);
    digitalWrite(segF, OUTPUT);
    digitalWrite(segG, OUTPUT);
    digitalWrite(segPoint, OUTPUT);
    digitalWrite(digitMin, OUTPUT);    // Единицы минут
    digitalWrite(digitDecMin, OUTPUT); // Десятки минут
    digitalWrite(digitHour, OUTPUT);   // Единицы часов
    digitalWrite(digitDecHour, OUTPUT); // Десятки часов
    updateDisplay();    // Изначально отображаем "00:00"
}

void displayDigit(int digit, int pin) {
    digitalWrite(pin, HIGH);
    digitalWrite(segA, digits[digit][0]);
    digitalWrite(segB, digits[digit][1]);
    digitalWrite(segC, digits[digit][2]);
    digitalWrite(segD, digits[digit][3]);
    digitalWrite(segE, digits[digit][4]);
    digitalWrite(segF, digits[digit][5]);
    digitalWrite(segG, digits[digit][6]);
    digitalWrite(pin, LOW);
}

void updateDisplay() {
    // Отключаем все цифры
    digitalWrite(digitDecHour, HIGH);
    digitalWrite(digitHour, HIGH);
    digitalWrite(digitDecMin, HIGH);
    digitalWrite(digitMin, HIGH);

    // Отключаем все точки перед обновлением
    digitalWrite(segPoint, LOW);
    
    // Отображаем каждую цифру по очереди
    switch (currentDigit) {
        case 0:
            displayDigit(hours / 10, digitDecHour); // Десятки часов
            break;
        case 1:
            if (seconds % 2 == 0) {
                digitalWrite(segPoint, HIGH);
            }
            displayDigit(hours % 10, digitHour);    // Единицы часов
            break;
        case 2:
            displayDigit(minutes / 10, digitDecMin); // Десятки минут
            digitalWrite(segPoint, LOW);
            break;
        case 3:
            displayDigit(minutes % 10, digitMin);   // Единицы минут
            break;
    }
    // Циклический переход к следующей цифре
    currentDigit = (currentDigit + 1) % 4;
}

void loop() {
    static unsigned long lastUpdateTime = 0;

    // Обновляем каждую секунду
    if (millis() - lastUpdateTime >= 1000) {
        lastUpdateTime = millis();
        seconds++;

        if (seconds >= 60) {
            seconds = 0;
            minutes++;
            if (minutes >= 60) {
                minutes = 0;
                hours++;
                if (hours >= 24) {
                    hours = 0;
                }
            }
        }
    }

    // Обновляем дисплей каждые 100 миллисекунд
    static unsigned long lastDisplayUpdate = 0;
    if (millis() - lastDisplayUpdate >= 10) {
        lastDisplayUpdate = millis();
        updateDisplay(); // Обновляем дисплей
    }
}