Acesta este al șaselea tutorial din seria noastră de tutoriale PIC, în acest tutorial învățăm interfațarea LCD 16x2 cu microcontroler PIC. În tutorialele noastre anterioare, am învățat elementele de bază ale PIC folosind unele programe LED intermitente și am învățat, de asemenea, cum să utilizați cronometrele în microcontrolerul PIC. Puteți verifica aici toate tutorialele despre învățarea microcontrolerelor PIC utilizând compilatorul MPLABX și XC8.
Acest tutorial va fi unul interesant, deoarece vom învăța cum să interfață LCD 16 × 2 cu PIC16F877A, verificați videoclipul detaliat la sfârșitul acestui tutorial. S-au dus vremurile vechi în care foloseam LED-uri pentru indicațiile utilizatorilor. Să vedem cum putem face ca proiectele noastre să pară mai cool și mai utile folosind afișaje LCD. Verificați și articolele noastre anterioare despre interfața LCD cu 8051, cu Arduino, cu Raspberry Pi, cu AVR.
Funcții pentru interfața LCD cu microcontroler PIC:
Pentru a face lucrurile mai ușoare, am creat o mică bibliotecă care ar putea ușura lucrurile în timp ce utilizați acest LCD cu PIC16F877A. Fișierul antet „MyLCD.h” este dat aici pentru descărcare, care conține toate funcțiile necesare pentru a conduce LCD-ul folosind PIC MCU. Codul bibliotecii este bine explicat prin linii de comentarii, dar dacă aveți în continuare îndoieli, ajungeți la noi prin secțiunea de comentarii. Verificați, de asemenea, acest articol pentru funcționarea LCD-ului de bază și pinouturile acestuia.
Notă: Este întotdeauna recomandat să știți ce se întâmplă de fapt în fișierul dvs. de antet, deoarece vă va ajuta la depanare sau la schimbarea MCU.
Acum, există două modalități de a adăuga acest cod în programul dvs. Puteți să copiați toate liniile de cod de mai sus în MyLCD.h și să le lipiți înainte de meniul void main (). Sau puteți descărca fișierul antet folosind linkul și adăugați-l în fișierul antet al proiectului dvs. ( #include "MyLCD.h "; ). Acest lucru se poate face făcând clic dreapta pe fișierul antet și selectând Adăugare element existent și navigând în acest fișier antet.
Aici am copiat și lipit codul fișierului antet în fișierul meu principal C. Deci, dacă utilizați codul nostru, atunci nu este nevoie să descărcați și să adăugați fișierul antet în programul dvs., trebuie doar să utilizați codul complet dat la sfârșitul acestui tutorial. De asemenea, rețineți că această bibliotecă va suporta doar microcontrolerul PIC din seria PIC16F.
Aici vă explic fiecare funcție din fișierul nostru de antet de mai jos:
void Lcd_Start (): Această funcție ar trebui să fie prima funcție care trebuie apelată pentru a începe să lucreze cu LCD-ul nostru. Ar trebui să apelăm această funcție o singură dată pentru a evita decalajul în program.
void Lcd_Start () {Lcd_SetBit (0x00); pentru (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 este folosit pentru Întoarcerea acasă -> Șterge memoria RAM și inițializează LCD Lcd_Cmd (0x02); // 02H este folosit pentru Întoarcere acasă -> Șterge memoria RAM și inițializează LCD Lcd_Cmd (0x08); // Selectați rândul 1 Lcd_Cmd (0x00); // Ștergeți afișajul rândului 1 Lcd_Cmd (0x0C); // Selectați rândul 2 Lcd_Cmd (0x00); // Șterge Rândul 2 Afișează Lcd_Cmd (0x06); }
Lcd_Clear (): Această funcție șterge ecranul LCD și poate fi utilizată în interiorul buclelor pentru a șterge aspectul datelor anterioare.
Lcd_Clear () {Lcd_Cmd (0); // Ștergeți ecranul LCD Lcd_Cmd (1); // Mutați cursorul în prima poziție}
void Lcd_Set_Cursor (x pos, y pos): Odată pornit, LCD-ul nostru este gata să preia comenzi, putem instrui LCD-ul să își seteze cursorul în locația preferată utilizând această funcție. Să presupunem că, dacă avem nevoie de cursor la al 5-lea caracter al primului rând. Atunci funcția va fi nulă 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 este folosit pentru a muta cursorul z = temp >> 4; // 8-biți inferiori y = temp & 0x0F; // Lcd_Cmd (z) superior pe 8 biți; // Set Row Lcd_Cmd (y); // Setați Coloana} else if (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Reduceți 8 biți y = temp & 0x0F; // Lcd_Cmd (z) superior pe 8 biți; // Set Row Lcd_Cmd (y); // Setați coloana}}
void Lcd_Print_Char (date char): Odată ce cursorul este setat, putem scrie un caracter în poziția sa prin simpla apelare a acestei funcții.
void Lcd_Print_Char (date char) // Trimiteți 8 biți prin modul 4 biți {char Lower_Nibble, Upper_Nibble; Lower_Nibble = date & 0x0F; Upper_Nibble = date & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Trimiteți jumătatea superioară schimbând cu 4 EN = 1; pentru (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Trimiteți jumătate inferioară EN = 1; pentru (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): Dacă trebuie afișat un grup de caractere, atunci poate fi utilizată funcția șir.
void Lcd_Print_String (char * a) {int i; pentru (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Împarte șirul folosind pointeri și apelează funcția Char}
De fiecare dată când se apelează Lcd_Print_Char (date char) , valorile caracterelor respective sunt trimise către liniile de date ale ecranului LCD. Aceste caractere ajung la HD44780U sub formă de biți. Acum, acest IC leagă biții de caracterul care trebuie afișat folosind memoria ROM, așa cum se arată în tabelul de mai jos. Puteți găsi biți pentru toate caracterele în fișa tehnică a controlerului LCD HD44780U.
Acum, deoarece suntem mulțumiți de fișierul nostru de antet, să construim circuitul și să testăm programul. De asemenea, verificați fișierul antet complet dat în linkul de mai sus.
Diagrama circuitului și testarea:
Mai jos este schema de circuit pentru interfațarea LCD 16x2 cu microcontroler PIC.
Nu am arătat sursa de alimentare sau conexiunea ICSP în circuitul de mai sus, deoarece folosim aceeași placă pe care am folosit-o în tutorialul anterior, verificați aici.
Un lucru important de observat în program este definiția pinului LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Aceste definiții pin pot fi modificate în funcție de configurarea hardware a programatorilor. Nu uitați să schimbați configurația portului respectată în funcția principală dacă modificați aici.
Hardware-ul pentru acest proiect este foarte simplu. Vom refolosi același modul PIC pe care l-am folosit ultima dată și vom conecta modulul LCD la PIC folosind fire jumper.
Conexiunea poate fi înțeleasă prin următorul tabel:
Pin LCD Nr. |
Numele pinului LCD |
Nume PIN MCU |
Pinul MCU nr. |
1 |
Sol |
Sol |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Sol |
12 |
4 |
Selectați înregistrare |
RD2 |
21 |
5 |
Citeste, scrie |
Sol |
12 |
6 |
Permite |
RD3 |
22 |
7 |
Bit de date 0 |
NC |
- |
8 |
Bit de date 1 |
NC |
- |
9 |
Bit de date 2 |
NC |
- |
10 |
Bit de date 3 |
NC |
- |
11 |
Bit de date 4 |
RD4 |
27 |
12 |
Bit de date 5 |
RD5 |
28 |
13 |
Bit de date 6 |
RD6 |
29 |
14 |
Bit de date 7 |
RD7 |
30 |
15 |
LED pozitiv |
+ 5V |
11 |
16 |
LED negativ |
Sol |
12 |
Acum să facem pur și simplu conexiunile, să aruncăm codul către MCU și să verificăm ieșirea.
Dacă aveți probleme sau îndoieli, vă rugăm să folosiți secțiunea de comentarii. De asemenea, verificați videoclipul demonstrativ prezentat mai jos.