Dette er vores sjette tutorial i vores PIC Tutorial Series, i denne tutorial lærer vi Interfacing af 16x2 LCD med PIC Microcontroller. I vores tidligere tutorials har vi lært det grundlæggende i PIC ved hjælp af nogle blinkende LED-programmer og har også lært hvordan man bruger timere i PIC Microcontroller. Du kan her tjekke alle vejledningerne i Learning PIC Microcontrollers ved hjælp af MPLABX og XC8 compiler.
Denne tutorial vil være interessant, fordi vi lærer at interface 16 × 2 LCD med PIC16F877A, se den detaljerede video i slutningen af denne tutorial. Borte er de gamle dage, hvor vi brugte lysdioder til brugerindikationer. Lad os se, hvordan vi kan få vores projekter til at se mere seje og nyttige ud ved hjælp af LCD-skærme. Tjek også vores tidligere artikler om Interfacing LCD med 8051, med Arduino, med Raspberry Pi, med AVR.
Funktioner til interfacering af LCD med PIC Microcontroller:
For at gøre tingene lettere har vi lavet et lille bibliotek, der kan gøre tingene lette, når du bruger denne LCD-skærm med vores PIC16F877A. Overskriftsfilen "MyLCD.h" er angivet her til download, som indeholder alle de nødvendige funktioner til at drive LCD ved hjælp af PIC MCU. Bibliotekets kode er godt forklaret med kommentarlinjer, men hvis du stadig er i tvivl, kan du nå os gennem kommentarsektionen. Se også denne artikel for grundlæggende LCD-arbejde og dens pinouts.
Bemærk: Det anbefales altid at vide, hvad der faktisk sker i din headerfil, fordi det hjælper dig med fejlretning eller mens du ændrer MCU.
Nu er der to måder at tilføje denne kode til dit program. Du kan enten kopiere alle ovenstående kodelinjer i MyLCD.h og indsætte dem før det ugyldige hoved (). Eller du kan downloade headerfilen ved hjælp af linket og føje dem til headerfilen i dit projekt ( #include "MyLCD.h "; ). Dette kan gøres ved at højreklikke på headerfilen og vælge Tilføj eksisterende element og gennemse denne headerfil.
Her har jeg kopieret og indsat headerfilkoden i min C-hovedfil. Så hvis du bruger vores kode, behøver du ikke downloade og tilføje headerfilen til dit program, bare brug den komplette kode, der er givet i slutningen af denne vejledning. Bemærk også, at dette bibliotek kun understøtter PIC16F-serien PIC Microcontroller.
Her forklarer jeg hver funktion inde i vores header-fil nedenfor:
ugyldigt Lcd_Start (): Denne funktion skal være den første funktion, der skal kaldes for at begynde at arbejde med vores LCD. Vi skal kun kalde denne funktion en gang for at undgå forsinkelse i programmet.
ugyldig Lcd_Start () {Lcd_SetBit (0x00); for (int i = 1065244; i <= 0; i--) NOP (); Lcd_Cmd (0x03); __forsink_ms (5); Lcd_Cmd (0x03); __forsink_ms (11); Lcd_Cmd (0x03); Lcd_Cmd (0x02); // 02H bruges til at vende hjem -> Rydder RAM og initialiserer LCD Lcd_Cmd (0x02); // 02H bruges til at vende hjem -> Rydder RAM og initialiserer LCD Lcd_Cmd (0x08); // Vælg række 1 Lcd_Cmd (0x00); // Ryd række 1 Display Lcd_Cmd (0x0C); // Vælg række 2 Lcd_Cmd (0x00); // Ryd række 2 Display Lcd_Cmd (0x06); }
Lcd_Clear (): Denne funktion rydder LCD-skærmen og kan bruges inde i sløjfer til at rydde udseendet af tidligere data.
Lcd_Clear () {Lcd_Cmd (0); // Ryd LCD Lcd_Cmd (1); // Flyt markøren til første position}
ugyldigt Lcd_Set_Cursor (x pos, y pos): Når LCD'et er startet, er det klar til at tage kommandoer, vi kan instruere LCD'et om at indstille sin markør på det sted, du foretrækker ved hjælp af denne funktion. Antag, hvis vi har brug for markøren ved 5. tegn i 1. række. Derefter annulleres funktionen Lcd_Set_Cursor (1, 5)
ugyldig Lcd_Set_Cursor (char a, char b) {char temp, z, y; hvis (a == 1) {temp = 0x80 + b - 1; // 80H bruges til at flytte markøren z = temp >> 4; // Lavere 8-bits y = temp & 0x0F; // Øvre 8-bit Lcd_Cmd (z); // Indstil række Lcd_Cmd (y); // Indstil kolonne} ellers hvis (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Lavere 8-bits y = temp & 0x0F; // Øvre 8-bit Lcd_Cmd (z); // Indstil række Lcd_Cmd (y); // Indstil kolonne}}
ugyldigt Lcd_Print_Char (char data): Når markøren er indstillet, kan vi skrive et tegn til dets position ved blot at kalde denne funktion.
ugyldig Lcd_Print_Char (char data) // Send 8-bit gennem 4-bit mode {char Lower_Nibble, Upper_Nibble; Lower_Nibble = data & 0x0F; Upper_Nibble = data & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Send øvre halvdel ved at skifte med 4 EN = 1; for (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Send nedre halvdel EN = 1; for (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
ugyldigt Lcd_Print_String (char * a): Hvis en gruppe tegn skal vises, kan strengfunktionen bruges.
ugyldig Lcd_Print_String (char * a) {int i; for (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Opdel strengen ved hjælp af pekere og kalde Char-funktionen}
Hver gang Lcd_Print_Char (char data) kaldes, sendes dens respektive tegnværdier til datalinjerne på LCD'et. Disse tegn når HD44780U i form af bits. Nu relaterer denne IC bitene til det tegn, der skal vises ved hjælp af dens ROM-hukommelse som vist nedenstående tabel. Du kan finde bits til alle tegn i databladet til HD44780U LCD-controller.
Nu, da vi er tilfredse med vores header-fil, lad os bygge kredsløbet og teste programmet. Kontroller også den komplette headerfil, der er angivet i linket ovenfor.
Kredsløbsdiagram og test:
Nedenfor er kredsløbsdiagrammet til Interfacing 16x2 LCD med PIC Microcontroller.
Jeg har ikke vist strømforsyningen eller ICSP-forbindelsen i ovenstående kredsløb, da vi bruger det samme kort, som vi har brugt i den foregående vejledning, se her.
En vigtig ting at bemærke i programmet er pin-definitionerne på LCD:
#definer RS RD2 #definer EN RD3 #definer D4 RD4 #definer D5 RD5 #definer D6 RD6 #definer D7 RD7
Disse pin-definitioner kan ændres i henhold til programmørernes hardwareopsætning. Husk at ændre den respekterede portkonfiguration i hovedfunktionen, hvis du ændrer her.
Hardwaren til dette projekt er meget enkel. Vi vil genbruge det samme PIC-modul, som vi brugte sidste gang, og forbinde LCD-modulet til vores PIC ved hjælp af jumperledninger.
Forbindelsen kan forstås ved følgende tabel:
LCD-stift nr. |
LCD-pin-navn |
MCU-pin-navn |
MCU pin nr. |
1 |
Jord |
Jord |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Jord |
12 |
4 |
Registrer Vælg |
RD2 |
21 |
5 |
Læse skrive |
Jord |
12 |
6 |
Aktiver |
RD3 |
22 |
7 |
Databit 0 |
NC |
- |
8 |
Databit 1 |
NC |
- |
9 |
Databit 2 |
NC |
- |
10 |
Databit 3 |
NC |
- |
11 |
Databit 4 |
RD4 |
27 |
12 |
Databit 5 |
RD5 |
28 |
13 |
Databit 6 |
RD6 |
29 |
14 |
Databit 7 |
RD7 |
30 |
15 |
LED Positiv |
+ 5V |
11 |
16 |
LED negativ |
Jord |
12 |
Lad os nu bare oprette forbindelser, dumpe koden til vores MCU og kontrollere output.
Hvis du har problemer eller tvivl, skal du bruge kommentarsektionen. Tjek også demo-videoen nedenfor.