V tokratnem poglavju bomo na naš PIC 16F84 priključili alfanumerični LCD prikazovalnik, ki bo skoraj zagotovo postal pomemben del velikega števila vaših izdelkov z mikrokontrolerji. Naučili se bomo vse podrobnosti programiranja LCD-jev s kontrolerji HD44780 in njimi združljivimi velikosti 1×16 in 2×16 vrstic ter z znaki velikosti 5×8 pik.
LCD prikazovalnik
Danes so LCD (Liquid Cristal Display – prikazovalnik na tekoče kristale) prikazovalniki zelo razširjeni, saj omogočajo izpisovanje črk, številk in ostalih znakov na enostaven način. Prav pridejo vsakič, ko želimo napraviti popoln vmesnik med uporabnikom in elektronsko napravo. Navadno lahko dobimo take s po 1, 2, ali 4 vrsticami teksta, vrstice pa imajo navadno po 16 ali 20 znakov. Mi si bomo ogledali programiranje LCD-jev z 1 ali 2 vrsticami po 16 znakov, ki jih tudi največkrat srečamo (in tudi najlaže dobimo). Cene takih prikazovalnikov so relativno nizke glede na njihovo uporabnost (lahko jih kupite tudi v prodajnem servisu Sveta elektronike). Takim LCD-jem lahko rečemo, da so »pametni«, saj vsebujejo svoj lasten kontroler, ki poskrbi za vklapljanje ustreznih pik na zaslonu, medtem ko mi le pošiljamo enostavne ukaze na njegov vhod in tako določimo, kaj želimo videti na zaslonu. Večina LCD-jev vsebuje kontroler japonskega proizvajalca Hitachi, ki nosi oznako HD44780, lahko pa se v njih nahaja tudi kak drug kontroler, ki je združljiv s HD44780, in jih lahko zato enako priključimo ter programiramo. Ena izmed slabosti tekočih kristalov je ta, da ne oddajajo svetlobe in zato v temi niso uporabni. K sreči lahko kupimo tudi take LCD-je, ki imajo lastno osvetlitev, in so tako primerni tudi za delovanje v temi. Druga slabost LCD-jev je, da ne delujejo pri nižjih temperaturah – kristali se tedaj namreč »ustavijo« in ne reagirajo več na krmilne signale. Ker bodo verjetno v večini primerov vaše naprave delovale pri sobni temperaturi, težav s prenizko temperaturo ne boste imeli, smučarske štoparice za rabo na terenu pa z LCD-ji žal ne boste mogli narediti. Za take primere si bomo v 6. poglavju ogledali 7-segmentne LED prikazovalnike. Pri testiranju programov, zapisanih v tem poglavju, sem uporabljal LCD z 2×16 vrsticami Winstar WH1602B, ki sicer nima kontrolerja HD44780, ampak je z njim popolnoma združljiv. Kot večina običajnih LCD-jev ima tudi ta znake velikosti 5×8 pik.
HD44780 in zgradba LCD prikazovalnika
LCD kontroler HD44780 ima 80 bajtov zaslonskega RAM pomnilnika, ki ga proizvajalci imenujejo DDRAM (kratica pomeni Display Data RAM, torej RAM za podatke prikazovalnika). Poleg DDRAM-a vsebuje HD44780 tudi znakovni ROM pomnilnik s podatki o simbolih, ki jih lahko izpisujemo na LCD. Ker je to ROM pomnilnik, ga ne moremo spreminjati, saj so simboli v kontroler vpisani že tovarniško. Poleg znakovnega ROM pomnilnika imamo na voljo tudi 64 bajtov zaslonskega RAM pomnilnika, v katerega lahko pišemo in iz njega beremo podatke. Ta pomnilnik je namenjen izdelavi lastnih simbolov (tako lahko npr. sami ustvarimo šumnike, ki jih LCD-ji drugače ne poznajo). Če uporabljamo simbole velikosti 5×8 pik, lahko definiramo do 8 novih simbolov. Proizvajalci označujejo znakovni pomnilnik s kratico CGROM oz. CGRAM, kar pomeni Character Generator ROM/RAM (torej ROM/RAM generatorja simbolov). Zaradi krajšega zapisa bom v tem poglavju dosledno uporabljal kratice DDRAM, CGROM in CGRAM. Števila bom zapisoval večinoma šestnajstiško s predpono 0x, tako kot smo navajeni v MPLAB-u. Če bo število desetiško, bom to posebej napisal. Izjemi sta sliki 1 in 2, kjer so vsi naslovi šestnajstiški, čeprav nimajo predpone 0x. Poglejmo si, kakšna je povezava med DDRAM-om in samim zaslonom pri zaslonu 1×16 znakov na sliki 1 in pri zaslonu 2×16 znakov na sliki 2.
Kot lahko vidite na slikah, ima vsak znak na LCD-ju svoj naslov v DDRAM-u. Ker ima LCD z 1×16 znaki le 1 vrstico s 16 znaki, je naslov prvega znaka z leve proti desni enak 0x00, naslov zadnjega pa 0x0F ali 15 desetiško. Naslovi se torej povečujejo po 1 od 0x00 naprej, od leve proti desni od prvega znaka dalje. Pri dvovrstičnih LCD-jih je način naslavljanja znakov enak kot pri enovrstičnih, le da je začetni naslov skrajno levega znaka druge vrstice 0x40. Prva vrstica se ravno tako začne z naslovom 0x00. Kot vidite, se druga vrstica ne začne na naslovu, kjer se prva konča. V bistvu sta prva in druga vrstica navidezno dolgi vsaka po 40 znakov, kar znese skupaj 80 znakov, kolikor je DDRAM pomnilnika (vsak znak zavzame en bajt, torej tako zapolnimo vseh 80 bajtov DDRAM-a). Pri programiranju 2×16 LCD-jev si morate predstavljati, da imate velik zaslon z 2×40 znaki, pri 1×16 LCD-jih pa zaslon z 1×80 znaki. To, kar v resnici vidite na prikazovalniku, je le del tega velikega prikazovalnika, kakor da bi nanj gledali skozi okno, velikosti 2×16 znakov oz. 1×16 znakov, odvisno koliko vrstic ima LCD. To »okno« lahko poljubno premikate po celotnem »velikem« prikazovalniku in tako določite, kaj bo v danem trenutku vidno tudi v resnici. Za lažje razumevanje si poglejmo primer na LCD-ju z 2×16 znaki: od naslova 0x00 (torej od začetka prve vrstice) napišemo stavek »PRVI TEKST«, od naslova 0x10 dalje pa stavek »DRUGI TEKST«. V drugo vrstico napišemo od naslova 0x40 dalje (torej od začetka) stavek »TRETJI TEKST«, od naslova 0x50 dalje pa stavek »CETRTI TEKST«. Ko LCD vklopimo, se bo naše vidno »okno« nahajalo na začetku obeh vrstic in bomo torej videli tak zaslon, tabela 1.
Stavkov »DRUGI TEKST« in »CETRTI TEKST« ne vidimo, ker so izven našega »okna«. Če sedaj pošljemo LCD-ju ukaz, da postavi to »okno« za 16 znakov v desno, bomo na zaslonu videli tak izpis, tabela 2. Sedaj torej vidimo tisto, kar je bilo prej nevidno. LCD-ji z 1×16 znaki delujejo popolnoma enako, le da je »okno« visoko le 1 znak in da je vrstica namesto 40 znakov dolga 80 znakov. Če pomaknemo vidni del zaslona toliko v desno, da njegov desni rob prekorači konec DDRAM-a ene vrstice, se v del zaslona, ki prekorači konec DDRAM-a vpišejo znaki zopet od začetka DDRAM-a. Lahko si torej predstavljamo, da DDRAM deluje kot nekakšen sklenjen krog. Pomikanje zaslona po DDRAM-u lahko vidite na izmišljenem primeru z 2×3 zaslonom na sliki 3. Krožno organizacijo DDRAM-a vam bo bolje pojasnila slika 4. Zaslon lahko pomaknemo kamorkoli po tem krogu s 40 členi in »skozenj« vidimo ustrezne znake. V primeru LCD-ja z 1×16 znaki imamo le enojen krog z 80 členi.
Organizacija CGRAM-a in CGROM-a
CGROM je pomnilnik, ki ga ne moremo spreminjati. Vsebuje podatke o tem, kako so sestavljeni vsi znaki, ki jih LCD pozna. Te znake vpiše v CGROM že proizvajalec pri izdelavi LCD kontrolerja. Nabor znakov je sestavljen iz vseh črk angleške abecede, številk, ločil in še raznovrstnih ostalih znakov. Kateri so ti dodatni znaki, je odvisno od proizvajalca, osnoven nabor ASCII znakov pa je vedno enak. CGROM je organiziran kot nekakšna tabela. Vsak znak ima v tej tabeli svojo kodo, ki je enaka njegovi zaporedni številki. Kadar v DDRAM vpišemo na določen naslov neko 8-bitno število, se bo na zaslonu na tistem naslovu pojavil znak, ki ima kodo enako vpisani vrednosti. Vse črke angleške abecede, številke in še nekateri drugi pogosti znaki (presledek, pika, vejica, klicaj…) imajo to kodo enako njihovi standardni ASCII kodi, kar je zelo praktično pri programiranju (to bomo tudi kasneje videli). CGRAM ima popolnoma enako vlogo kot CGROM, le da lahko vanj sami vpisujemo podatke oz. jih iz njega beremo. Če delamo z normalnimi znaki velikosti 5×8 pik, lahko v CGRAM-u ustvarimo do 8 novih znakov. Simboli, ki jih sami naredimo, imajo kode od 0x00 do 0x07 in jih izpisujemo enako kot vse ostale znake. Kako delamo svoje znake, boste izvedeli v nadaljevanju poglavja. Kako so vsi deli LCD-ja povezani med seboj, si lahko ogledate na sliki 5.
Priklop LCD-ja na PIC 16F84
LCD ima običajno 14 pinov, pri čemer je funkcija posameznega pina standardna in na vseh standardnih LCD-jih enaka. Nekateri LCD-ji imajo lahko še dva dodatna pina za priklop napajanja osvetlitve zaslona. Položaj teh 14 pinov je lahko različen: nekateri jih imajo zgoraj, drugi spodaj. Njihov položaj za nas nima prevelikega pomena, vedeti pa moramo, kje je prvi pin, da se po njem lahko orientiramo in dobimo ostale. K sreči je prvi pin na LCD-jih označen. Na mojem Winstar WH1602B sta prvi in zadnji pin označena s številko (ta LCD ima 16 pinov, ker imajo nekateri modeli tudi osvetlitev). Prvi pin je lahko označen tudi s puščico. Če oznake ne najdete, vam priporočam, da seznam pinov vašega LCD-ja poiščete na Internetu. V naslednji tabeli lahko najdete funkcije posameznih pinov, , tabela 3.