// Матрица 4-разрядная из 7-сегментных индикаторов
// Вывод случайной цифры (0–9) на произвольный регистр матрицы
// Список выводов Arduino для подключения к разрядам a-g
// семисегментного индикатора
int pins[8] = {9, 13, 4, 6, 7, 10, 3, 5};
// Значения для вывода цифр 0-9
byte numbers[10] = { B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B10111110, // 6
B11100000, // 7
B11111110, // 8
B11100110 // 9
};
// Список выводов Arduino для выбора матрицы 0-3
int pindigits[4] = {2, 8, 11, 12};
// Переменная для хранения значения текущей цифры
// семисегментного индикатора
int number = 0;
// Переменные для хранения значения секунд и десятков секунд
int seconds = 0;
int tens_seconds = 0;
// Переменная для хранения текущего разряда
int digit = 0;
// Для отсчета времени
unsigned long previousMillis = 0;
const long interval = 1000; // Интервал 1 секунда
void setup() {
// Конфигурируем контакты как выходы
for(int i = 0; i < 8; i++)
pinMode(pins[i], OUTPUT);
for(int i = 0; i < 4; i++) {
pinMode(pindigits[i], OUTPUT);
digitalWrite(pindigits[i], HIGH);
}
}
void loop() {
unsigned long currentMillis = millis();
// Обновляем секундомер каждую секунду
if (currentMillis - previousMillis >= interval) {
updateTimer();
previousMillis = currentMillis;
}
// Выводим значение секундомера на дисплей
displayTimer();
}
// Функция для обновления секундомера
void updateTimer() {
seconds++;
if (seconds >= 10) {
seconds = 0;
tens_seconds++;
if (tens_seconds >= 10) {
tens_seconds = 0;
}
}
}
// Функция для вывода цифры на семисегментный индикатор
void setNumber(int num) {
for(int i = 0; i < 7; i++) {
if(bitRead(numbers[num], 7-i) == HIGH) // Зажечь сегмент
digitalWrite(pins[i], HIGH);
else // Потушить сегмент
digitalWrite(pins[i], LOW);
}
}
// Функция для вывода значений секундомера на дисплей
void displayTimer() {
// Переключаем разряды поочередно
digitalWrite(pindigits[digit], HIGH);
// Выводим значения секунд и десятков секунд
if (digit == 0) {
setNumber(tens_seconds);
} else {
setNumber(seconds);
}
digit = (digit + 1) % 2; // Переключаемся между разрядами
digitalWrite(pindigits[digit], LOW);
}