Dit is onze zesde tutorial in onze PIC Tutorial Series, in deze tutorial leren we de interface van 16x2 LCD met PIC Microcontroller. In onze vorige tutorials hebben we de basisprincipes van PIC geleerd met behulp van enkele LED-knipperende programma's en hebben we ook geleerd hoe je timers in PIC Microcontroller kunt gebruiken. Je kunt hier alle tutorials bekijken over het leren van PIC-microcontrollers met behulp van MPLABX en XC8-compiler.
Deze tutorial zal interessant zijn omdat we zullen leren hoe je 16 × 2 LCD met PIC16F877A kunt verbinden, bekijk de gedetailleerde video aan het einde van deze tutorial. Voorbij zijn de oude dagen waarin we LED's gebruikten voor gebruikersindicaties. Laten we eens kijken hoe we onze projecten er cooler en nuttiger kunnen laten uitzien door lcd-schermen te gebruiken. Bekijk ook onze eerdere artikelen over Interfacing LCD met 8051, met Arduino, met Raspberry Pi, met AVR.
Functies voor het verbinden van LCD met PIC-microcontroller:
Om het gemakkelijker te maken, hebben we een kleine bibliotheek gemaakt die het u gemakkelijk zou kunnen maken tijdens het gebruik van dit LCD-scherm met onze PIC16F877A. Het header-bestand "MyLCD.h" wordt hier gegeven om te downloaden, dat alle noodzakelijke functies bevat om de LCD aan te sturen met behulp van PIC MCU. Bibliotheekcode wordt goed uitgelegd door commentaarregels, maar als u nog steeds twijfelt, kunt u ons bereiken via het commentaargedeelte. Bekijk ook dit artikel voor basis LCD-werking en de pin-outs.
Opmerking: het wordt altijd aanbevolen om te weten wat er werkelijk in uw headerbestand gebeurt, omdat dit u zal helpen bij het debuggen of bij het wijzigen van de MCU.
Nu zijn er twee manieren om deze code aan uw programma toe te voegen. U kunt ofwel alle bovenstaande regels code in MyLCD.h kopiëren en deze vóór de leegte main () plakken. Of u kunt het header-bestand downloaden via de link en ze toevoegen aan het header-bestand van uw project ( #include "MyLCD.h "; ). Dit kan gedaan worden door met de rechtermuisknop op het header-bestand te klikken, Bestaand item toevoegen te selecteren en naar dit header-bestand te bladeren.
Hier heb ik de code van het headerbestand gekopieerd en in mijn C-hoofdbestand geplakt. Dus als u onze code gebruikt, hoeft u het headerbestand niet te downloaden en aan uw programma toe te voegen, gebruik gewoon de volledige code die aan het einde van deze zelfstudie wordt gegeven. Merk ook op dat deze bibliotheek alleen PIC16F-serie PIC Microcontroller ondersteunt.
Hier leg ik elke functie in ons headerbestand hieronder uit:
void Lcd_Start (): Deze functie zou de eerste functie moeten zijn die moet worden aangeroepen om met onze LCD te werken. We moeten deze functie maar één keer aanroepen om vertraging in het programma te voorkomen.
leegte Lcd_Start () {Lcd_SetBit (0x00); voor (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 wordt gebruikt voor Return home -> Wist het RAM en initialiseert de LCD Lcd_Cmd (0x02); // 02H wordt gebruikt voor Return home -> Wist de RAM en initialiseert de LCD Lcd_Cmd (0x08); // Selecteer rij 1 Lcd_Cmd (0x00); // Wis rij 1 weergave Lcd_Cmd (0x0C); // Selecteer rij 2 Lcd_Cmd (0x00); // Wis rij 2 weergave Lcd_Cmd (0x06); }
Lcd_Clear (): Deze functie wist het LCD-scherm en kan binnen loops worden gebruikt om de weergave van eerdere gegevens te wissen.
Lcd_Clear () {Lcd_Cmd (0); // Wis het LCD-scherm Lcd_Cmd (1); // Verplaats de cursor naar de eerste positie}
void Lcd_Set_Cursor (x pos, y pos): Eenmaal gestart, is ons LCD-scherm klaar om commando's te accepteren , we kunnen het LCD-scherm instrueren om de cursor op de door u gewenste locatie te plaatsen door deze functie te gebruiken. Stel dat we de cursor op het 5e teken van de 1e rij nodig hebben. Dan is de functie ongeldig Lcd_Set_Cursor (1, 5)
leegte Lcd_Set_Cursor (char a, char b) {char temp, z, y; if (a == 1) {temp = 0x80 + b - 1; // 80H wordt gebruikt om de cursor te verplaatsen z = temp >> 4; // Lagere 8-bits y = temp & 0x0F; // Bovenste 8-bits Lcd_Cmd (z); // Stel rij Lcd_Cmd (y) in; // Set Column} else if (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Lagere 8-bits y = temp & 0x0F; // Bovenste 8-bits Lcd_Cmd (z); // Stel rij Lcd_Cmd (y) in; // Kolom instellen}}
void Lcd_Print_Char (char data): Zodra de cursor is ingesteld, kunnen we een teken naar zijn positie schrijven door deze functie eenvoudig aan te roepen.
void Lcd_Print_Char (char data) // Stuur 8-bits via 4-bit-modus {char Lower_Nibble, Upper_Nibble; Lower_Nibble = data & 0x0F; Upper_Nibble = data & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Stuur de bovenste helft door te verschuiven met 4 EN = 1; voor (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Stuur onderste helft EN = 1; voor (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): Als een groep karakters getoond moet worden, dan kan de stringfunctie gebruikt worden.
void Lcd_Print_String (char * a) {int i; voor (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Splits de string met behulp van pointers en roep de Char-functie aan}
Elke keer dat de Lcd_Print_Char (char data) wordt aangeroepen, worden de respectievelijke karakterwaarden naar de datalijnen van het LCD gestuurd. Deze karakters bereiken de HD44780U in de vorm van bits. Nu relateert dit IC de bits aan het teken dat moet worden weergegeven door het ROM-geheugen te gebruiken, zoals weergegeven in de onderstaande tabel. U kunt bits voor alle tekens vinden in het gegevensblad van de HD44780U LCD-controller.
Nu we tevreden zijn met ons header-bestand, laten we het circuit bouwen en het programma testen. Controleer ook het volledige header-bestand in de bovenstaande link.
Schakelschema en testen:
Hieronder ziet u het schakelschema voor Interfacing 16x2 LCD met PIC Microcontroller.
Ik heb de voeding of ICSP-aansluiting in het bovenstaande circuit niet getoond, omdat we hetzelfde bord gebruiken dat we in de vorige tutorial hebben gebruikt, kijk hier.
Een belangrijk ding om op te merken in het programma zijn de pin-definities van LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Deze pin-definities kunnen worden gewijzigd volgens de hardware-instellingen van de programmeurs. Vergeet niet om de gerespecteerde poortconfiguratie in de hoofdfunctie te wijzigen als u hier verandert.
De hardware voor dit project is heel eenvoudig. We gaan dezelfde PIC-module hergebruiken die we de vorige keer hebben gebruikt en de LCD-module verbinden met onze PIC met behulp van jumperdraden.
De verbinding kan worden begrepen door de volgende tabel:
LCD Pin Nr. |
Naam LCD-pincode |
MCU-pinnaam |
MCU Pin Nr. |
1 |
Grond |
Grond |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Grond |
12 |
4 |
Registreren Selecteer |
RD2 |
21 |
5 |
Lezen schrijven |
Grond |
12 |
6 |
Inschakelen |
RD3 |
22 |
7 |
Gegevensbit 0 |
NC |
- |
8 |
Gegevensbit 1 |
NC |
- |
9 |
Gegevensbit 2 |
NC |
- |
10 |
Gegevensbit 3 |
NC |
- |
11 |
Gegevensbit 4 |
RD4 |
27 |
12 |
Gegevensbit 5 |
RD5 |
28 |
13 |
Gegevensbit 6 |
RD6 |
29 |
14 |
Gegevensbit 7 |
RD7 |
30 |
15 |
LED Positief |
+ 5V |
11 |
16 |
LED negatief |
Grond |
12 |
Laten we nu gewoon de verbindingen maken, de code naar onze MCU dumpen en de uitvoer verifiëren.
Als je problemen of twijfels hebt, gebruik dan het commentaargedeelte. Controleer ook de demo video hieronder gegeven.