Kot lahko vidite, bi morali na 16F84 priključiti 11 pinov. Na srečo lahko delujejo LCD-ji tudi v 4-bitnem načinu, v katerem moramo priključiti le 7 pinov. Podatki se v prvem primeru prenašajo po 8 bitov hkrati, v drugem primeru pa po 4 bite hkrati, zato je treba poslati obe polovici bajta posebej. Pri 4-bitnem načinu moramo uporabi linije D4 – D7. Ker je 4-bitni način varčen s pini mikrokontrolerja in ne otežuje preveč izdelave programa, bom opisal samo ta način. Shemo priklopa LCD-ja na PIC 16F84 lahko vidite na sliki 6.
Tretji pin služi nastavitvi kontrasta mikrokontrolerja. Kontrast reguliramo z napetostjo na tem pinu, ki je lahko med 0 in +5 V. V shemi sem nastavljanje te napetosti omogočil s trimer potenciometrom 10 kohm, vezanim kot delilnik napetosti. Z vrtenjem potenciometra tako spreminjamo napetost in s tem nastavljamo kontrast. Pina R/W mi ne bomo potrebovali, ker ne bomo ničesar brali iz LCD-ja. Če želite, ga lahko vežete na maso in tako pridobite še en prost pin na mikrokontrolerju.
Komunikacija z LCD prikazovalnikom
LCD krmilimo tako, da mu pošiljamo ukaze ali pa podatke. Kaj pošiljamo, določa pin 4 z imenom RS. Če je ta pin v stanju logične 0, bo LCD sprejel podatek kot ukaz, če pa bo ta pin enak logični 1, bo podatek sprejet kot navaden podatek. Pin 5 z imenom R/W uporabljamo za določanje smeri podatka: če je pin enak 1, podatke beremo iz LCD-ja, če pa je enak 0, podatke v LCD pišemo. Pin 6 z imenom E je namenjen vklopu LCD-jeve logike. Ko pošljemo nek podatek na LCD, ga moremo namreč nekako obvestiti, da je na podatkovnih linijah nov podatek. To storimo tako, da postavimo pin E na logično 1, nato pa zopet spustimo na logično 0. Pri tem prehodu signala bo LCD sprejel novi podatek. Pini D0 – D7 do namenjeni paralelnemu prenosu podatkov med mikrokontrolerjem in LCD-jem. Nanje vpišemo podatek, ki ga želimo poslati oz. ga iz njih preberemo. Ker je teh pinov 8, lahko hkrati prenesemo 8 bitov, torej 1 bajt. Najnižji bit podatka se nahaja na D0, najvišji bit pa na D7. Če komuniciramo z LCD-jem v 4-bitnem načinu (kot bomo mi delali), pošljemo najprej zgornje 4 bite podatka na pine D4 – D7, vmes vklopimo in izklopimo pin E in nato pošljemo na iste 4 pine še spodnje 4 bite podatka. Po tem je treba seveda zopet vklopiti in izklopiti pin E. Branja podatkov iz LCD-ja mi ne bomo potrebovali, saj ni na njem ničesar zanimivega, kar bi lahko brali. Vsak vpis ukaza oz. podatka vzame LCD-ju nekaj časa, da ga obdela. V tem času mu ne smemo pošiljati naslednjega ukaza oz. podatka. Da bi vedeli, kdaj je LCD zaključil z delom, lahko uporabimo dve metodi: čakanje ali pa preverjanje bita D7, ki deluje kot BUSY bit. Kadar je D7 v tej vlogi na stanju logične 1, LCD še ni zaključil z delom. Naslednji podatek mu lahko pošljemo, ko se D7 postavi na 0. Mi bomo raje uporabljali »metodo« s čakanjem, saj je bolj robustna, ker preprečuje, da bi napaka na LCD-ju spravila PIC v neskončno zanko preverjanja bita D7. Ta metoda je zelo enostavna: za vsak ukaz oz. vpis podatka proizvajalec podaja maksimalen čas, ki ga potrebuje LCD za obdelavo. Če po vpisu podatka naredimo zakasnitev s tem časom trajanja, bo LCD lepo zaključil s svojim delom, mi pa bomo lahko normalno vpisali naslednji podatek. Časa zakasnitve ni potrebno točno nastavljati: lahko je večji od predpisanega, le manjši ne sme biti.Poglejmo si sedaj postopek vpisovanja podatka v 4-bitnem načinu:
- Pin R/W postavimo na 0, saj bomo podatek vpisali.
- RS postavimo na 1 ali 0, odvisno pač od tega, ali bomo vpisali ukaz ali podatek (0 za ukaz, 1 za podatek).
- Na pine D4 – D7 vpišemo zgornje 4 bite podatka.
- Vklopimo in ponovno izklopimo pin E.
- Na pine D4 – D7 vpišemo spodnje 4 bite podatka.
- Vklopimo in ponovno izklopimo pin E.
- Počakamo določen čas (pri vpisu podatka več kot 50 µs, pri ukazih odvisno od ukaza).
To je vse! Poglejmo si še postopek za 8-bitni prenos podatka, ki pa ga bomo potrebovali le pri inicializaciji:
- Pin R/W postavimo na 0, ker podatek vpisujemo.
- RS postavimo na 1 ali 0, odvisno od tega, ali vpisujemo podatek ali ukaz (0 za ukaz, 1 za podatek).
- Na pine D0 – D7 vpišemo podatek oz. ukaz.
- Vklopimo in ponovno izklopimo pin E.
- Počakamo določen čas (pri vpisu podatka več kot 50 µs, pri ukazih odvisno od ukaza).
Sedaj je čas, da pričnemo resno delati z LCD-jem.
Inicializacija
Vsak LCD je potrebno pred uporabo inicializirati, saj v nasprotnem primeru ne bo deloval. Inicializacija je točno določeno zaporedje vhodno/izhodih operacij, ki jih moramo izvesti na LCD zaslonu, da ga postavimo v želen način delovanja. Pri inicializaciji moramo upoštevati, v kakšnem načinu bo LCD deloval: 8-bitnem ali 4-bitnem. Ker nima smisla zapraviti štirih mikrokontrolerjevih pinov, bom opisal le inicializacijo in delo v 4-bitnem načinu. Poglejmo si po vrsti korake pri inicializaciji:
- Po vklopu napajanja počakamo najmanj 15 ms, da se LCD-jeva elektronika stabilizira.
- Pina RS in R/W postavimo na 0 (ukazni način, vpisovanje podatka).
- Na D7 – D4 vpišemo 0x3.
- Vklopimo in izklopimo pin E.
- Počakamo več kot 5 ms.
- Na D7 – D4 vpišemo 0x3.
- Vklopimo in izklopimo pin E.
- Počakamo več kot 100 µs.
- Na D7 – D4 vpišemo 0x3.
- Počakamo več kot 50 µs -> Dosedaj je LCD deloval v 8-bitnem načinu, ki je privzeti način po vklopu.
- Na D7 – D4 vpišemo 0x2 -> Sedaj smo omogočili 4-bitni način. Od tu naprej pošiljamo podatke na LCD po postopku, ki sem ga opisal v prejšnjem poglavju, seveda v 4-bitnem načinu. RS in R/W sta vedno enaka 0.
- Če imamo LCD z 1×16 znaki, pošljemo ukaz 0x20, če pa je znakov 2×16, pošljemo ukaz 0x28.
- Pošljemo ukaz 0x08 -> izklop LCD-ja.
- Pošljemo ukaz 0x01 -> pobriše zaslon, po tem ukazu moramo napraviti najmanj 2 ms zakasnitve.
- Pošljemo ukaz 0x06 -> vklopi pisanje od leve proti desni, onemogoči pomikanje zaslona pri pisanju.
- Pošljemo ukaz 0x0 F -> vklopi zaslon, prikaže kurzor na zaslonu in omogoči njegovo utripanje.