int firstSegmentPin = 2; // Подключение 1-го сегмента (A) к пину
int segmentCount = 8; // Сколько всего сегментов подключим подряд
int digitCount = 4; // На сколько порядков дисплей (единицы, десятки, сотни, тысячи)
byte numberSegments[10] = { // Коды для цифр от 0 до 9
0b00111111, // цифра 0
0b00000110, // цифра 1
0b01011011, // цифра 2
0b01001111, // цифра 3
0b01100110, // цифра 4
0b01101101, // цифра 5
0b01111101, // цифра 6
0b00000111, // цифра 7
0b01111111, // цифра 8
0b01101111 // цифра 9
};
byte digitSelect[5] = { // Какой разряд высветить
0b00000000, // очистка экрана
0b00001000, // единицы
0b00000100, // десятки
0b00000010, // сотни
0b00000001 // тысячи
};
int count = 9999; // Начальное значение счётчика
void setup() {
// Инициализируем все пины начиная с firstSegmentPin
for (int i = 0; i < segmentCount + digitCount; i++) {
pinMode(i + firstSegmentPin, OUTPUT);
}
}
void loop() {
// Проходим по всем порядкам (разрядам)
for (int i = count; i >= 0; i--) {
displayNumber(i); // Отображение текущего значения счётчика
delay(1000); // Задержка 1 секунда
}
count = 9999; // Сбрасываем счётчик на 9999 после достижения 0
}
void displayNumber(int number) {
// Проходим по всем разрядам (единицы, десятки, сотни, тысячи)
for (int i = 0; i < digitCount; i++) {
// Получаем значение текущего разряда
int digitValue = 0;
// Вычисляем значение разряда
int divisor = 1;
for (int j = 0; j < digitCount - 1 - i; j++) {
divisor *= 10; // Увеличиваем делитель по разрядам (10, 100, 1000, ...)
}
digitValue = number / divisor; // Записываем значение разряда
number -= digitValue * divisor; // Убираем этот разряд из числа
// Устанавливаем выбор текущего разряда
digitalWrite(i + firstSegmentPin + segmentCount, LOW); // Активируем текущий разряд
// Отображаем цифры на дисплее
byte mask = numberSegments[digitValue]; // Получаем маску для этой цифры
for (int j = 0; j < segmentCount; j++) {
boolean stateSegment = bitRead(mask, j); // Определяем, какой сегмент надо включить
digitalWrite(j + firstSegmentPin, !stateSegment); // Включаем/выключаем сегмент на основе полученного значения
}
delay(5); // Короткая задержка для избежания мерцания
digitalWrite(i + firstSegmentPin + segmentCount, HIGH); // Деактивируем текущий разряд
}
}