


Привет! Мы рассмотрели одноразрядный индикатор. А теперь посмотрим на четырехразрядный 7 сегментный индикатор.
Содержание
Как и одноразрядный индикатор, это несколько светодиодов собранных в общий корпус. Одинаковые светодиоды каждого разряда управляются общими контактами. А для использования разных разрядов служат управляющие регистры.
В прошлый раз мы рассмотрели одноразрядный индикатор. Посмотрите тот пост, если уже забыли или пропустили его.
Для того, чтобы выполнить этот урок нам понадобиться.
- Ардуино UNO
- Макетная плата
- Перемычки
- 8 резисторов 220 Ом
- 7-сегментный четырехразрядный индикатор
- Кабель USB
Четырехразрядный индикатор



Не забудьте подключить светодиоды последовательно с сопротивлением. А разрядные контакты можно подключить напрямую к пинам Ардуино.
Схема и программа



В схеме опять много проводов. Но смысл опять в том, чтобы соединить 8 светодиодов и 4 разряда с пинами Ардуино для их адресации.
Чтобы было проще понять какие пины соединять между собой обратим внимание на таблицу.
Цифровой пин Ардуино | Пин индикатора |
2 | B |
3 | G |
4 | C |
5 | DP |
6 | D |
7 | E |
8 | F |
9 | A |
10 | 4 |
11 | 3 |
12 | 2 |
13 | 1 |
Напишем простой скетч, чтобы проверить индикатор и правильность схемы.



void setup(){
for( int j=2; j <= 13; j++){
pinMode(j, OUTPUT);
}
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}
void loop(){
for( int j=2; j <= 9; j++){
digitalWrite(j, LOW);
}
for(int i=2; i<=9; i++){
digitalWrite(i, HIGH);
delay(200);
}
}
В прошлый раз мы написали функцию для отображения чисел на одноразрядном индикаторе. Давайте улучшим ее для четырехразрядного индикатора.



int a = 9;
int b = 2;
int c = 4;
int d = 6;
int e = 7;
int f = 8;
int g = 3;
int p = 5;
int d4 = 10;
int d3 = 11;
int d2 = 12;
int d1 = 13;
int x = 1;
int del = 500;
void setup(){
for( int j=2; j <= 13; j++){
pinMode(j, OUTPUT);
}
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}
void loop(){
digit(x);
delay(del);
clean();
x++;
if (x == 10){x=0;}
}
void clean(){
for( int j=2; j <= 9; j++){
digitalWrite(j, LOW);
}
}
void digit(int x){
switch (x) {
case 1:
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
break;
case 2:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (d,HIGH);
digitalWrite (e,HIGH);
digitalWrite (g,HIGH);
break;
case 3:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (g,HIGH);
break;
case 4:
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
digitalWrite (f,HIGH);
digitalWrite (g,HIGH);
break;
case 5:
digitalWrite (a,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (f,HIGH);
digitalWrite (g,HIGH);
break;
case 6:
digitalWrite (a,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (e,HIGH);
digitalWrite (f,HIGH);
digitalWrite (g,HIGH);
break;
case 7:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
break;
case 8:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (e,HIGH);
digitalWrite (f,HIGH);
digitalWrite (g,HIGH);
break;
case 9:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (f,HIGH);
digitalWrite (g,HIGH);
break;
case 0:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (e,HIGH);
digitalWrite (f,HIGH);
break;
}
}
Назовем сегменты переменными, чтобы проще к ним обращаться. И выведем одно число на каждом разряде.
Теперь осталось только научить программу выводить числа от 1 до 9999 и использовать точку. Давайте попробуем.



Полный текст программы
int a = 9;
int b = 2;
int c = 4;
int d = 6;
int e = 7;
int f = 8;
int g = 3;
int p = 5;
int d4 = 10;
int d3 = 11;
int d2 = 12;
int d1 = 13;
int x = 1;
int r = 0;
int del = 500;
void setup(){
for( int j=2; j <= 13; j++){
pinMode(j, OUTPUT);
}
}
void loop(){
BigDigit(1234);
}
void BigDigit(int x){
r = 3;
do{
rank(r);
digit(x%10);
x = x/10;
r--;
}while(x);
}
void rank(int x){
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
switch(x){
case 0:
digitalWrite(d1, LOW);
break;
case 1:
digitalWrite(d2, LOW);
break;
case 2:
digitalWrite(d3, LOW);
break;
case 3:
digitalWrite(d4, LOW);
break;
}
}
void clean(){
for( int j=2; j <= 9; j++){
digitalWrite(j, LOW);
}
}
void digit(int x){
clean();
switch (x) {
case 1:
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
break;
case 2:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (d,HIGH);
digitalWrite (e,HIGH);
digitalWrite (g,HIGH);
break;
case 3:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (g,HIGH);
break;
case 4:
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
digitalWrite (f,HIGH);
digitalWrite (g,HIGH);
break;
case 5:
digitalWrite (a,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (f,HIGH);
digitalWrite (g,HIGH);
break;
case 6:
digitalWrite (a,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (e,HIGH);
digitalWrite (f,HIGH);
digitalWrite (g,HIGH);
break;
case 7:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
break;
case 8:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (e,HIGH);
digitalWrite (f,HIGH);
digitalWrite (g,HIGH);
break;
case 9:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (f,HIGH);
digitalWrite (g,HIGH);
break;
case 0:
digitalWrite (a,HIGH);
digitalWrite (b,HIGH);
digitalWrite (c,HIGH);
digitalWrite (d,HIGH);
digitalWrite (e,HIGH);
digitalWrite (f,HIGH);
break;
}
delay(5);
}
Библиотека fDigitsSegtPin.h



Как видите, код программы получается довольно громоздким. И было бы неплохо запаковать его в отдельную библиотеку. К счастью, такая библиотека уже есть. Это fDigitsSegtPin.h Установим ее через менеджер и используем для вывода десятичных цифр.
#include <fDigitsSegtPin.h>
fDigitsSegtPin Display(7, 6, 5, 4, 3, 10, 2, 11, 12, 8, 9, 13);
void setup() {
Display.begin();
Display.doPrint_lastDot = 1;
Display.doPrint_firstZero = 1;
Display.doReport_overRange = 1;
}
void loop() {
for(float i = 0.01; i < 10000; i += 0.01) Display.print(i);
}
Заключение
Мы рассмотрели четырехразрядный 7 сегментный индикатор. Написали программу для вывода больших цифр на индикатор и попробовали простую библиотеку для вывода цифр с точкой.