To je naša šesta vadnica v naši vadbeni seriji PIC, v tej vadnici se naučimo povezovanja 16x2 LCD z mikrokrmilnikom PIC. V naših prejšnjih vajah smo se naučili osnov PIC z nekaterimi utripajočimi programi LED in se naučili tudi kako uporabljati merilnike časa v mikrokrmilniku PIC. Tukaj lahko preverite vse vaje o učenju mikrokrmilnikov PIC s pomočjo prevajalnika MPLABX in XC8.
Ta vadnica bo zanimiva, saj se bomo naučili, kako povezati LCD 16 × 2 s PIC16F877A, podroben video si oglejte na koncu te vadnice. Gone so bili stari časi, ko smo za indikacije uporabnikov uporabljali LED. Poglejmo, kako lahko z uporabo LCD zaslonov naredimo naše projekte bolj kul in uporabne. Oglejte si tudi naše prejšnje članke o povezovanju LCD z 8051, z Arduino, z Raspberry Pi, z AVR.
Funkcije za povezovanje LCD-ja z mikrokrmilnikom PIC:
Za lažje stvari smo naredili majhno knjižnico, ki bi lahko stvari olajšala med uporabo LCD-ja z našim PIC16F877A. Datoteka z glavo "MyLCD.h" je tukaj za prenos, ki vsebuje vse potrebne funkcije za pogon LCD-ja s pomočjo PIC MCU. Koda knjižnice je dobro razložena z vrsticami za komentarje, vendar če še vedno dvomite, nas kontaktirajte v razdelku za komentarje. V tem članku si oglejte tudi osnovno delovanje LCD-ja in njegove izrezke.
Opomba: Vedno je priporočljivo vedeti, kaj se dejansko dogaja znotraj vaše glave datoteke, ker vam bo pomagalo pri odpravljanju napak ali med spreminjanjem MCU.
Zdaj lahko to kodo dodate v svoj program na dva načina. Lahko kopirate vse zgornje vrstice kode v MyLCD.h in jih prilepite pred void main (). Lahko pa s povezavo prenesete datoteko glave in jo dodate v datoteko glave vašega projekta ( #include "MyLCD.h "; ). To lahko storite tako, da z desno miškino tipko kliknete datoteko glave in izberete Dodaj obstoječi element ter brskate po tej datoteki glave.
Tu sem kopiral in prilepil kodo datoteke glave v svojo glavno datoteko C. Torej, če uporabljate našo kodo, vam ni treba prenesti in dodati glave datoteke v svoj program, temveč uporabite celotno kodo, navedeno na koncu te vadnice. Upoštevajte tudi, da bo ta knjižnica podpirala samo mikrokrmilnik PIC serije PIC16F.
Tukaj razlagam vsako funkcijo v naši spodnji datoteki glave:
void Lcd_Start (): Ta funkcija bi morala biti prva funkcija, ki jo je treba poklicati za začetek dela z našim LCD-jem. To funkcijo bi morali poklicati samo enkrat, da se izognemo zaostanku v programu.
void Lcd_Start () {Lcd_SetBit (0x00); za (int i = 1065244; i <= 0; i--) NOP (); Lcd_Cmd (0x03); __zakasnitev_ms (5); Lcd_Cmd (0x03); __zakasnitev_ms (11); Lcd_Cmd (0x03); Lcd_Cmd (0x02); // 02H se uporablja za vrnitev domov -> Počisti RAM in inicializira LCD Lcd_Cmd (0x02); // 02H se uporablja za vrnitev domov -> Počisti RAM in inicializira LCD Lcd_Cmd (0x08); // Izberite vrstico 1 Lcd_Cmd (0x00); // Prikaz vrstice 1 Lcd_Cmd (0x0C); // Izberi vrstico 2 Lcd_Cmd (0x00); // Počisti prikaz vrstice 2 Lcd_Cmd (0x06); }
Lcd_Clear (): Ta funkcija počisti LCD zaslon in se lahko uporablja znotraj zank za čiščenje videza prejšnjih podatkov.
Lcd_Clear () {Lcd_Cmd (0); // počistite LCD Lcd_Cmd (1); // Premakni kurzor na prvo mesto}
void Lcd_Set_Cursor (x pos, y pos): Ko je naš LCD pripravljen za sprejem ukazov, ga lahko po zagonu nastavimo na želeno mesto s to funkcijo. Recimo, da če potrebujemo kazalko na 5. znak 1. vrstice. Potem bo funkcija void Lcd_Set_Cursor (1, 5)
void Lcd_Set_Cursor (char a, char b) {char temp, z, y; če (a == 1) {temp = 0x80 + b - 1; // 80H se uporablja za premikanje kurzorja z = temp >> 4; // Spodnji 8-bitni y = temp & 0x0F; // Zgornji 8-bitni Lcd_Cmd (z); // Nastavitev vrstice Lcd_Cmd (y); // Nastavi stolpec} else if (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Spodnji 8-bitni y = temp & 0x0F; // Zgornji 8-bitni Lcd_Cmd (z); // Nastavitev vrstice Lcd_Cmd (y); // Nastavi stolpec}}
void Lcd_Print_Char (char char): Ko je kurzor nastavljen, lahko s preprostim klicem te funkcije zapišemo znak na njegov položaj.
void Lcd_Print_Char (char char) // Pošlji 8-bitne v 4-bitnem načinu {char Lower_Nibble, Upper_Nibble; Lower_Nibble = podatki & 0x0F; Upper_Nibble = podatki & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Pošlji zgornjo polovico s premikom za 4 EN = 1; za (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Pošlji spodnjo polovico EN = 1; za (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): Če naj bo prikazana skupina znakov, potem lahko uporabimo funkcijo niza.
void Lcd_Print_String (char * a) {int i; za (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Razdelite niz s kazalci in pokličite funkcijo Char}
Vsakič, ko pokličete Lcd_Print_Char (char char) , se njegove ustrezne vrednosti znakov pošljejo v podatkovne vrstice LCD-ja. Ti znaki dosežejo HD44780U v obliki bitov. Zdaj ta IC poveže bitov z znakom, ki ga je treba prikazati, s pomočjo pomnilnika ROM, kot je prikazano v spodnji tabeli. V podatkovnem listu krmilnika LCD HD44780U lahko najdete bitov za vse znake .
Zdaj, ker smo zadovoljni z našo datoteko glave, zgradimo vezje in preizkusimo program. Preverite tudi celotno datoteko z glavo v zgornji povezavi.
Shema vezja in preskušanje:
Spodaj je diagram vezja za povezovanje 16x2 LCD z mikrokrmilnikom PIC.
V zgornjem vezju nisem prikazal priključka za napajanje ali ICSP, ker uporabljamo isto ploščo, kot smo jo uporabljali v prejšnjih vajah, preverite tukaj.
Ena pomembna stvar, ki jo je treba opaziti v programu, so definicije pinov LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Te definicije zatičev lahko spremenite glede na nastavitve strojne opreme programerjev. Če spremenite tukaj, ne pozabite spremeniti spoštovane konfiguracije vrat v glavni funkciji.
Strojna oprema za ta projekt je zelo preprosta. Ponovno bomo uporabili isti modul PIC, ki smo ga uporabili zadnjič, in modul LCD povezali z našim PIC s pomočjo mostičnih žic.
Povezavo lahko razumemo v naslednji tabeli:
Številka LCD-ja |
Ime pin LCD |
Ime pin MCU |
Številka MCU št. |
1. |
Tla |
Tla |
12. |
2. |
VCC |
+ 5V |
11. |
3. |
VEE |
Tla |
12. |
4. |
Register Select |
RD2 |
21. |
5. |
Brati, pisati |
Tla |
12. |
6. |
Omogoči |
RD3 |
22. |
7. |
Podatkovni bit 0 |
NC |
- |
8. |
Podatkovni bit 1 |
NC |
- |
9. |
Podatkovni bit 2 |
NC |
- |
10. |
Podatkovni bit 3 |
NC |
- |
11. |
Podatkovni bit 4 |
RD4 |
27. |
12. |
Podatkovni bit 5 |
RD5 |
28. |
13. |
Podatkovni bit 6 |
RD6 |
29. |
14. |
Podatkovni bit 7 |
RD7 |
30. |
15. |
LED pozitivna |
+ 5V |
11. |
16. |
LED negativno |
Tla |
12. |
Zdaj pa preprosto vzpostavimo povezave, odložimo kodo v naš MCU in preverimo izhod.
Če imate kakršne koli težave ali dvome, uporabite odsek za komentarje. Preverite tudi spodnji predstavitveni video.