Урок 18: 4-разрядный 7-сегментный индикатор
1. Зачем нужен 4-разрядный 7-сегментный индикатор
4-разрядный 7-сегментный светодиодный индикатор позволяет отображать числа (и некоторые буквы) на четырёх разрядах, что удобно для создания часов, таймеров, счётчиков и других устройств с цифровой индикацией. Управление таким индикатором на Arduino — отличный способ познакомиться с принципами мультиплексирования и работы с несколькими сегментами.
2. Оборудование
Кол-во |
Деталь |
---|---|
1 |
Плата Arduino UNO |
1 |
4-разрядный 7-сегментный индикатор |
8 |
Резисторы 220 Ω |
1 |
Макетная плата (breadboard) |
12 |
Провода-перемычки |
1 |
USB-кабель A-B |
3. Внешний вид и распиновка
4. Схема подключения

Варианты подключения резисторов:
Вариант 1: Один резистор на каждый катод (всего 4). Преимущество — меньше резисторов, но яркость сегментов может отличаться в зависимости от числа одновременно горящих сегментов.
Вариант 2: Один резистор на каждый сегмент (всего 8). Гарантирует постоянную яркость, но требует больше резисторов. В этом уроке используется этот вариант (8 резисторов по 220 Ом).
5. Принцип работы
4-разрядный индикатор содержит 12 пинов. При размещении индикатора десятичной точкой вниз, пин в нижнем левом углу — 1, в верхнем левом — 12. Каждый сегмент (a–g, dp) и каждый разряд (d1–d4) подключается к отдельному пину Arduino через резистор.
Мультиплексирование позволяет зажигать поочерёдно каждый разряд, быстро переключая их, чтобы для глаза они светились одновременно.
6. Пример кода
///////////////////////////////////////////////////////////////
// 4-разрядный 7 - Сегментный Светодиодный Индикатор
// выбор пина для каждого сегмента
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g = 7;
int dp = 8;
// выбор пина для анода
int d4 = 9;
int d3 = 10;
int d2 = 11;
int d1 = 12;
// установка переменной
long n = 1230;
int x = 100;
int del = 55; // тонкая настройка времени
void setup() {
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(dp, OUTPUT);
}
void loop() {
Display(1, 5);
Display(2, 6);
Display(3, 4);
Display(4, 1);
}
void setSegment(unsigned char n) {
switch (n) {
case 1:
digitalWrite(d1, LOW);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
break;
case 2:
digitalWrite(d1, HIGH);
digitalWrite(d2, LOW);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
break;
case 3:
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, LOW);
digitalWrite(d4, HIGH);
break;
case 4:
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, LOW);
break;
default:
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
break;
}
}
void Num_0() {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
digitalWrite(dp, LOW);
}
void Num_1() {
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(dp, LOW);
}
void Num_2() {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
void Num_3() {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
void Num_4() {
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
void Num_5() {
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
void Num_6() {
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
void Num_7() {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(dp, LOW);
}
void Num_8() {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
void Num_9() {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
void Clear() { // очистка экрана
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(dp, LOW);
}
void pickNumber(unsigned char n) { // выбор числа
switch (n) {
case 0: Num_0(); break;
case 1: Num_1(); break;
case 2: Num_2(); break;
case 3: Num_3(); break;
case 4: Num_4(); break;
case 5: Num_5(); break;
case 6: Num_6(); break;
case 7: Num_7(); break;
case 8: Num_8(); break;
case 9: Num_9(); break;
default: Clear(); break;
}
}
void Display(unsigned char x, unsigned char Number) { // установка x как координаты и отображение числа
setSegment(x);
pickNumber(Number);
delay(1);
Clear(); // очистка экрана
}
///////////////////////////////////////////////////////////////
7. Результат
Загрузите приведённый выше код на плату Arduino, и вы увидите, что светодиодный дисплей показывает число 1234. Если отображение некорректно — проверьте подключение.
8. Типовые проблемы
Симптом |
Причина |
Решение |
---|---|---|
Не все сегменты светятся |
Ошибка в подключении или плохой контакт |
Проверьте схему, убедитесь в надёжности соединений |
Яркость сегментов разная |
Используется только 4 резистора (на катоды) |
Используйте 8 резисторов (на каждый сегмент) |
Сегменты светятся тускло |
Слишком большие резисторы |
Используйте 220 Ом или 100 Ом |
9. Идеи для расширения
Реализуйте отображение счётчика или часов
Добавьте управление с кнопок или энкодера
Используйте сдвиговые регистры для экономии пинов Arduino