Содержание
Может возникнуть необходимость отображать определенную информацию на цифровом дисплее. Для этого с головой хватит 8-секционного дисплея, циферный арсенал которого напоминает символы карманного калькулятора или написание почтовых индексов.
Теперь будем программировать каждую цифру отдельно. Например, чтобы отобразить восьмёрку, нужно зажечь все диоды, кроме h (точки). Для двойки – кроме f, c, h и так далее.
Дисплей имеет 10 выводов, 5 сверху и 5 снизу. Средний в каждой пятёрке является общим, остальные выводы сигнальные. К слову сказать, такие дисплеи бывают разные, с общим катодом или общим анодом. Разница в подключении. С общим катодом, на общие выводы подаётся “-“, а на сигнальные “+”, с общим анодом – наоборот.
А вот общая схема. Но нужно быть внимательным и проверять. У меня похоже, попался бракованный дисплей и некоторые контакты перепутаны. Но я составил верную матрицу (см.далее).
Что нам потребуется
- 7-секционный дисплей;
- Arduino UNO;
- 2 резистора на 10 кОм;
- 2 резистора на 220 Ом;
- 2 кнопки;
- Соединительные провода;
- Макетная плата;
(эти и многие другие компоненты можно получив заказав один раз набор Arduino, в который входит огромное количество различных датчиков и элементов)
Что куда подключается
- Со стороны питания +5 В идёт на общий плюс;
- Со стороны цифровых GND на общий минус;
- Пин 11 на 5 вывод дисплея;
- Пин 10 на 10 вывод дисплея;
- Пин 9 на 9 вывод дисплея;
- Пин 8 на 2 вывод дисплея;
- Пин 7 на 1 вывод дисплея;
- Пин 6 на 4 вывод дисплея;
- Пин 5 на 6 вывод дисплея;
- Пин 4 на 7 вывод дисплея;
- 3 и 8 выводы дисплея идут через резисторы 220 Ом на общий плюс;
- Установлены две кнопки, на вход каждой подаётся общий плюс;
- Выход первой кнопки идёт на Пин 3 (вход);
- Выход второй кнопки идёт на Пин 2 (вход);
- Так же выходы каждой кнопки через резисторы 10 кОм подключены к общему минусу;
Общий вид
И ещё один вид:
Исходный код
const int e=4;
const int d=5;
const int f=6;
const int g=7;
const int b=8;
const int a=9;
const int c=10;
const int h=11;
const int arr[10][7] = { { 0,0,0,0,0,0,1 },
{ 1,0,0,1,1,1,1 },
{ 0,0,1,0,0,1,0 },
{ 0,0,0,0,1,1,0 },
{ 1,0,0,1,1,0,0 },
{ 0,1,0,0,1,0,0 },
{ 0,1,0,0,0,0,0 },
{ 0,0,0,1,1,1,1 },
{ 0,0,0,0,0,0,0 },
{ 0,0,0,1,1,0,0 }};
const int startPin=4;
const int endPin=11;
int curNum = 0;
int decNum = 0;
int incNum = 0;
void setup()
{
int i;//define variable
for(i=4;i<=11;i++){
pinMode(i,OUTPUT);
digitalWrite(i,HIGH);}
pinMode(2,INPUT);
pinMode(3,INPUT);
Serial.begin(9600);
}
void dig(int number)
{
int i=startPin;
for (int j=0; j<7; j++)
{
digitalWrite(i,arr[number][j]);
i++;
}
}
void loop()
{
Serial.print("CurNum: ");
Serial.println(curNum);
Serial.print("DecNum: ");
Serial.println(decNum);
Serial.print("IncNum: ");
Serial.println(incNum);
Serial.println();
decNum=digitalRead(3);
incNum=digitalRead(2);
if (decNum==HIGH)
{
curNum--;
if (curNum < 0) curNum = 9;
} else
if (incNum==HIGH)
{
curNum++;
if (curNum > 9) curNum = 0;
}
dig(curNum);
delay(200);
}
Принцип действия
В массив констант мы забили какие леды зажигать для каждой цифры. Обратите внимание, что так как у меня дисплей с общим анодом, то инициализируются все пины высоким (HIGH) напряжением, а зажигаются низким (LOW). В этом отличие от классической схемы с общим катодом.
Имеется функция (dig), которая в зависимости от числового параметра, передаваемого в неё, зажигает определённые леды таким образом, чтобы отобразить цифру, значение которой передаётся в параметре.
Например dig(3) зажжёт последовательно леды 0,0,0,0,1,1,0, то есть все, кроме f и e. И так далее.
У нас так же имеется глобальная переменная curNum, которая хранит текущее отображаемое значение.
Имеются две кнопки, которые замыкают цепь на цифровые входы. Первая кнопка замыкает цепь на вход 3, вторая – на вход 2. В цикле мы проверяем, замкнута ли какая-либо цепь. Если на цифровой вход подаётся высокое напряжение, значит нажата соответствующая кнопка и мы либо увеличиваем либо уменьшаем curNum, соответственно меняется и отображаемая цифра.
Код, разумеется, неоптимальный, есть отладочный вывод в Serial-порт. Но принцип действия дисплея и кнопки понять можно!
Comments: