Рубрики
Схемы на PIC

Подключение семисегментного индикатора к микроконтроллеру PIC

Мы продолжаем серию наших обучающих статей по программированию микроконтроллеров PIC с помощью программ MPLAB и XC8. В предыдущих статьях на нашем сайте мы уже рассмотрели работу с таймерами в микроконтроллерах PIC, подключение к ним ЖК дисплея и т.д. В этой же статье мы рассмотрим подключение к микроконтроллеру PIC семисегментного индикатора (дисплея).

В большинстве случае ЖК дисплей является более универсальным устройством отображения информации чем семисегментный индикатор (дисплей), однако в некоторых проектах использование семисегментного индикатора выглядит все таки более удобным. Он выигрывает у ЖК дисплея в размере отображаемых символов, лучше различим при ярком свете и имеет большие углы обзора.

Ранее на нашем сайте мы рассматривали использование семисегментного индикатора в следующих проектах:

Семисегментный индикатор и 4-х разрядный семисегментный индикатор

Семисегментный индикатор (7 Segment Display) имеет семь сегментов, в каждом из которых расположен светодиод. Зажигая различные сегменты данного индикатора можно отображать на нем различные буквы и цифры. Например, чтобы отобразить на нем цифру «5», необходимо подать на сегменты a, f, g, c и d уровень high. Существуют два типа семисегментных индикаторов: с общим катодом (Common Cathode) и общим анодом (Common Anode). В нашем проекте мы будем использовать семисегментный индикатор с общим катодом.

Структурная схема семисегментного индикатора показана на следующем рисунке.

Теперь мы знаем как отобразить одну цифру или букву на семисегментном индикаторе. Но что делать если нам нужно отобразить несколько букв/цифр? Ответ прост – необходимо использовать многоразрядный семисегментный индикатор, в данном случае мы будем использовать 4-х разрядный семисегментный индикатор, внешний вид которого показан на следующем рисунке, схема которого представлена на следующем рисунке.

Как можно видеть из представленного рисунка, данный индикатор представляет собой 4 семисегментных индикатора, соединенных вместе. Если их соединить просто, то такой семисегментный индикатор имел бы 40 контактов, что сделало бы проблематичным его подключение к большинству современных микроконтроллеров, поэтому мы купили (можно также изготовить его самостоятельно) готовый модуль 4-х разрядного семисегментного индикатора, схема которого показана выше. Он содержит всего 12 контактов.

Для понимания принципов работы 4-х разрядного семисегментного индикатора необходимо внимательно посмотреть на его схему, приведенную выше. На ней видно, что контакты A (также как и контакты B, C….) всех четырех индикаторов соединены вместе. То есть если подать уровень high на контакт A, то должны загореться сегменты A всех четырех индикаторов?

Но этого не происходит поскольку в схему добавлены дополнительные 4 контакта D0, D1, D2 и D3, которые используются для управления всеми 4 индикаторами. Например, если нам нужно зажечь сегменты только на втором индикаторе, то на контакт D1 необходимо подать уровень high, а на остальные контакты (D0, D2 и D3) необходимо подать уровень low. Аналогичным образом мы можем управлять остальными индикатора в составе 4-х разрядного семисегментного дисплея.

Схема проекта

Схема подключения 4-х разрядного семисегментного индикатора к микроконтроллеру PIC16F877A представлена на следующем рисунке.

У модуля 4-х разрядного семисегментного индикатора мы имеем 12 выходных контактов, 8 из которых используются для отображения символов, а остальные 4 – для выбора разряда индикатора. 8 контактов для отображения символов подключены к контактам порта PORTD микроконтроллера PIC, а 4 управляющих контакта – к контактам порта PORTC микроконтроллера.

Примечание: контакт Ground (общий провод/земля) модуля индикатора должен быть подключен к контакту ground микроконтроллера.

