Aquest és el nostre sisè tutorial de la nostra sèrie de tutorials PIC; en aquest tutorial aprenem la interfície de 16x2 LCD amb microcontrolador PIC. En els nostres tutorials anteriors, hem après els conceptes bàsics del PIC mitjançant alguns programes LED intermitents i també hem après a utilitzar els temporitzadors al microcontrolador PIC. Podeu consultar aquí tots els tutorials sobre l’aprenentatge de microcontroladors PIC mitjançant el compilador MPLABX i XC8.
Aquest tutorial serà interessant perquè aprendrem a fer una interfície LCD 16 × 2 amb PIC16F877A. Consulteu el vídeo detallat al final d’aquest tutorial. S’han acabat els vells temps en què utilitzàvem els LED per indicar l’usuari. Vegem com podem fer que els nostres projectes semblin més frescos i útils mitjançant pantalles LCD. Consulteu també els nostres articles anteriors sobre Interfacing LCD amb 8051, amb Arduino, amb Raspberry Pi i AVR.
Funcions per a la interfície LCD amb microcontrolador PIC:
Per fer les coses més fàcils, hem creat una petita biblioteca que pot facilitar les coses mentre s’utilitza aquesta pantalla LCD amb el nostre PIC16F877A. Aquí es pot descarregar el fitxer de capçalera "MyLCD.h", que conté totes les funcions necessàries per conduir la pantalla LCD mitjançant PIC MCU. El codi de la biblioteca s’explica bé mitjançant les línies de comentaris, però si teniu dubtes, arribeu-nos a través de la secció de comentaris. Consulteu també aquest article per veure si funciona el LCD bàsic i els seus pinouts.
Nota: Sempre es recomana saber què passa realment dins del fitxer de capçalera perquè us ajudarà a depurar o canviar la MCU.
Ara hi ha dues maneres d’afegir aquest codi al vostre programa. Podeu copiar totes les línies de codi anteriors a MyLCD.h i enganxar-les abans del void main (). O bé podeu descarregar el fitxer de capçalera mitjançant l'enllaç i afegir-los al fitxer de capçalera del vostre projecte ( #include "MyLCD.h "; ). Això es pot fer fent clic dret al fitxer de capçalera i seleccionant Afegeix un element existent i navegant per aquest fitxer de capçalera.
Aquí he copiat i enganxat el codi del fitxer de capçalera al meu fitxer C. principal. Per tant, si utilitzeu el nostre codi, no cal que baixeu i afegiu el fitxer de capçalera al vostre programa, només cal que utilitzeu el codi complet que es dóna al final d’aquest tutorial. Tingueu en compte també que aquesta biblioteca només admet el microcontrolador PIC de la sèrie PIC16F.
Aquí explico cada funció del nostre fitxer de capçalera a continuació:
void Lcd_Start (): aquesta funció hauria de ser la primera que s'ha de cridar per començar a treballar amb la nostra pantalla LCD. Hauríem de trucar a aquesta funció només una vegada per evitar un retard en el programa.
void Lcd_Start () {Lcd_SetBit (0x00); per a (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’utilitza per tornar a casa -> Esborra la memòria RAM i inicialitza el LCD Lcd_Cmd (0x02); // 02H s’utilitza per tornar a casa -> Esborra la memòria RAM i inicialitza el LCD Lcd_Cmd (0x08); // Seleccioneu la fila 1 Lcd_Cmd (0x00); // Esborra la pantalla 1 de la pantalla Lcd_Cmd (0x0C); // Seleccioneu la fila 2 Lcd_Cmd (0x00); // Esborra la pantalla 2 de la pantalla Lcd_Cmd (0x06); }
Lcd_Clear (): aquesta funció neteja la pantalla LCD i es pot utilitzar dins de bucles per esborrar l’aspecte de les dades anteriors.
Lcd_Clear () {Lcd_Cmd (0); // Esborreu la pantalla LCD Lcd_Cmd (1); // Mou el cursor a la primera posició}
void Lcd_Set_Cursor (x pos, y pos): Un cop iniciat, el nostre LCD està preparat per rebre ordres, podem indicar-li que estableixi el cursor a la vostra ubicació preferida mitjançant aquesta funció. Suposem que si necessitem el cursor al cinquè caràcter de la primera fila. Llavors, la funció serà nul·la 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’utilitza per moure el cursor z = temp >> 4; // Baixar 8 bits y = temp & 0x0F; // Lcd_Cmd (z) de 8 bits superior; // Estableix la fila Lcd_Cmd (y); // Estableix la columna} else if (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Baixar 8 bits y = temp & 0x0F; // Lcd_Cmd (z) de 8 bits superior; // Estableix la fila Lcd_Cmd (y); // Estableix la columna}}
void Lcd_Print_Char (dades de caràcters): Un cop configurat el cursor, podem escriure un caràcter a la seva posició mitjançant una simple trucada a aquesta funció.
void Lcd_Print_Char (dades de caràcters) // Enviar 8 bits mitjançant el mode de 4 bits {char Lower_Nibble, Upper_Nibble; Lower_Nibble = dades & 0x0F; Upper_Nibble = dades & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Envieu la meitat superior canviant 4 EN = 1; per a (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Envia la meitat inferior EN = 1; per a (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): si es vol mostrar un grup de caràcters, es pot utilitzar la funció de cadena.
void Lcd_Print_String (char * a) {int i; per a (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Divideix la cadena amb punteres i truca a la funció Char}
Cada vegada que es crida a Lcd_Print_Char (dades de caràcters) , els seus valors de caràcters respectius s’envien a les línies de dades de la pantalla LCD. Aquests caràcters arriben a l'HD44780U en forma de bits. Ara aquest IC relaciona els bits amb el caràcter que es mostrarà utilitzant la seva memòria ROM tal com es mostra a la taula següent. Podeu trobar bits per a tots els caràcters al full de dades del controlador LCD HD44780U.

Ara, com que estem satisfets amb el nostre fitxer de capçalera, construïm el circuit i provem el programa. Comproveu també el fitxer de capçalera complet que apareix a l’enllaç que s’indica més amunt.
Diagrama de circuits i proves:
A continuació es mostra el diagrama de circuits per a la interfície LCD de 16 x 2 amb microcontrolador PIC.

No he mostrat la font d'alimentació ni la connexió ICSP al circuit anterior, ja que estem utilitzant la mateixa placa que hem utilitzat en el tutorial anterior, consulteu aquí.

Una cosa important que cal tenir en compte al programa són les definicions de pin de LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Aquestes definicions de pins es poden canviar segons la configuració del maquinari dels programadors. Recordeu canviar la configuració de port respectada a la funció principal si canvieu aquí.
El maquinari d’aquest projecte és molt senzill. Reutilitzarem el mateix mòdul PIC que vam utilitzar l'última vegada i connectarem el mòdul LCD al nostre PIC mitjançant cables de pont.
La connexió es pot entendre mitjançant la taula següent:
|
Pin LCD núm. |
Nom del pin LCD |
Nom del PIN del MCU |
PIN MCU núm. |
|
1 |
Terra |
Terra |
12 |
|
2 |
VCC |
+ 5V |
11 |
|
3 |
VEE |
Terra |
12 |
|
4 |
Selecciona el registre |
RD2 |
21 |
|
5 |
Llegir escriure |
Terra |
12 |
|
6 |
Activa |
RD3 |
22 |
|
7 |
Bit de dades 0 |
NC |
- |
|
8 |
Bit de dades 1 |
NC |
- |
|
9 |
Bit de dades 2 |
NC |
- |
|
10 |
Bit de dades 3 |
NC |
- |
|
11 |
Bit de dades 4 |
RD4 |
27 |
|
12 |
Bit de dades 5 |
RD5 |
28 |
|
13 |
Bit de dades 6 |
RD6 |
29 |
|
14 |
Bit de dades 7 |
RD7 |
30 |
|
15 |
LED positiu |
+ 5V |
11 |
|
16 |
LED negatiu |
Terra |
12 |
Ara simplement fem les connexions, bolquem el codi a la nostra MCU i verificem la sortida.

Si teniu problemes o dubtes, utilitzeu la secció de comentaris. Consulteu també el vídeo de demostració que es mostra a continuació.
