Det här är vår sjätte handledning i vår PIC-handledningsserie, i denna handledning lär vi oss gränssnitt mellan 16x2 LCD och PIC Microcontroller. I våra tidigare handledning har vi lärt oss grunderna i PIC med hjälp av några blinkande LED-program och har också lärt oss hur man använder timers i PIC Microcontroller. Här kan du se alla handledning om inlärning av PIC-mikrokontroller med MPLABX- och XC8-kompilator.
Denna handledning kommer att vara intressant eftersom vi lär oss hur man gränssnitt 16 × 2 LCD med PIC16F877A, kolla detaljerad video i slutet av denna handledning. Borta är de gamla dagarna där vi använde lysdioder för användarindikationer. Låt oss se hur vi kan göra våra projekt mer coola och användbara med hjälp av LCD-skärmar. Kolla även våra tidigare artiklar om Gränssnitts LCD med 8051, med Arduino, med Raspberry Pi, med AVR.
Funktioner för gränssnitt mellan LCD och PIC Microcontroller:
För att göra det enklare har vi skapat ett litet bibliotek som kan göra det enkelt när vi använder denna LCD-skärm med vår PIC16F877A. Rubrikfilen "MyLCD.h" ges här för nedladdning, som innehåller alla nödvändiga funktioner för att driva LCD-skärmen med PIC MCU. Bibliotekskod förklaras väl av kommentarrader men om du fortfarande tvivlar nå oss genom kommentarsektionen. Läs även den här artikeln för grundläggande LCD-arbete och dess pinouts.
Obs! Det rekommenderas alltid att veta vad som faktiskt händer i din rubrikfil eftersom det hjälper dig att felsöka eller medan du ändrar MCU.
Nu finns det två sätt att lägga till den här koden i ditt program. Du kan antingen kopiera alla ovanstående kodrader i MyLCD.h och klistra in dem före det ogiltiga huvudet (). Eller så kan du ladda ner rubrikfilen med länken och lägga till dem i projektets rubrikfil ( #include "MyLCD.h "; ). Detta kan göras genom att högerklicka på rubrikfilen och välja Lägg till befintligt objekt och bläddra till den här rubrikfilen.
Här har jag kopierat och klistrat in rubrikfilkoden i min C-huvudfil. Så om du använder vår kod behöver du inte ladda ner och lägga till rubrikfilen i ditt program, använd bara den fullständiga koden som ges i slutet av denna handledning. Observera också att detta bibliotek endast stöder PIC16F-serien PIC Microcontroller.
Här förklarar jag varje funktion i vår rubrikfil nedan:
ogiltig Lcd_Start (): Denna funktion ska vara den första funktionen som måste anropas för att börja arbeta med vår LCD. Vi bör ringa den här funktionen bara en gång för att undvika fördröjning i programmet.
ogiltig Lcd_Start () {Lcd_SetBit (0x00); för (int i = 1065244; i <= 0; i--) NOP (); Lcd_Cmd (0x03); __fördröja_ms (5); Lcd_Cmd (0x03); __fördröja_ms (11); Lcd_Cmd (0x03); Lcd_Cmd (0x02); // 02H används för Return home -> Rensar RAM-minnet och initialiserar LCD-skärmen Lcd_Cmd (0x02); // 02H används för att återvända hem -> Rensar RAM-minnet och initialiserar LCD-skärmen Lcd_Cmd (0x08); // Välj rad 1 Lcd_Cmd (0x00); // Rensa rad 1 Visa Lcd_Cmd (0x0C); // Välj rad 2 Lcd_Cmd (0x00); // Rensa rad 2 Visa Lcd_Cmd (0x06); }
Lcd_Clear (): Denna funktion rensar LCD-skärmen och kan användas i öglor för att rensa utseendet på tidigare data.
Lcd_Clear () {Lcd_Cmd (0); // Rensa LCD Lcd_Cmd (1); // Flytta markören till första position}
ogiltig Lcd_Set_Cursor (x pos, y pos): När LCD-skärmen har startats är den redo att ta kommandon, vi kan instruera LCD-skärmen att ställa in markören på önskad plats med den här funktionen. Antag att om vi behöver markören på femte tecknet i första raden. Då blir funktionen ogiltig Lcd_Set_Cursor (1, 5)
ogiltig Lcd_Set_Cursor (char a, char b) {char temp, z, y; om (a == 1) {temp = 0x80 + b - 1; // 80H används för att flytta markören z = temp >> 4; // Lägre 8-bitars y = temp & 0x0F; // Övre 8-bitars Lcd_Cmd (z); // Ställ in rad Lcd_Cmd (y); // Ställ in kolumn} annat om (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Lägre 8-bitars y = temp & 0x0F; // Övre 8-bitars Lcd_Cmd (z); // Ställ in rad Lcd_Cmd (y); // Ställ in kolumn}}
ogiltig Lcd_Print_Char (char data): När markören är inställd kan vi skriva ett tecken till dess position genom att enkelt anropa den här funktionen.
ogiltig Lcd_Print_Char (char data) // Skicka 8-bitar genom 4-bit-läge {char Lower_Nibble, Upper_Nibble; Lower_Nibble = data & 0x0F; Upper_Nibble = data & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Skicka övre halvan genom att flytta med 4 EN = 1; för (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Skicka nedre halvan EN = 1; för (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
ogiltig Lcd_Print_String (char * a): Om en grupp tecken ska visas kan strängfunktionen användas.
ogiltig Lcd_Print_String (char * a) {int i; för (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Dela strängen med hjälp av pekare och ring Char-funktionen}
Varje gång Lcd_Print_Char (char data) anropas skickas dess respektive teckenvärden till datalinjerna på LCD-skärmen. Dessa karaktärer når HD44780U i form av bitar. Nu relaterar denna IC bitarna till tecknet som ska visas med hjälp av dess ROM-minne som visas i tabellen nedan. Du kan hitta bitar för alla tecken i databladet för HD44780U LCD Controller.
Nu, eftersom vi är nöjda med vår rubrikfil, låt oss bygga kretsen och testa programmet. Kontrollera också hela rubrikfilen i länken ovan.
Kretsschema och testning:
Nedan är kretsschemat för gränssnitt 16x2 LCD med PIC Microcontroller.
Jag har inte visat strömförsörjningen eller ICSP-anslutningen i ovanstående krets, eftersom vi använder samma kort som vi använde i föregående handledning, kolla här.
En viktig sak att lägga märke till i programmet är stiftdefinitionerna av LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Dessa stiftdefinitioner kan ändras enligt programmets hårdvaruinställningar. Kom ihåg att ändra den respekterade portkonfigurationen i huvudfunktionen om du ändrar här.
Maskinvaran för detta projekt är mycket enkel. Vi kommer att återanvända samma PIC-modul som vi använde förra gången och ansluta LCD-modulen till vår PIC med hjälp av bygeln.
Anslutningen kan förstås av följande tabell:
LCD-stift nr. |
LCD-stiftnamn |
MCU-stiftnamn |
MCU-stift nr. |
1 |
Jord |
Jord |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Jord |
12 |
4 |
Registrera Välj |
RD2 |
21 |
5 |
Läsa skriva |
Jord |
12 |
6 |
Gör det möjligt |
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 |
Låt oss helt enkelt skapa anslutningar, dumpa koden till vår MCU och verifiera utdata.
Om du har några problem eller tvivel, använd kommentarsektionen. Kontrollera också demovideoen nedan.