- 7-сегментный и 4-значный 7-сегментный дисплейный модуль:
- Подключение 4-значного семисегментного модуля к микроконтроллеру PIC:
- Программирование с использованием PIC16F877A:
- Настройка и тестирование оборудования:
Это наш 8-й учебник по изучению микроконтроллеров PIC с использованием MPLAB и XC8. Мы прошли весь путь от установки MPLABX до использования ЖК-дисплея с PIC MCU. Если вы здесь новичок, то посмотрите предыдущие уроки, где вы можете изучить таймеры, мигающий светодиод, сопряжение с ЖК-дисплеем и т. Д. Здесь вы можете найти все наши руководства по PIC. В нашем последнем уроке мы увидели, как мы можем генерировать пользовательские символы с помощью нашего ЖК-дисплея 16 * 2, а теперь давайте оснастим себя другим типом модуля дисплея, называемым 7-сегментным дисплеем, и соединим его с микроконтроллером PIC.
Хотя ЖК-дисплей 16x2 намного удобнее, чем 7-сегментный дисплей, существует несколько сценариев, в которых 7-сегментный дисплей был бы удобнее, чем ЖК-дисплей. ЖК-дисплей имеет недостаток, заключающийся в том, что он имеет небольшой размер символов, и будет излишним для вашего проекта, если вы просто планируете отображать некоторые числовые значения. 7-сегментный экран также имеет преимущество перед плохим освещением и может просматриваться под большим углом, чем обычный ЖК-экран. Итак, давайте начнем это знать.
7-сегментный и 4-значный 7-сегментный дисплейный модуль:
7-сегментный дисплей состоит из семи сегментов, и в каждом сегменте есть по одному светодиодному индикатору внутри, который отображает числа, подсвечивая соответствующие сегменты. Например, если вы хотите, чтобы 7-сегментный сегмент отображал цифру «5», вам нужно осветить сегменты a, f, g, c и d, сделав их соответствующие выводы высокими. Есть два типа 7-сегментных дисплеев: с общим катодом и с общим анодом, здесь мы используем семисегментный дисплей с общим катодом. Узнайте больше о 7-сегментном дисплее здесь.
Теперь мы знаем, как отобразить желаемый числовой символ на одном 7-сегментном дисплее. Но совершенно очевидно, что нам потребуется более одного 7-сегментного дисплея для отображения любой информации, состоящей более чем из одной цифры. Итак, в этом руководстве мы будем использовать 4-значный 7-сегментный модуль дисплея, как показано ниже.
Как мы видим, четыре дисплея с семью сегментами соединены вместе. Мы знаем, что каждый 7-сегментный модуль будет иметь 10 контактов, а для 4 7-сегментных дисплеев всего будет 40 контактов, и кому-то будет сложно припаять их на точечной плате, поэтому я настоятельно рекомендую всем купить модуль. или сделайте свою собственную печатную плату для использования 4-значного 7-сегментного дисплея. Схема подключения для него показана ниже:
Чтобы понять, как работает 4-значный семисегментный модуль, мы должны взглянуть на приведенную выше схему, как показано, контакты A всех четырех дисплеев соединены для сбора как один A и то же самое для B, C…. до DP. Итак, в основном, если триггер A включен, тогда все четыре A должны стать высокими, верно?
Но этого не происходит. У нас есть дополнительные четыре контакта от D0 до D3 (D0, D1, D2 и D3), которые можно использовать для управления тем, какой дисплей из четырех должен быть высоким. Например: если мне нужно, чтобы мой вывод присутствовал только на втором дисплее, тогда только D1 должен быть высоким, а остальные контакты (D0, D2 и D3) должны быть низкими. Просто мы можем выбрать, какой дисплей должен стать активным, используя контакты от D0 до D3, и какой символ отображать, используя контакты от A до DP.
Подключение 4-значного семисегментного модуля к микроконтроллеру PIC:
Здесь мы использовали PIC-микроконтроллер PIC16F877A, и схема схемы показана ниже.
У нас есть 12 выходных контактов модуля, из которых 8 используются для отображения символов, а четыре используются для выбора одного дисплея из четырех. Следовательно, все 8-символьные контакты назначаются PORTD, а контакты выбора дисплея назначаются первым четырем контактам PORTC.
Примечание. Контакт заземления модуля также должен быть подключен к заземлению MCU, которое здесь не показано.
Программирование с использованием PIC16F877A:
Теперь, когда мы знаем, как на самом деле работает этот модуль, давайте узнаем, как запрограммировать PIC16F877A, чтобы он отображал 4-значное число. Увеличим переменную от 0 до 1000 и распечатаем ее на 7-сегментном дисплее. Запустите программу MPLABX и создайте новый проект, давайте начнем с битов конфигурации.
#pragma config FOSC = HS // Биты выбора осциллятора (генератор HS) #pragma config WDTE = OFF // Бит включения сторожевого таймера (WDT отключен) #pragma config PWRTE = ON // Бит включения таймера включения (PWRT включен) # pragma config BOREN = ON // Бит разрешения сброса пониженного напряжения (BOR включен) #pragma config LVP = OFF // Бит разрешения последовательного программирования низкого напряжения (однополярный) (RB3 - это цифровой ввод / вывод, высокое напряжение включено Для программирования необходимо использовать MCLR) #pragma config CPD = OFF // Бит защиты кода памяти EEPROM данных (защита кода EEPROM данных отключена) #pragma config WRT = OFF // Биты разрешения записи в память программы Flash (защита от записи отключена; вся программная память может быть записано управлением EECON) #pragma config CP = OFF // Бит защиты кода флэш-памяти программы (Защита кода выключена)
Как обычно, мы используем окно установки битов конфигурации для установки этих битов. Если вы не уверены, что они означают, посетите руководство по миганию светодиодов здесь.
Затем давайте определим выходные контакты для переключения между каждой цифрой дисплея.
// *** Определите сигнальные контакты всех четырех дисплеев *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Конец определения ** ////
Здесь контакты RC0, RC1, RC2 и RC3 используются для выбора между четырьмя цифрами нашего 7-сегментного модуля дисплея. Эти выводы обозначаются как s1, s2, s3 и s4 соответственно.
Затем давайте перейдем к void main (), внутри которого у нас есть следующее объявление переменной:
int я = 0; // 4-значное значение, которое должно отображаться int flag = 0; // для создания задержки без знака int a, b, c, d, e, f, g, h; // просто переменные без знака int seg = {0X3F, // шестнадцатеричное значение для отображения числа 0 0X06, // шестнадцатеричное значение для отображения числа 1 0X5B, // шестнадцатеричное значение для отображения числа 2 0X4F, // шестнадцатеричное значение для отображения число 3 0X66, // шестнадцатеричное значение для отображения числа 4 0X6D, // шестнадцатеричное значение для отображения числа 5 0X7C, // шестнадцатеричное значение для отображения числа 6 0X07, // шестнадцатеричное значение для отображения числа 7 0X7F, / / Шестнадцатеричное значение для отображения числа 8 0X6F // Шестнадцатеричное значение для отображения числа 9}; // Конец массива для отображения чисел от 0 до 9
Здесь переменные i и flag используются для хранения отображаемых значений и создания задержки соответственно. В беззнаковых целых переменная от А до Н используются, чтобы разорвать четыре цифру номера в однозначные цифры и хранить их (которые будут объяснены позже здесь).
Здесь следует отметить один ключевой момент - объявление массива "seg" . В этой программе мы используем новый тип данных под названием Array. Массив - это не что иное, как набор значений схожих типов данных. Здесь мы использовали этот массив для хранения всех эквивалентных шестнадцатеричных значений для отображения числа от 0 до 9.
Адрес массива всегда начинается с нуля. Таким образом, этот массив будет иметь шестнадцатеричное значение числового числа (0-9), хранящееся по адресу, который совпадает с адресом числа, как показано ниже.
Переменная: |
сег |
сег |
сег |
сег |
сег |
сег |
сег |
сег |
сег |
сег |
Шестнадцатеричный код: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
Уравнение Числовой номер: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Проще говоря, если вы хотите отобразить число 0 на своем 7-сегментном сегменте, вы можете вызвать seg, аналогично, если вы хотите отобразить число 6, вам просто нужно использовать seg.
Чтобы понять, как на самом деле было получено значение HEX, давайте заглянем в приведенную ниже таблицу. Эквивалентное значение HEX для каждого десятичного числа хранятся в массиве таким образом, что он может быть вызван, чтобы отобразить один конкретный номер.
Теперь перейдем к следующей части кода, которая представляет собой конфигурацию ввода-вывода:
// ***** Конфигурация ввода / вывода **** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; // *** Конец конфигурации ввода / вывода ** ///
Конфигурация ввода / вывода проста, потому что все контакты на нашем 7-сегментном сегменте являются выходными контактами, а соединения показаны на принципиальной схеме выше, поэтому просто объявите их как выходы и инициализируйте их нулем.
Теперь давайте перейдем к нашему бесконечному циклу (while (1)). Здесь мы должны разделить значение «i» на четыре цифры и отобразить их на 7-сегментном сегменте. Сначала давайте начнем с разделения значения на "i"
// *** Разделение «i» на четыре цифры *** // a = i% 10; // Здесь сохраняется 4-я цифра b = i / 10; c = b% 10; // здесь сохраняется 3-я цифра d = b / 10; е = d% 10; // Здесь сохраняется 2-я цифра f = d / 10; g = f% 10; // Здесь сохраняется 1-я цифра h = f / 10; // *** Конец разбиения *** //
Используя простой модуль и операцию деления, 4-значное число (i) разделяется на отдельные числа. В нашем случае давайте возьмем пример, где значение «i» равно 4578. Затем в конце этого процесса переменная g = 4, e = 5, c = 7 и a = 8. Теперь будет легко отобразить каждую цифру, просто используя эту переменную.
PORTD = сегмент; s1 = 1; // Включаем дисплей 1 и печатаем 4-ю цифру __delay_ms (5); s1 = 0; // Выключаем отображение 1 после задержки 5 мс PORTD = seg; s2 = 1; // Включаем дисплей 2 и выводим третью цифру __delay_ms (5); s2 = 0; // Выключаем дисплей 2 после задержки 5 мс PORTD = seg; s3 = 1; // Включаем дисплей 3 и печатаем вторую цифру __delay_ms (5); s3 = 0; // ВЫКЛЮЧЕНИЕ дисплея 3 после задержки 5 мс PORTD = seg; s4 = 1; // Включаем дисплей 4 и печатаем 1-ю цифру __delay_ms (5); s4 = 0; // Выключаем дисплей 4 после задержки 5 мс
Это фактическое место, где MCU разговаривает с семисегментным сегментом. Как мы знаем, мы можем отображать только одну цифру за раз, но у нас есть четыре цифры, которые должны отображаться, и только если все четыре цифры включены, полное четырехзначное число будет видно пользователю.
Итак, как нам это сделать?
К счастью для нас, наш MCU намного быстрее человеческого глаза, поэтому то, что мы на самом деле делаем: мы отображаем по одной цифре за раз, но делаем это очень быстро, как показано выше.
Мы выбираем одноразрядный дисплей, он ждет 5 мс, чтобы MCU и 7-сегментный могли его обработать, а затем выключаем эту цифру и переходим к следующей цифре и делаем то же самое, пока не дойдем до последней цифры. Эта задержка в 5 мс не может быть замечена человеческим глазом, и все четыре цифры оказались включенными одновременно.
Вот и все, наконец, мы просто увеличиваем значение отображаемой цифры с задержкой, как показано ниже.
if (flag> = 100) // ждем, пока флаг достигнет 100 {i ++; flag = 0; // только если флаг равен сотне "i" будет увеличиваться} flag ++; // увеличиваем флаг для каждой вспышки
Задержка используется для того, чтобы время, необходимое для перехода с одного числа на другое, было достаточно большим, чтобы мы могли заметить изменение.
Полный код приведен ниже, и процесс также объясняется в видео в конце.
Настройка и тестирование оборудования:
Как всегда, давайте смоделируем программу с помощью Proteus, прежде чем приступить к работе с оборудованием. Если симуляция прошла успешно, вы должны увидеть что-то вроде этого
В этом проекте нет сложной настройки оборудования, мы снова используем ту же плату микроконтроллера PIC, которую мы создали в учебнике по миганию светодиодов. Просто подключите 7-сегментный модуль к плате микроконтроллера PIC в соответствии со схемой подключения. Как только вы закончите с подключениями, просто сбросьте код с помощью программатора PicKit 3, и на этом все готово.