Dette er vår sjette opplæring i vår PIC Tutorial Series, i denne opplæringen lærer vi Grensesnitt av 16x2 LCD med PIC Microcontroller. I våre tidligere veiledninger har vi lært det grunnleggende om PIC ved hjelp av noen LED-blinkende programmer, og har også lært hvordan du bruker timere i PIC Microcontroller. Du kan sjekke her alle veiledningene om å lære PIC-mikrokontrollere ved hjelp av MPLABX- og XC8-kompilatoren.
Denne opplæringen vil være interessant fordi vi vil lære hvordan man bruker 16 × 2 LCD-grensesnitt med PIC16F877A, sjekk den detaljerte videoen på slutten av denne opplæringen. Borte er de gamle dagene der vi brukte lysdioder for brukerindikasjoner. La oss se hvordan vi kan gjøre prosjektene våre mer kule og nyttige ved å bruke LCD-skjermer. Sjekk også våre tidligere artikler om Grensesnitt LCD med 8051, med Arduino, med Raspberry Pi, med AVR.
Funksjoner for grensesnitt LCD med PIC Microcontroller:
For å gjøre ting enklere har vi laget et lite bibliotek som kan gjøre ting enkelt når du bruker denne LCD-skjermen med vår PIC16F877A. Overskriftsfilen "MyLCD.h" er gitt her for nedlasting, som inneholder alle nødvendige funksjoner for å kjøre LCD-skjermen ved hjelp av PIC MCU. Bibliotekode er godt forklart av kommentarlinjer, men hvis du fortsatt er i tvil, kan du nå oss gjennom kommentarseksjonen. Sjekk også denne artikkelen for grunnleggende LCD-arbeid og dens pinouts.
Merk: Det anbefales alltid å vite hva som faktisk skjer inne i headerfilen din, fordi det vil hjelpe deg med feilsøking eller mens du endrer MCU.
Nå er det to måter å legge til denne koden i programmet ditt. Du kan enten kopiere alle ovennevnte kodelinjer i MyLCD.h og lime dem inn før ugyldig hoved (). Eller du kan laste ned headerfilen ved hjelp av lenken og legge dem til headerfilen til prosjektet ditt ( #include "MyLCD.h "; ). Dette kan gjøres ved å høyreklikke på toppfilen og velge Legg til eksisterende element og bla gjennom denne toppfilen.
Her har jeg kopiert og limt inn overskriftsfilkoden i hoved-C-filen min. Så hvis du bruker koden vår, trenger du ikke laste ned og legge til toppteksten i programmet, bare bruk den fullstendige koden som er gitt på slutten av denne veiledningen. Vær også oppmerksom på at dette biblioteket bare støtter PIC16F-serien PIC Microcontroller.
Her forklarer jeg hver funksjon i topptekstfilen vår nedenfor:
ugyldig Lcd_Start (): Denne funksjonen skal være den første funksjonen som må kalles for å begynne å jobbe med LCD-skjermen. Vi bør kun kalle denne funksjonen en gang for å unngå forsinkelser 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 brukes til å returnere hjem -> Tømmer RAM og initialiserer LCD Lcd_Cmd (0x02); // 02H brukes til å returnere hjem -> Tømmer RAM og initialiserer LCD-skjermen Lcd_Cmd (0x08); // Velg rad 1 Lcd_Cmd (0x00); // Fjern rad 1-skjerm Lcd_Cmd (0x0C); // Velg rad 2 Lcd_Cmd (0x00); // Fjern rad 2-visning Lcd_Cmd (0x06); }
Lcd_Clear (): Denne funksjonen tømmer LCD-skjermen og kan brukes i løkker for å fjerne utseendet til tidligere data.
Lcd_Clear () {Lcd_Cmd (0); // Fjern LCD Lcd_Cmd (1); // Flytt markøren til første posisjon}
ugyldig Lcd_Set_Cursor (x pos, y pos): Når LCD-skjermen er startet, er den klar til å ta kommandoer, vi kan instruere LCD-en til å sette markøren på ønsket sted ved å bruke denne funksjonen. Anta at hvis vi trenger markøren på 5. tegn i første rad. Da blir funksjonen ugyldig 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 brukes til å flytte markøren z = temp >> 4; // Lavere 8-bits y = temp & 0x0F; // Øvre 8-bits Lcd_Cmd (z); // Sett rad Lcd_Cmd (y); // Sett kolonne} annet hvis (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Lavere 8-bits y = temp & 0x0F; // Øvre 8-bits Lcd_Cmd (z); // Sett rad Lcd_Cmd (y); // Sett kolonne}}
ugyldig Lcd_Print_Char (char data): Når markøren er satt, kan vi skrive et tegn til dets posisjon ved å enkelt kalle denne funksjonen.
ugyldig Lcd_Print_Char (char data) // Send 8-bits gjennom 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); // Send øvre halvdel ved å 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; }
ugyldig Lcd_Print_String (char * a): Hvis en gruppe tegn skal vises, kan strengfunksjonen brukes.
ugyldig Lcd_Print_String (char * a) {int i; for (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Del strengen ved hjelp av pekere og ring Char-funksjonen}
Hver gang Lcd_Print_Char (char data) kalles, blir dens respektive tegnverdier sendt til datalinjene på LCD-skjermen. Disse tegnene når HD44780U i form av biter. Nå relaterer denne IC bitene til tegnet som skal vises ved å bruke ROM-minnet som vist nedenfor. Du kan finne biter for alle tegnene i databladet til HD44780U LCD Controller.
Nå, siden vi er fornøyde med topptekstfilen, la oss bygge kretsen og teste programmet. Sjekk også fullstendig topptekstfil gitt i lenken ovenfor.
Kretsdiagram og testing:
Nedenfor er kretsskjemaet for grensesnitt 16x2 LCD med PIC Microcontroller.
Jeg har ikke vist strømforsyningen eller ICSP-tilkoblingen i kretsen ovenfor, siden vi bruker det samme kortet som vi har brukt i forrige opplæring, sjekk her.
En viktig ting å legge merke til i programmet er pin-definisjonene av LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Disse pin-definisjonene kan endres i henhold til programmørens maskinvareoppsett. Husk å endre respektert portkonfigurasjon i hovedfunksjonen hvis du endrer her.
Maskinvaren for dette prosjektet er veldig enkel. Vi skal bruke den samme PIC-modulen som vi brukte forrige gang, og koble LCD-modulen til PIC-en vår ved hjelp av jumperledninger.
Forbindelsen kan forstås av følgende tabell:
LCD-pinne nr. |
LCD-pinnens navn |
MCU-pinnenavn |
MCU-pinne nr. |
1 |
Bakke |
Bakke |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Bakke |
12 |
4 |
Registrer Velg |
RD2 |
21 |
5 |
Les Skriv |
Bakke |
12 |
6 |
Muliggjøre |
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 |
1. 3 |
Databit 6 |
RD6 |
29 |
14 |
Databit 7 |
RD7 |
30 |
15 |
LED-positiv |
+ 5V |
11 |
16 |
LED negativ |
Bakke |
12 |
La oss bare lage tilkoblinger, dump koden til MCU og verifisere utgangen.
Hvis du har noen problemer eller tvil, vennligst bruk kommentarseksjonen. Sjekk også demonstrasjonsvideoen nedenfor.