Объяснение программы для микроконтроллера PIC

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Для тестирования работы проекта мы будем инкрементировать переменную от 0 до 1000 и выводить ее значение на 4-х разрядный семисегментный индикатор. Запустите программу MPLABX, создайте в ней новый проект и произведите настройку в ней битов конфигурации (фьюзов) микроконтроллера. Более подробно вопросы настройки этих битов рассмотрены в данной статье.

Далее укажем контакты, с которых мы будем управлять выбором разряда семисегментного индикатора. В нашем случае это будут контакты RC0, RC1, RC2 и RC3 – мы объявим их под именами s1, s2, s3 и s4 соответственно.

Затем, внутри функции void main(), инициализируем необходимые переменные.

В нашем случае переменные i и flag используются для хранения отображаемого на дисплее значения и задержки соответственно. Переменные целого типа с a до h используются для разбиения 4-х разрядного числа на отдельные цифры.

Для отображения отдельных цифр от 0 до 9 на разрядах семисегментного индикатора у нас будет использоваться массив «seg[]«. Адрес массива начинается с нуля, в массиве у нас будут храниться числа от 0 до 9 в шестнадцатеричном формате, индекс элемента массива будет соответствовать отображаемой на индикаторе цифре.

seg[0] seg[1] seg[2] seg[3] seg[4] seg[5] seg[6] seg[7] seg[8] seg[9]
0X3F 0X06 0X5B 0X4F 0X66 0X6D 0X7C 0X07 0X7F 0X6F
0 1 2 3 4 5 6 7 8 9

То есть если на семисегментном индикаторе нам необходимо отобразить цифру 0, нам необходимо вызвать seg[0], а если цифру 6 – то seg[6].

Принцип формирования шестнадцатеричного значения, необходимого для отображения на семисегментном индикаторе нужной нам цифры, показан в следующей таблице.

Далее в коде программы зададим начальную конфигурацию (значения) используемых портов микроконтроллера. Все используемые нами контакты ввода/вывода в наше проекте будут работать в режиме вывода данных.

Далее, в бесконечном цикле программы (while(1)) мы будем разделять значение переменной «i» на 4 отдельные цифры и отображать их на семисегментном индикаторе. В следующем фрагменте кода представлено разделение значения переменной «i» на отдельные цифры – для этого мы используем операции деления и остатка от деления.

Предположим, что значение переменной «i» равно 4578. Тогда в конце процесса разделения получим следующие значения переменных: g=4, e=5, c=7 и a=8. После этого мы можем отобразить полученные отдельные цифры на разрядах нашего семисегментного индикатора.

Но в отдельный момент времени одновременно на всех 4-х разрядах семисегментного индикатора мы можем отобразить только одинаковые цифры (поскольку информационные контакты у всех разрядов общие). Так каким же образом мы можем отобразить на всех 4-х разрядах семисегментного индикатора разные цифры?

Принцип здесь достаточно прост и он заключается в том, что человеческий глаз не может различать быстрые мерцания чего либо, а наш микроконтроллер работает гораздо быстрее чем человеческий глаз. Если мы будем отображать различные значения в разрядах семисегментного индикатора с высокой частотой, то человеческий глаз будет воспринимать эти цифры непрерывно горящими. В нашем случае мы будем использовать задержку в 5ms для переключения между различными разрядами семисегментного индикатора – человеческий глаз не будет замечать такой маленькой задержки между переключениями.

Задержку в 5ms мы будем организовывать с помощью цикла как показано в следующем фрагменте кода.

Тестирование работы проекта

Вначале смоделируем работу нашей схемы в симуляторе Proteus. Схема нашего проекта в данном симуляторе представлена на следующем рисунке.

Если в симуляторе все заработало можно подключить к микроконтроллеру PIC программатор PicKit 3, записать в него программу проекта и протестировать работу схемы на «реальном» железе.

Исходный код программы

Видео, демонстрирующее работу проекта

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *