Morda se vam zdi to precej zapleteno, ampak videli boste, da ni nič kaj posebnega. Inicializacijo je potrebno izvesti le ob vklopu vezja, kasneje pa je delo z LCD-jem veliko enostavnejše. LCD deluje takoj po vklopu napajanja v 8-bitnem načinu. Prav zaradi tega ima prvi ukaz inicializacije, ki določa način delovanja, vse štiri spodnje bite enake 0. Ko je LCD priključen samo preko pinov D7 – D4, so pini D3 – D0 avtomatsko postavljeni na stanje logične 0. Tako lahko prvi ukaz izvedemo ne glede na način priključitve. Ko preklopimo na 4-bitni način, pošiljamo podatke po postopku iz prejšnjega poglavja. Zakasnitve med posameznimi ukazi so lahko daljše, napisal sem le minimalne (nekatere so v HD44780 dokumentaciji še malenkost manjše, vendar je bolje postaviti mejo malo višje). Po inicializaciji moramo videti prazen zaslon, v zgornjem levem kotu pa mora utripati kurzor v obliki črnega pravokotnika. Kot primer si oglejte naslednji program, ki inicializira LCD zaslon z 2×16 znaki.
Program init.asm se nahaja na downloadu.
Program je napisan za tako priključitev LCD-ja, kot jo lahko vidite na shemi iz slike 6. Seveda lahko LCD priključite tudi na kake druge pine, vendar pazite, da bodo pini D7 – D4 vezani na sosednje pine istih vrat mikrokontrolerja v pravem vrstnem redu, sicer boste morali krepko premetavati bite pri programiranju (kot sem že napisal: D7 je zgornji bit, D4 pa spodnji bit 4-bitnega podatka). V programu smo srečali novo direktivo #define. Vse, kar ta direktiva naredi, je, da tekst v prvem parametru zamenja s tekstom v drugem parametru. V našem primeru smo si tako skrajšali pisanje in naredili program bolj pregleden: kadarkoli se npr. v programu pojavi beseda RS, jo prevajalnik zamenja s tekstom PORTB,1, kar je tudi lokacija pina RS (torej pin RB1 na mikrokontrolerju). Če želimo RS pin postaviti na 0, lahko sedaj to napravimo krajše in pregledneje kar z BCF RS namesto z BCF PORTB,1. V glavnem programu smo najprej nastavili mikrokontroler na ustrezen način delovanja. Timerju smo dodelili preddelilnik 1:4, tako da potrebuje za štetje od 0 do prekoračenja TMR0 1,024 ms. To nato uporabimo v podprogramu za milisekundne zakasnitve CakajMs. Tam namreč izbrišemo TMR0 in čakamo, da prekorači svoj obseg in se zopet vrne na 0. Ko se to zgodi, se postavi zastavica T0IF na 1 in nam to prekoračenje sporoči. Podprogram čaka toliko časa, dokler se zastavica ne vklopi, nato pa ta cikel dolžine 1,024 ms ponovi tolikokrat, kolikor je vrednost v registru W pred klicem podprograma. Da bi preprečili klicanje prekinitev ob prekoračitvi TMR0, smo v glavnem programu izklopili bit GIE in tako onemogočili prekinitve. Prav tako moramo paziti, da vedno po prekoračenju vrednosti TMR0 izklopimo bit T0IF, saj tega PIC ne stori sam. Podprogram Cakaj119us napravi 119 µs zakasnitve na dobro poznani način z zanko. Podprogram LCD_init poskrbi za inicializacijo po že opisanem postopku. V tem podprogramu večkrat uporabimo drug podprogram z imenom LCD_pisi. Ta v LCD vpiše neko 8-bitno vrednost v 4-bitnem načinu po postopku, ki smo ga že opisali. Podprogram je tako narejen, da podatek za vpis prebere iz registra W, ki ga moramo tja seveda sami vpisati pred klicem podprograma. V tem delu najdemo tudi 3 nove instrukcije: ANDLW, ANDWF in IORWF. ANDLW (AND Literal with W – napravi logični AND med W in konstanto) napravi logično operacijo AND (IN) med posameznimi istoležnimi biti registra W in števila, ki ga podamo v edinem parametru te instrukcije. Rezultat se vpiše nazaj v register W. Poglejmo si pravilnostno tabelo za operacijo AND in primer operacije med dvema številoma, , tabela 4.


Ukazi LCD prikazovalnika
LCD upravljamo s pomočjo ukazov. Vsak ukaz je koda dolžine enega bajta, ki jo pošljemo v LCD po že poznanem postopku (za 4-bitni način smo že napisali podprogram LCD_pisi, ki zna to storiti. Kodo ukaza moramo pred klicem podprograma vpisati v register W.). Na LCD zaslonu vedno vidimo kurzor, ki ima enako funkcijo kot tisti na zaslonu vašega računalnika. Kurzor lahko tudi izključimo, če pa je vključen, mu lahko določimo dve različni obliki: lahko je tanka črtica ali pa utripajoč temen pravokotnik. Kurzor se vedno nahaja na znaku, ki je na trenutnem naslovu DDRAM-a. Če je trenuten DDRAM naslov izven vidnega polja zaslona, tudi kurzorja ne bomo videli. Kadar v LCD vpišemo nov znak, se bo vedno izpisal tam, kjer se je predhodno nahajal kurzor. Poglejmo si sedaj, katere ukaze pozna LCD.
Clear display (pobriši zaslon)
Okoli tega ukaza ni potrebno dosti razpravljati: vse, kar stori, je, da pobriše LCD zaslon in postavi naslov DDRAM-a na 0x00 (torej postavi kurzor na naslov 0x00). Koda ukaza je 0x01, pina RS in R/W morata biti izključena, po izvedbi ukaza pa moramo počakati več kot 2 ms. Brisanje zaslona poteka tako, da se na vse naslove DDRAM-a vpiše presledek, ki ima ASCII kodo 32 (decimalno). Izbriše se celoten DDRAM, torej tudi tisti del, ki trenutno ni viden na zaslonu.
Return home (postavi zaslon v začetno pozicijo)
Ta ukaz nastavi trenuten naslov DDRAM-a na 0x00, torej pomakne kurzor v zgornji levi rob zaslona, in pomakne vidni del zaslona na začetno pozicijo, torej tako, da ima zgornji levi znak naslov 0x00. Vsebine DDRAM-a ne spremeni, torej ostanejo v njem vsi predhodno vpisani znaki nespremenjeni. Koda ukaza je 0x02, pina RS in R/W morata biti izključena, po izvedbi ukaza pa moramo počakati več kot 2 ms.
