To jest nasz szósty samouczek w naszej serii samouczków PIC, w tym samouczku uczymy się Łączenie wyświetlacza LCD 16x2 z mikrokontrolerem PIC. W naszych poprzednich samouczkach nauczyliśmy się podstaw PIC przy użyciu niektórych programów migających diodami LED, a także nauczyliśmy się, jak używać timerów w mikrokontrolerze PIC. Możesz sprawdzić tutaj wszystkie samouczki dotyczące nauki mikrokontrolerów PIC przy użyciu kompilatora MPLABX i XC8.
Ten samouczek będzie interesujący, ponieważ nauczymy się łączyć wyświetlacz LCD 16 × 2 z PIC16F877A, sprawdź szczegółowe wideo na końcu tego samouczka. Dawno minęły czasy, kiedy używaliśmy diod LED do wskazań użytkownika. Zobaczmy, jak możemy sprawić, by nasze projekty wyglądały bardziej fajnie i użytecznie, używając wyświetlaczy LCD. Sprawdź również nasze poprzednie artykuły na temat łączenia LCD z 8051, z Arduino, z Raspberry Pi, z AVR.
Funkcje do łączenia LCD z mikrokontrolerem PIC:
Aby to ułatwić, stworzyliśmy małą bibliotekę, która może ułatwić korzystanie z tego wyświetlacza LCD z naszym PIC16F877A. Plik nagłówkowy „MyLCD.h” jest podany tutaj do pobrania, który zawiera wszystkie niezbędne funkcje do sterowania LCD za pomocą PIC MCU. Kod biblioteki jest dobrze wyjaśniony liniami komentarzy, ale jeśli nadal masz wątpliwości, skontaktuj się z nami za pośrednictwem sekcji komentarzy. Zapoznaj się również z tym artykułem, aby zapoznać się z działaniem Basic LCD i jego pinami.
Uwaga: zawsze zaleca się, aby wiedzieć, co faktycznie dzieje się w pliku nagłówkowym, ponieważ pomoże to w debugowaniu lub podczas zmiany MCU.
Teraz istnieją dwa sposoby dodania tego kodu do programu. Możesz albo skopiować wszystkie powyższe wiersze kodu z MyLCD.h i wkleić je przed void main (). Lub możesz pobrać plik nagłówkowy za pomocą linku i dodać go do pliku nagłówkowego swojego projektu ( #include "MyLCD.h "; ). Można to zrobić, klikając prawym przyciskiem myszy plik nagłówkowy i wybierając opcję Dodaj istniejący element i przechodząc do tego pliku nagłówkowego.
Tutaj skopiowałem i wkleiłem kod pliku nagłówkowego do mojego głównego pliku C. Jeśli więc używasz naszego kodu, nie musisz pobierać i dodawać pliku nagłówkowego do swojego programu, po prostu użyj pełnego kodu podanego na końcu tego samouczka. Należy również pamiętać, że ta biblioteka obsługuje tylko mikrokontrolery PIC z serii PIC16F.
Poniżej wyjaśniam każdą funkcję w naszym pliku nagłówkowym:
void Lcd_Start (): Ta funkcja powinna być pierwszą funkcją, którą należy wywołać, aby rozpocząć pracę z naszym LCD. Powinniśmy wywołać tę funkcję tylko raz, aby uniknąć opóźnień w programie.
void Lcd_Start () {Lcd_SetBit (0x00); dla (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 służy do powrotu do domu -> Czyści pamięć RAM i inicjalizuje LCD Lcd_Cmd (0x02); // 02H służy do powrotu do domu -> Czyści pamięć RAM i inicjalizuje LCD Lcd_Cmd (0x08); // Wybierz wiersz 1 Lcd_Cmd (0x00); // Wyczyść wyświetlanie wiersza 1 Lcd_Cmd (0x0C); // Wybierz wiersz 2 Lcd_Cmd (0x00); // Wyczyść wyświetlanie wiersza 2 Lcd_Cmd (0x06); }
Lcd_Clear (): Ta funkcja czyści ekran LCD i może być używana wewnątrz pętli, aby usunąć wygląd poprzednich danych.
Lcd_Clear () {Lcd_Cmd (0); // Wyczyść LCD Lcd_Cmd (1); // Przenieś kursor na pierwszą pozycję}
void Lcd_Set_Cursor (x pos, y pos): Po uruchomieniu nasz wyświetlacz LCD jest gotowy do przyjmowania poleceń, możemy poinstruować LCD, aby ustawił kursor w preferowanej lokalizacji za pomocą tej funkcji. Załóżmy, że potrzebujemy kursora na piątym znaku pierwszego rzędu. Wtedy funkcja będzie nieważna Lcd_Set_Cursor (1, 5)
void Lcd_Set_Cursor (char a, char b) {char temp, z, y; if (a == 1) {temp = 0x80 + b - 1; // 80H służy do przesuwania kursora z = temp >> 4; // Dolne 8 bitów y = temp & 0x0F; // Górne 8 bitów Lcd_Cmd (z); // Ustaw wiersz Lcd_Cmd (y); // Ustaw kolumnę} else if (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Dolne 8 bitów y = temp & 0x0F; // Górne 8 bitów Lcd_Cmd (z); // Ustaw wiersz Lcd_Cmd (y); // Ustaw kolumnę}}
void Lcd_Print_Char (char data): Po ustawieniu kursora możemy zapisać znak na jego pozycji, wywołując tę funkcję.
void Lcd_Print_Char (char data) // Wyślij 8-bitów w trybie 4-bitowym {char Lower_Nibble, Upper_Nibble; Lower_Nibble = dane & 0x0F; Upper_Nibble = dane & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Wyślij górną połowę, przesuwając o 4 EN = 1; dla (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Wyślij dolną połowę EN = 1; dla (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): Jeśli ma zostać wyświetlona grupa znaków, można użyć funkcji ciągu.
void Lcd_Print_String (char * a) {int i; for (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Podziel ciąg za pomocą wskaźników i wywołaj funkcję Char}
Za każdym razem, gdy wywoływany jest Lcd_Print_Char (dane char) , odpowiednie wartości znaków są wysyłane do linii danych wyświetlacza LCD. Te znaki docierają do HD44780U w postaci bitów. Teraz ten układ scalony odnosi bity do znaku, który ma być wyświetlany, używając swojej pamięci ROM, jak pokazano w poniższej tabeli. Możesz znaleźć bity dla wszystkich znaków w arkuszu danych kontrolera LCD HD44780U.
Teraz, ponieważ jesteśmy zadowoleni z naszego pliku nagłówkowego, zbudujmy obwód i przetestujmy program. Sprawdź również kompletny plik nagłówkowy podany w linku podanym powyżej.
Schemat obwodu i testowanie:
Poniżej znajduje się schemat obwodu do łączenia 16x2 LCD z mikrokontrolerem PIC.
Nie pokazałem zasilania ani połączenia ICSP w powyższym obwodzie, ponieważ używamy tej samej płytki, której używaliśmy w poprzednim samouczku, sprawdź tutaj.
Jedną ważną rzeczą, na którą należy zwrócić uwagę w programie, są definicje pinów wyświetlacza LCD:
# zdefiniować RS RD2 # zdefiniować EN RD3 # zdefiniować D4 RD4 # zdefiniować D5 RD5 # zdefiniować D6 RD6 # zdefiniować D7 RD7
Te definicje pinów można zmienić zgodnie z konfiguracją sprzętu programisty. Pamiętaj, aby zmienić odpowiednią konfigurację portu w głównej funkcji, jeśli zmienisz tutaj.
Sprzęt do tego projektu jest bardzo prosty. Zamierzamy ponownie użyć tego samego modułu PIC, którego używaliśmy ostatnio i podłączyć moduł LCD do naszego PIC za pomocą przewodów połączeniowych.
Połączenie można zrozumieć dzięki poniższej tabeli:
Nr styku wyświetlacza LCD |
Nazwa styku wyświetlacza LCD |
Nazwa pinu MCU |
Nr styku MCU |
1 |
Ziemia |
Ziemia |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Ziemia |
12 |
4 |
Zarejestruj się Wybierz |
RD2 |
21 |
5 |
Odczyt / zapis |
Ziemia |
12 |
6 |
Włączyć |
RD3 |
22 |
7 |
Bit danych 0 |
NC |
- |
8 |
Bit danych 1 |
NC |
- |
9 |
Bit danych 2 |
NC |
- |
10 |
Bit danych 3 |
NC |
- |
11 |
Bit danych 4 |
RD4 |
27 |
12 |
Bit danych 5 |
RD5 |
28 |
13 |
Bit danych 6 |
RD6 |
29 |
14 |
Bit danych 7 |
RD7 |
30 |
15 |
Dioda LED dodatnia |
+ 5V |
11 |
16 |
Negatyw LED |
Ziemia |
12 |
Teraz po prostu wykonajmy połączenia, zrzućmy kod do naszego MCU i zweryfikujmy dane wyjściowe.
Jeśli masz jakiekolwiek problemy lub wątpliwości, skorzystaj z sekcji komentarzy. Sprawdź również wideo demonstracyjne podane poniżej.