Това е шестият ни урок в нашата серия с уроци за PIC, в този урок научаваме взаимодействие на 16x2 LCD с PIC микроконтролер. В предишните ни уроци научихме основите на PIC, като използваме някои мигащи LED програми, както и как да използваме таймери в PIC Microcontroller. Тук можете да проверите всички уроци по Изучаване на PIC микроконтролери, използващи MPLABX и XC8 компилатор.
Този урок ще бъде интересен, защото ще научим как да свързваме 16 × 2 LCD с PIC16F877A, проверете подробното видео в края на този урок. Отминаха старите времена, когато използвахме светодиоди за индикации на потребителите. Нека видим как можем да направим нашите проекти да изглеждат по-готини и полезни с помощта на LCD дисплеи. Проверете и предишните ни статии за свързване на LCD с 8051, с Arduino, с Raspberry Pi, с AVR.
Функции за свързване на LCD с PIC микроконтролер:
За да улесним нещата, направихме малка библиотека, която може да улесни нещата, докато използвате този LCD с нашия PIC16F877A. Тук е даден заглавният файл "MyLCD.h" за изтегляне, който съдържа всички необходими функции за управление на LCD с помощта на PIC MCU. Кодът на библиотеката е добре обяснен с редове за коментари, но ако все още имате съмнения, свържете се с нас чрез раздела за коментари. Също така проверете тази статия за основната работа на LCD и неговите Pinouts.
Забележка: Винаги се препоръчва да знаете какво всъщност се случва във вашия заглавен файл, защото това ще ви помогне при отстраняване на грешки или при смяна на MCU.
Сега има два начина да добавите този код във вашата програма. Можете или да копирате всички горепосочени редове код в MyLCD.h и да ги поставите преди void main (). Или можете да изтеглите заглавния файл, като използвате връзката, и да ги добавите към заглавния файл на вашия проект ( #include "MyLCD.h "; ). Това може да стане, като щракнете с десния бутон върху заглавния файл и изберете Добавяне на съществуващ елемент и разглеждане на този заглавен файл.
Тук съм копирал и поставил кода на заглавния файл в основния си C файл. Така че, ако използвате нашия код, тогава не е нужно да изтегляте и добавяте заглавния файл във вашата програма, просто използвайте пълния код, даден в края на този урок. Също така имайте предвид, че тази библиотека ще поддържа само PIC16F серия PIC микроконтролер.
Тук обяснявам всяка функция в нашия заглавен файл по-долу:
void Lcd_Start (): Тази функция трябва да бъде първата функция, която трябва да бъде извикана, за да започне работа с нашия LCD. Трябва да извикаме тази функция само веднъж, за да избегнем забавяне в програмата.
void Lcd_Start () {Lcd_SetBit (0x00); за (int i = 1065244; i <= 0; i--) NOP (); Lcd_Cmd (0x03); __delay_ms (5); Lcd_Cmd (0x03); __delay_ms (11); Lcd_Cmd (0x03); Lcd_Cmd (0x02); // 02H се използва за Връщане у дома -> Изчиства RAM и инициализира LCD Lcd_Cmd (0x02); // 02H се използва за Връщане у дома -> Изчиства RAM и инициализира LCD Lcd_Cmd (0x08); // Избор на ред 1 Lcd_Cmd (0x00); // Изчистване на ред 1 на дисплея Lcd_Cmd (0x0C); // Избор на ред 2 Lcd_Cmd (0x00); // Изчистване на ред 2 на дисплея Lcd_Cmd (0x06); }
Lcd_Clear (): Тази функция изчиства LCD екрана и може да се използва вътре в цикли, за да изчисти появата на предишни данни.
Lcd_Clear () {Lcd_Cmd (0); // Изчистване на LCD Lcd_Cmd (1); // Преместване на курсора на първо място}
void Lcd_Set_Cursor (x pos, y pos): След като стартира, нашият LCD е готов да приема команди, ние можем да инструктираме LCD да настрои курсора си в предпочитаното от вас място, като използвате тази функция. Да предположим, че ако имаме нужда от курсор на 5-ти знак от 1-ви ред. Тогава функцията ще бъде void Lcd_Set_Cursor (1, 5)
void Lcd_Set_Cursor (char a, char b) {char temp, z, y; ако (a == 1) {temp = 0x80 + b - 1; // 80H се използва за преместване на курсора z = temp >> 4; // По-ниски 8-битови y = temp & 0x0F; // Горни 8-битови Lcd_Cmd (z); // Задаване на ред Lcd_Cmd (y); // Задаване на колона} else if (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // По-ниски 8-битови y = temp & 0x0F; // Горни 8-битови Lcd_Cmd (z); // Задаване на ред Lcd_Cmd (y); // Задаване на колона}}
void Lcd_Print_Char (char данни): След като курсорът е настроен, можем да напишем символ на неговата позиция, като просто извикаме тази функция.
void Lcd_Print_Char (char данни) // Изпращане на 8-бита чрез 4-битов режим {char Lower_Nibble, Upper_Nibble; Lower_Nibble = данни & 0x0F; Upper_Nibble = данни & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Изпращане на горната половина чрез преместване с 4 EN = 1; за (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Изпращане на долната половина EN = 1; за (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): Ако трябва да се покаже група от знаци, тогава може да се използва функцията низ.
void Lcd_Print_String (char * a) {int i; за (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Разделете низа с помощта на указатели и извикайте функцията Char}
Всеки път, когато се извика Lcd_Print_Char (char data) , съответните му символни стойности се изпращат към линиите за данни на LCD дисплея. Тези знаци достигат до HD44780U под формата на битове. Сега този IC свързва битовете с символа, който трябва да се покаже, като използва неговата ROM памет, както е показано по-долу Можете да намерите битове за всички символи в листа с данни на HD44780U LCD Controller.
Сега, тъй като сме доволни от нашия заглавен файл, нека изградим веригата и тестваме програмата. Също така проверете пълния заглавен файл, даден в връзката, дадена по-горе.
Електрическа схема и тестване:
По-долу е дадена схемата за свързване на 16x2 LCD с PIC микроконтролер.
Не съм показал захранването или ICSP връзката в горната схема, тъй като използваме същата платка, която сме използвали в предишния урок, проверете тук.
Едно важно нещо, което трябва да забележите в програмата, са дефинициите на щифтове на LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Тези дефиниции на ПИН могат да се променят според хардуерната настройка на програмистите. Не забравяйте да промените уважаваната конфигурация на порта в основната функция, ако промените тук.
Хардуерът за този проект е много прост. Ще използваме отново същия PIC модул, който използвахме миналия път, и ще свържем LCD модула към нашия PIC с помощта на джъмперни проводници.
Връзката може да се разбере от следната таблица:
Номер на LCD щифт |
Име на LCD щифт |
Име на ПИН на MCU |
Номер на MCU |
1 |
Земя |
Земя |
12 |
2 |
VCC |
+ 5V |
11. |
3 |
VEE |
Земя |
12 |
4 |
Регистрация Изберете |
RD2 |
21. |
5 |
Чети пиши |
Земя |
12 |
6 |
Активиране |
RD3 |
22. |
7 |
Бит за данни 0 |
NC |
- |
8 |
Бит за данни 1 |
NC |
- |
9 |
Бит за данни 2 |
NC |
- |
10 |
Бит за данни 3 |
NC |
- |
11. |
Бит за данни 4 |
RD4 |
27 |
12 |
Бит за данни 5 |
RD5 |
28 |
13 |
Бит за данни 6 |
RD6 |
29 |
14. |
Бит за данни 7 |
RD7 |
30 |
15 |
LED Положителен |
+ 5V |
11. |
16. |
LED отрицателен |
Земя |
12 |
Сега нека просто направим връзките, изхвърлим кода на нашия MCU и проверим изхода.
Ако имате някакви проблеми или съмнения, моля, използвайте раздела за коментари. Също така проверете демонстрационния видеоклип, даден по-долу.