Ito ang aming pang-anim na tutorial sa aming PIC Tutorial Series, sa tutorial na ito natututunan namin ang Interfacing ng 16x2 LCD sa PIC Microcontroller. Sa aming nakaraang mga tutorial natutunan namin ang mga pangunahing kaalaman sa PIC gamit ang ilang mga LED blinking Program at natutunan din kung Paano gamitin ang Mga Timer sa PIC Microcontroller. Maaari mong suriin dito ang lahat ng mga tutorial sa Pag-aaral ng PIC Microcontrollers gamit ang MPLABX at XC8 compiler.
Ang tutorial na ito ay magiging isang nakawiwiling isa dahil matututunan namin Paano Mag-interface ng 16 × 2 LCD na may PIC16F877A, suriin ang detalyadong Video sa dulo ng tutorial na ito. Nawala ang mga dating araw kung saan gumamit kami ng mga LED para sa mga pahiwatig ng gumagamit. Tingnan sa amin kung paano namin gagawing mas cool at kapaki-pakinabang ang aming mga proyekto sa pamamagitan ng paggamit ng mga LCD display. Suriin din ang aming nakaraang mga artikulo sa Interfacing LCD na may 8051, kasama ang Arduino, kasama ang Raspberry Pi, kasama ang AVR.
Mga pagpapaandar para sa Interfacing LCD na may PIC Microcontroller:
Upang gawing mas madali ang mga bagay gumawa kami ng isang maliit na silid-aklatan na maaaring gawing madali ang mga bagay habang ginagamit ang LCD na ito sa aming PIC16F877A. Ang header file na "MyLCD.h" ay ibinibigay dito para sa pag-download, na naglalaman ng lahat ng kinakailangang pagpapaandar upang himukin ang LCD gamit ang PIC MCU. Maipaliwanag ang code ng library sa pamamagitan ng mga linya ng komento ngunit kung mayroon ka pa ring pagdududa na maabot kami sa pamamagitan ng seksyon ng komento Suriin din ang artikulong ito para sa Basic LCD na gumagana at ang mga Pinout nito.
Tandaan: Palaging inirerekumenda na malaman kung ano talaga ang nangyayari sa loob ng iyong header file dahil makakatulong ito sa iyo sa pag-debug o habang binabago ang MCU.
Ngayon, mayroong dalawang paraan upang idagdag ang code na ito sa iyong programa. Maaari mong kopyahin ang lahat ng mga linya sa itaas ng code sa MyLCD.h at i-paste ang mga ito bago ang walang bisa na pangunahing (). O maaari mong i-download ang file ng header gamit ang link at idagdag ang mga ito sa header file ng iyong proyekto ( # isama ang "MyLCD.h "; ). Magagawa ito sa pamamagitan ng pag-right click sa header file at pagpili ng Magdagdag ng mayroon nang Item at pag-browse sa header file na ito.
Dito ko nakopya at na-paste ang header file code sa aking pangunahing C file. Kaya't kung gumagamit ka ng aming code, kung gayon hindi mo kailangang mag-download at idagdag ang file ng header sa iyong programa, gamitin lamang ang kumpletong Code na ibinigay sa pagtatapos ng Tutorial na ito. Tandaan din na susuportahan lamang ng library na ito ang serye ng PIC16F na PIC Microcontroller.
Narito ipinapaliwanag ko ang bawat pag-andar sa loob ng aming header file sa ibaba:
walang bisa Lcd_Start (): Ang pagpapaandar na ito ay dapat na ang unang pag-andar na dapat tawagan upang magsimulang magtrabaho kasama ang aming LCD. Dapat nating tawagan ang pagpapaandar na ito nang isang beses lamang upang maiwasan ang pagkahuli sa programa.
walang bisa Lcd_Start () {Lcd_SetBit (0x00); para sa (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 ay ginagamit para sa Return home -> Nilinaw ang RAM at pinasimulan ang LCD Lcd_Cmd (0x02); // 02H ay ginagamit para sa Return home -> Nilinaw ang RAM at pinasimulan ang LCD Lcd_Cmd (0x08); // Piliin ang Hilera 1 Lcd_Cmd (0x00); // Clear Row 1 Display Lcd_Cmd (0x0C); // Piliin ang Row 2 Lcd_Cmd (0x00); // Clear Row 2 Display Lcd_Cmd (0x06); }
Lcd_Clear (): Ang pagpapaandar na ito ay nalilimas ang LCD screen at maaaring magamit sa loob ng mga loop upang i-clear ang hitsura ng nakaraang data.
Lcd_Clear () {Lcd_Cmd (0); // I-clear ang LCD Lcd_Cmd (1); // Ilipat ang cursor sa unang posisyon}
void Lcd_Set_Cursor (x pos, y pos): Kapag nagsimula na, ang aming LCD ay handa nang kumuha ng mga utos, maaari naming turuan ang LCD na itakda ang cursor nito sa iyong ginustong lokasyon sa pamamagitan ng paggamit ng pagpapaandar na ito. Ipagpalagay kung, kailangan namin ng cursor sa ika-5 character ng 1st row. Pagkatapos ang function ay magiging walang bisa Lcd_Set_Cursor (1, 5)
walang bisa Lcd_Set_Cursor (char a, char b) {char temp, z, y; kung (a == 1) {temp = 0x80 + b - 1; // 80H ay ginagamit upang ilipat ang cursor z = temp >> 4; // Lower 8-bits y = temp & 0x0F; // Upper 8-bits Lcd_Cmd (z); // Set Row Lcd_Cmd (y); // Itakda ang Hanay} iba pa kung (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Lower 8-bits y = temp & 0x0F; // Upper 8-bits Lcd_Cmd (z); // Set Row Lcd_Cmd (y); // Itakda ang Hanay}}
walang bisa Lcd_Print_Char (char data): Kapag naitakda ang cursor maaari naming isulat ang isang character sa posisyon nito sa pamamagitan ng simpleng pagtawag sa pagpapaandar na ito.
void Lcd_Print_Char (char data) // Magpadala ng 8-bit sa pamamagitan ng 4-bit mode {char Lower_Nibble, Upper_Nibble; Lower_Nibble = data at 0x0F; Upper_Nibble = data & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Ipadala ang itaas na kalahati sa pamamagitan ng paglilipat ng 4 EN = 1; para sa (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Send Lower half EN = 1; para sa (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): Kung ang isang pangkat ng mga character ay ipapakita, maaaring magamit ang pagpapaandar ng string.
walang bisa Lcd_Print_String (char * a) {int i; para sa (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Hatiin ang string gamit ang mga pointers at tawagan ang Char function}
Sa tuwing tatawag ang Lcd_Print_Char (char data) , ang kani-kanilang mga halaga ng character ay ipinapadala sa mga linya ng data ng LCD. Ang mga character na ito ay maabot ang HD44780U sa anyo ng mga piraso. Ngayon ang IC na ito ay nauugnay ang mga piraso sa character na maipakita sa pamamagitan ng paggamit ng memorya ng ROM nito tulad ng ipinakita sa talahanayan sa ibaba. Maaari kang makahanap ng mga piraso para sa lahat ng mga character sa datasheet ng HD44780U LCD Controller.
Ngayon, dahil nasiyahan kami sa aming header file magtayo tayo ng circuit at subukan ang programa. Suriin din ang kumpletong file ng header na ibinigay sa link na ibinigay sa itaas.
Circuit Diagram at Pagsubok:
Nasa ibaba ang circuit diagram para sa Interfacing 16x2 LCD na may PIC Microcontroller.
Hindi ko ipinakita ang koneksyon ng Power supply o ICSP sa itaas na circuit, dahil ginagamit namin ang parehong board na ginamit namin sa nakaraang tutorial, suriin dito.
Ang isang mahalagang bagay na mapapansin sa programa ay ang mga kahulugan ng pin ng LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Ang mga kahulugan ng pin na ito ay maaaring mabago alinsunod sa pag-setup ng hardware ng mga programmer. Tandaan na baguhin ang respetadong pagsasaayos ng port sa pangunahing pag-andar kung magbago ka rito.
Ang hardware para sa proyektong ito ay napaka-simple. Gagamitin namin muli ang parehong module ng PIC na ginamit namin noong huling oras at ikonekta ang LCD module sa aming PIC gamit ang mga jumper wires.
Ang koneksyon ay maaaring maunawaan ng sumusunod na talahanayan:
LCD Pin No. |
Pangalan ng LCD Pin |
Pangalan ng MCU Pin |
Ang MCU Pin No. |
1 |
Lupa |
Lupa |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Lupa |
12 |
4 |
Magrehistro Piliin |
RD2 |
21 |
5 |
Basa sulat |
Lupa |
12 |
6 |
Paganahin |
RD3 |
22 |
7 |
Data Bit 0 |
NC |
- |
8 |
Data Bit 1 |
NC |
- |
9 |
Data Bit 2 |
NC |
- |
10 |
Data Bit 3 |
NC |
- |
11 |
Data Bit 4 |
RD4 |
27 |
12 |
Data Bit 5 |
RD5 |
28 |
13 |
Data Bit 6 |
RD6 |
29 |
14 |
Data Bit 7 |
RD7 |
30 |
15 |
Positive na LED |
+ 5V |
11 |
16 |
Negatibo sa LED |
Lupa |
12 |
Hayaan lamang nating gawin ang mga koneksyon, itapon ang code sa aming MCU at i-verify ang output.
Kung mayroon kang anumang problema o pag-aalinlangan, mangyaring gamitin ang seksyon ng komento. Suriin din ang Demo Video na ibinigay sa ibaba.