// Определяем пины
const int firstSegmentPin = 2; // Подключение 1-го сегмента (A) к пину
const int segmentCount = 8; // Количество сегментов
const int digitCount = 4; // Количество разрядов (единицы, десятки, сотни, тысячи)
// Битовые коды для цифр
const byte segmentCodes[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
int digitPins[4]; // Массив пинов для разрядов
int userInput = 0; // Переменная для хранения пользовательского ввода
int currentCount = 0; // Переменная для счётчика
unsigned long lastUpdateTime = 0; // Время последнего обновления
// Интервал обновления в миллисекундах
const unsigned long updateInterval = 1000;
void setup() {
Serial.begin(115200); // Запуск серийного порта
initializePins(); // Настройка пинов
Serial.println("Введите число: "); // Запрос пользователю
}
void loop() {
if (Serial.available() > 0) {
userInput = Serial.parseInt(); // Чтение введенного числа
Serial.read(); // Очистка остатка данных
currentCount = userInput; // Устанавливаем текущее значение счётчика равным вводу
Serial.print("Начинаем считать от: ");
Serial.println(currentCount); // Вывод на монитор
}
displayNumber(currentCount); // Отображение текущего числа
// Установка отрицательных значений в 0 или больших 9999
if (currentCount < 0 || currentCount > 9999) currentCount = 0;
if (millis() - lastUpdateTime >= updateInterval) {
lastUpdateTime = millis(); // Обновляем время последнего обновления
currentCount--; // Уменьшаем счётчик
if (currentCount == 0) {
Serial.println("Счетчик достиг нуля."); // Уведомление о достижении нуля
Serial.println("Введите новое число: "); // Запрос нового ввода
}
}
}
// Функция инициализации пинов
void initializePins() {
for (int i = 0; i < segmentCount; i++) {
pinMode(firstSegmentPin + i, OUTPUT); // Настройка сегментов
}
for (int i = 0; i < digitCount; i++) {
digitPins[i] = firstSegmentPin + segmentCount + i; // Определяем пины для разрядов
pinMode(digitPins[i], OUTPUT); // Настройка разрядов
}
}
// Очистка дисплея
void clearDisplay() {
for (int i = 0; i < segmentCount; i++) {
digitalWrite(firstSegmentPin + i, HIGH); // Выключение всех сегментов
}
}
// Отображение отдельной цифры на 7-сегментном дисплее
void displayDigit(int digit) {
for (int i = 0; i < segmentCount; i++) {
digitalWrite(firstSegmentPin + i, (segmentCodes[digit] >> i) & 0b00000001 ? LOW : HIGH);
}
}
// Отображение числа на дисплее
void displayNumber(int number) {
// Получение разрядов
int thousands = (number / 1000) % 10;
int hundreds = (number / 100) % 10;
int tens = (number / 10) % 10;
int units = number % 10;
// Отображение разрядов по одному
if(thousands>0 || number==0){
displayWithDigit(thousands, 0);
}
if(thousands>0 || hundreds>0 || number==0){
displayWithDigit(hundreds, 1);
}
if(thousands>0 || hundreds>0 || tens>0 || number==0){
displayWithDigit(tens, 2);
}
displayWithDigit(units, 3);
}
// Функция отображения конкретного разряда
void displayWithDigit(int digit, int position) {
digitalWrite(digitPins[position], HIGH); // Включаем нужный разряд
displayDigit(digit); // Отображаем цифру
clearDisplay(); // Очистка дисплея
digitalWrite(digitPins[position], LOW); // Выключаем разряд
}