- 7-сегментний та 4-значний 7-сегментний модуль дисплея:
- Підключення 4-значного семисегментного модуля з мікроконтролером PIC:
- Програмування за допомогою PIC16F877A:
- Налаштування та тестування обладнання:
Це наш 8-й підручник з вивчення мікроконтролерів PIC за допомогою MPLAB та XC8. Ми пройшли весь шлях від встановлення MPLABX до використання РК-дисплея з мікроконтролером PIC. Якщо ви тут новачок, перегляньте попередні підручники, де ви можете дізнатись таймери, миготливий світлодіод, інтерфейс РК тощо. Всі наші підручники з PIC можна знайти тут. У нашому останньому навчальному посібнику ми побачили, як ми можемо генерувати власні символи за допомогою нашого РК-дисплея 16 * 2, тепер давайте оснастимо себе іншим типом модуля відображення, який називається 7-сегментним дисплеєм, та взаємодіємо з мікроконтролером PIC.
Хоча РК-дисплей 16x2 набагато зручніший, ніж 7-сегментний дисплей, але є кілька сценаріїв, коли 7-сегментний дисплей стане в нагоді, ніж РК-дисплей. РК-дисплей страждає від недоліку низького розміру символів і буде надмірним для вашого проекту, якщо ви просто плануєте відобразити деякі числові значення. 7-сегменти також мають перевагу в порівнянні з поганим освітленням, і їх можна переглядати з великих кутів, ніж звичайний РК-екран. Отже, давайте почнемо це знати.
7-сегментний та 4-значний 7-сегментний модуль дисплея:
7-сегментний дисплей містить сім сегментів, і кожен сегмент має один світлодіод, який відображає цифри, висвітлюючи відповідні сегменти. Наприклад, якщо ви хочете, щоб 7-сегмент відображав число "5", вам потрібно світити сегменти a, f, g, c та d, зробивши відповідні штифти високими. Існує два типи 7-сегментних дисплеїв: Common Cathode і Common Anode, тут ми використовуємо загальний катод з семи сегментів. Дізнайтеся більше про 7-сегментний дисплей тут.
Тепер ми знаємо, як відобразити бажаний цифровий символ на одному 7-сегментному дисплеї. Але цілком очевидно, що нам знадобиться більше одного 7-сегментного дисплея для передачі будь-якої інформації, яка має більше однієї цифри. Отже, у цьому посібнику ми будемо використовувати 4-значний 7-сегментний модуль відображення, як показано нижче.
Як бачимо, є чотири сім сегментних дисплея, пов’язаних між собою. Ми знаємо, що кожен 7-сегментний модуль матиме 10 висновків, а для 4-х семисегментних дисплеїв було б 40 висновків, і було б неспокійно, щоб хтось припаював їх до точки, тому я настійно рекомендую кожному придбати модуль або виготовити власну друковану плату для використання 4-значного 7-сегментного дисплея. Схема підключення для цього ж наведена нижче:
Щоб зрозуміти, як працює 4-значний семисегментний модуль, ми повинні розглянути вищенаведені схеми, як показано, штифти A всіх чотирьох дисплеїв підключені, щоб зібрати як один A, так і для B, C…. до DP. Отже, в основному, якщо тригер А увімкнено, то всі чотири А повинні йти високо, правда?
Але цього не відбувається. У нас є додаткові чотири штифти від D0 до D3 (D0, D1, D2 і D3), які можна використовувати для управління тим, який дисплей з чотирьох повинен бути високим. Наприклад: Якщо мені потрібно, щоб мій висновок був присутній лише на другому дисплеї, тоді тільки D1 повинен бути зроблений високим, а інші висновки (D0, D2 та D3) бути низькими. Просто ми можемо вибрати, який дисплей повинен стати активним, використовуючи штифти від D0 до D3 і який символ відображати за допомогою штифтів від A до DP.
Підключення 4-значного семисегментного модуля з мікроконтролером PIC:
Тут ми використовували мікроконтролер PIC16F877A, а схема схеми наведена нижче.
У нас є 12 вихідних штифтів з модуля, з яких 8 використовується для відображення символів, а чотири - для вибору одного дисплея з чотирьох. Отже, всі 8 символьних штифтів присвоюються PORTD, а шпильки вибору дисплея присвоюються першим чотирьом пінам PORTC.
Примітка: Контакт заземлення модуля також повинен бути підключений до заземлення MCU, що тут не показано.
Програмування за допомогою PIC16F877A:
Тепер, коли ми знаємо, як насправді працює цей модуль, давайте навчимося програмувати PIC16F877A, щоб він відображав 4-значне число. Давайте збільшимо змінну від 0 до 1000 і надрукуємо її на 7-сегментному дисплеї. Запустіть програму MPLABX і створіть новий проект, почнемо з бітів конфігурації.
#pragma config. pragma config BOREN = ON // Біт увімкнення скидання коригування (BOR увімкнено) #pragma config LVP = OFF // Біт ввімкнення послідовного програмування в ланцюзі низької напруги (одне живлення) Для програмування потрібно використовувати MCLR) #pragma config CPD = OFF // Біт захисту коду пам'яті EEPROM (захист коду EEPROM даних вимкнений) #pragma config WRT = OFF // Flash Program Memory Ввімкнути біти (Запис захисту вимкнено; вся пам'ять програми може бути записаний на контролі EECON) #pragma config CP = OFF // Біт захисту коду пам'яті Flash-програми
Як зазвичай, ми використовуємо вікно встановлених бітів конфігурації, щоб встановити ці біти. Якщо ви не впевнені, що вони означають, відвідайте тут підручник з блимання світлодіодів.
Далі визначимо вихідні штифти для перемикання між кожною цифрою дисплея.
// *** Визначити сигнальні штифти всіх чотирьох дисплеїв *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Кінець визначення ** ////
Тут шпильки RC0, RC1, RC2 і RC3 використовуються для вибору між чотирма цифрами нашого 7-сегментного модуля відображення. Ці штифти визначаються як s1, s2, s3 та s4 відповідно.
Далі перейдемо до void main (), всередині якого ми маємо таке оголошення змінної:
int i = 0; // 4-значне значення, яке має відображатися int flag = 0; // для створення затримки unsigned int a, b, c, d, e, f, g, h; // просто змінні unsigned 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 та прапор використовуються для зберігання відображуваних значень та створення затримки відповідно. У беззнакових цілих змінна від А до Н використовуються, щоб розірвати чотири цифру номера в однозначні цифри і зберігати їх (які будуть пояснені пізніше тут).
Тут слід зауважити одне ключове - це декларація масиву "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-сегменті, ви можете зателефонувати сег, як і якщо ви хочете відобразити цифру 6, вам просто потрібно використовувати сегмент.
Щоб зрозуміти, як насправді було отримано значення 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; e = 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 і надрукуйте 3-ту цифру __delay_ms (5); s2 = 0; // Вимкнути дисплей 2 після затримки 5 мс PORTD = seg; s3 = 1; // УВІМКНІТИ дисплей 3 і надрукувати другу цифру __delay_ms (5); s3 = 0; // Вимкнути дисплей 3 після затримки 5 мс PORTD = seg; s4 = 1; // УВІМКНУТИ дисплей 4 і надрукувати першу цифру __delay_ms (5); s4 = 0; // Вимкніть дисплей 4 після затримки 5 мс
Це фактичне місце, де MCU розмовляє з 7-сегментним. Як ми знаємо, ми можемо відображати лише одну цифру за раз, але у нас є чотири цифри, які потрібно відобразити, і лише якщо всі чотири цифри знаходяться на Повне чотиризначне число буде видно користувачеві.
Отже, як нам з цим піти?
На щастя для нас, наш MCU набагато швидший, ніж людське око, тому що ми насправді робимо: ми відображаємо одну цифру за раз, але робимо це дуже швидко, як показано вище.
Ми вибираємо одноцифровий дисплей, який зачекає 5 мс, щоб мікроконтролер та 7-сегментний процесор могли його обробити, а потім вимкнути цю цифру і перейти до наступної цифри, і робити те саме, поки не дійдемо до останньої цифри. Ця затримка в 5 мс не може спостерігатися людським оком, і всі чотири цифри, здавалося, ввімкнено одночасно.
Ось і все, нарешті, ми просто збільшуємо значення відображеної цифри, використовуючи затримку, як показано нижче
if (flag> = 100) // чекаємо, поки прапор досягне 100 {i ++; flag = 0; // лише якщо прапор дорівнює сто "i" буде збільшено} flag ++; // прапор збільшення для кожного спалаху
Затримка використовується для того, щоб час, необхідний для зміни з одного числа на інше, був достатньо довгим, щоб ми помітили зміну.
Повний код наведено нижче, і процес також пояснюється в відео в кінці.
Налаштування та тестування обладнання:
Як завжди, давайте змоделюємо програму за допомогою Proteus, перш ніж ми дійсно підемо з нашим обладнанням. Якщо моделювання вдале, ви повинні побачити щось подібне
Цей проект не має жодних складних налаштувань обладнання, ми знову використовуємо ту саму плату мікроконтролера PIC, яку ми створили в підручнику, що блимає світлодіодами. Просто підключіть 7-сегментний модуль до плати мікроконтролера PIC відповідно до схеми підключення. Закінчивши з підключеннями, просто скиньте код за допомогою програміста PicKit 3, і це буде насолоджуватися вашим результатом.