Használatának módja:
- Hozzunk létre egy új projectet, a projecthez adjuk hozzá a charlcd.c-t.
- Hozzuk létre a főprogramunkat a „main” függvénnyel (ne a charlcd.c-ben).
- Az imént létrehozott kódunk elejére illesszük be a következőt: #include "charlcd.h"
- A charlcd.h-ben állítsuk be a kívánt paramétereket (ennek részleteiről később lesz szó ).
- A main függvényünk elejére tegyünk be egy LcdInit(); függvényhívást. Ha valamelyik LCD-hez használt láb bekapcsolás után A/D bemenetként funkcionál, azt mindenképp az LcdInit() hívása előtt állítsuk át digitális I/Ora!
- A megjelenítendő szöveget LcdChar[] tömb megfelelő pozíciójába tegyük bele. A program 1 karakterrel nagyobb helyet foglal a szükségesnél, hogy az esetleges lezáró #0 is beleférjen. Arra nagyon vigyázzunk, hogy ezt a tömböt ne írjuk túl!
- Megszakításos üzemmódban PIC16, PIC18-at használva az interrupt kiszolgáló függvénybe be kell szúrni az LcdIntProcess() függvényt. PIC18 esetében ezt az LCDTIMERPR18 által kiválasztott prioritáshoz illesszük be!. Ez azért szükséges, mert ezeknek csak 1, illetve 2 közös megszakításvektora van.
- Ha megszakítás nélküli folyamatos frissítési üzemmódot használunk (LCDMODECONTBUSY), a fő programhurokba szúrjunk be egy LcdProcess() függvényhívást. Az fontos, hogy a függvény rendszeresen (legalább néhány milliszekundum sűrűséggel) meghívásra kerüljön, ellenkező esetben a kijelző tartalma nem, vagy nagyon lassan fogja követni az LcdChar tömb tartalmának változásait. Ha ez nem biztosítható, válasszunk más üzemmódot.
- Egyszeri frissítési üzemmódokban szólni kell az Lcd driver programnak, hogy változott a megjelenítendő szöveg, ugyan másolja már át a szöveget a kijelzőbe. Ezt az LcdRefreshAll() függvény meghívásával tudjuk megtenni.
A konfiguráció beállítása a charlcd.h –ban (az üzemmódokból csak egyet válasszunk ki!)
#define LCDMODEONCEBUSY
Egyszeri frissítési üzemmód megszakítás nélkül, BUSY flag figyeléssel kiválasztása.
#define LCDMODEONCEDELAY
Egyszeri frissítési üzemmód megszakítás nélkül, LCD írási műveletek között várakozási ciklussal kiválasztása.
#define LCDMODEONCEIRQ
Egyszeri frissítési üzemmód megszakítással kiválasztása.
#define LCDMODECONTBUSY
Folyamatos frissítési üzemmód megszakítás nélkül kiválasztása.
#define LCDMODECONTIRQ
Folyamatos frissítési üzemmód megszakítással kiválasztása.
#include "hardwareprofile.h"
Ha közös hardverkonfigurációs állományt használunk, akkor azt itt megadhatjuk. Ebben az esetben az ott megadott beállításokat charlcd.h file-ban töröljük komment jellel.
#define LCD4BITMODE
Ha definiálva van 4 bites módban lesz működtetve a kijelzőt. Ekkor az adatlábak közül csak D4..D7 lábak aktívak. 8 bites módot használva komment jellel töröljük.
#define LCDRWUSED
Ha nincs szükség BUSY FLAG olvasására, az R/W láb megspórolható. Ekkor az kijelző R/W lábát GND-re kell kötni, a definíció pedig komment jellel törölhető. Ilyenkor LCDRWPORT és LCDRWPINNUM értékei nem lesz felhasználva.
#define LCDEPORT 'A..G'
Itt adjuk meg, hogy az LCD E lábat melyik porthoz tartozó lábra kötjük.
#define LCDEPINNUM n
Itt adjuk meg, hogy az LCD E lábat a kiválasztott port melyik lábára kötjük.
#define LCDE2PORT 'A..G'
Itt adjuk meg, hogy az LCD E2 lábat melyik porthoz tartozó lábra kötjük (csak 2db, vagy dupla vezérlős LCD esetén).
#define LCDE2PINNUM n
Itt adjuk meg, hogy az LCD E2 lábat a kiválasztott port melyik lábára kötjük (csak 2db, vagy dupla vezérlős LCD esetén).
#define LCDRWPORT 'A..G'
Itt adjuk meg, hogy az LCD R/W lábat melyik porthoz tartozó lábra kötjük.
#define LCDRWPINNUM n
Itt adjuk meg, hogy az LCD R/W lábat a kiválasztott port melyik lábára kötjük.
#define LCDRSPORT 'A..G'
Itt adjuk meg, hogy az LCD RS lábat melyik porthoz tartozó lábra kötjük.
#define LCDRSPINNUM n
Itt adjuk meg, hogy az LCD RS lábat a kiválasztott port melyik lábára kötjük.
#define LCDDT0PORT 'A..G'
Itt adjuk meg, hogy az LCD D0 lábat melyik porthoz tartozó lábra kötjük.
#define LCDDT0PINNUM n
Itt adjuk meg, hogy az LCD D0 lábat a kiválasztott port melyik lábára kötjük.
#define LCDDT1PORT 'A..G'
Itt adjuk meg, hogy az LCD D1 lábat melyik porthoz tartozó lábra kötjük.
#define LCDDT1PINNUM n
Itt adjuk meg, hogy az LCD D1 lábat a kiválasztott port melyik lábára kötjük.
D2..D7 lábakat is a fentiek szerint kell megadni. 4 bites üzemmódban elég D4..D7 lábak megadása, ilyenkor a D0..D3 definícióit nem használja.
#define SystemClock x
#define CpuClock y
Itt adhatjuk meg a rendszer és a CPU órajel frekvenciáját. A CpuClock alapján számítja ki az inicializáláshoz szükséges várakozási ciklusszámokat és ez határozza meg az E lábra adott impulzus megfelelő hosszához szükséges Nop utasítások számát is. Megszakításos üzemmódban a SystemClock alapján számítja ki a Timer beállításait. Ha ez a két órajel megegyezik, elegendő csak a SystemClock-ot megadni.
#define LCDLINES n
Az LCD kijelző sorainak száma (n értéke 1, 2 vagy 4 lehet)
#define LCDWIDTH n
Az LCD kijelző oszlopainak száma (n értéke maximum 40 lehet)
#define LCDSTEREO
2 db azonos sorszámú, 80 karakteresnél kisebb kijelzőt is használhatunk, ekkor a szöveg első fele az első, a második fele a második kijelzőn fog megjelenni. A kijelzők E lábait E, E2 lábak definíciói szerint kell bekötni, a többi lábat pedig párhuzamosan.
#define LCDTIMERNUM n
Megszakításos üzemmódban itt adhatjuk meg, melyik időzítőt használjuk. Az adott mikrovezérlőn létező és másra nem használt időzítőt válasszunk.
#define LCDTIMERPR18 n
PIC18 csak megszakítás módban: melyik prioritású megszakítást használja az időzítőhöz? Lehetséges értékei:
- -1 : nincs a többszintű prioritás használva (ilyenkor minden megszakítás a HIGH interruptra kerül)
- 0 : alacsony prioritás
- 1 : magas prioritás
#define LCDUSERTIMER
Csak megszakítás módban: lehetőség van saját időzítésből hívogatni a frissítő rutint. Ilyenkor nem történik meg a TIMER inicializálása, azt nekünk kell megoldanunk. Akkor érdemes ezt használni, ha más célra is használunk időzítőt, ami a kijelző frissítési ütemezése (néhány milliszekundum) szerinti tempóban jár (pl. óra). Ebben az esetben az időzítőhöz tartozó megszakításkiszolgáló függvényből hívjuk meg az LcdIntProcess() függvényt.
#define LCDFRAMEPERSEC n
Csak megszakításos módban: a kijelző frissítési sebessége (FPS). A javasolt értéke 20. A megadott értékkel azt adjuk meg, hogy másodpercenként hányszor vigye át a kijelzőre az LcdChar tömb teljes tartalmát. Az időzítő osztóit az itt megadott értékből, a kijelző karaktereinek számából és a megadott rendszerórajelból fogja a fordítóprogram kikalkulálni.
#define LCDEXECUTIONTIME n
Csak LCDMODEONCEDELAY módban felhasználva: a kijelző parancsvégrehajtási ideje (usec)
(A kijelző adatlapján EXECUTION TIME találjuk. 40usec a tipikus ideje, legalább ekkora időt válasszunk!)
#define LCDBLINKCHAR
Ha definiálva van, lehetőségünk van bármelyik és bármennyi karakter villogtatására (akár az összes is villoghat). Villogás be: LcdBlinkChar(5) függvény kiadása után az 5. karakter villogni fog (változót is adhatunk paraméternek). Villogás ki: LcdUnBlinkChar(5) függvény kiadása után az 5. karakter nem fog villogni (változót is adhatunk paraméternek). Arra ügyeljünk, hogy a tömböt ne írjuk túl!
#define LCDBLINKSPEED n
Csak LCDMODECONTIRQ üzemmódban, az automatikus villogás sebességének megadása. Ha pl. 5-öt adunk meg, az a következőt jelenti: 5 frame ideig látszik a szöveg, majd 5 frame ideig sötét (ez LCDFRAMEPERSEC 20 esetén fél másodperces periódusidőt jelent). Ha nem szeretnél automatikus villogtatást, akkor n = 0 értéket adj meg. Ekkor BlinkPhase változóba 0 értéket írva látszanak a villogó karakterek, egyébként nem. Azokban az üzemmódokban, ahol nem lehetséges az automatikus villogás, ott is ezzel a módszerrel lehet villogást létrehozni. Egyszeri frissítési üzemmód esetén LcdRefreshAll() függvényt is meg kell hívni ahhoz, hogy az aktuális villogási fázis szerint megjelenítendő tartalom átkerüljön a kijelzőre.
#define LCDCURSOR
Kurzorhasználat engedélyezése (csak egyszeri frissítési üzemmódban)
kurzor pozíció beállítása: LcdCursorPos = n (0 < n < kijelző(k) karaktereinek száma - 1)
kurzor bekapcsolása: LcdCursorOn()
kurzor kikapcsolása: LcdCursorOff()
villogó kurzor bekapcsolása: LcdCursorBlink()
villogó kurzor kikapcsolása: LcdCursorUnBlink()
A kurzor pozíció és kurzor állapot beállítása után LcdRefreshAll() függvényt is meg kell hívni, hogy a beállított állapot átkerüljön a kijelzőre.
#define LCDZEROCHANGE
Ha definiálva van, az LcdText-ben levő #0 kódú karakterek helyett #32 (SPACE) karaktert ír ki a kijelzőre. Ez akkor hasznos, ha könyvtári számátalakító függvényeket használunk. Ezek ugyanis #0 lezáró karaktert tesznek a szám végére, így az LcdText tömbünk belsejébe #0 karakterek kerülhetnek, ami az LCD-nek az első felhasználói karaktert jelenti. Mivel ez a karakter a #8 karakterkóddal is megjeleníthető, célszerű szóközre cserélni.
#define USERCHARSET
Ha definiáljuk, a kijelző inicializálásakor a kijelzőbe feltölti az általunk megtervezett 8 saját karaktert is. A karaktereket a #define USERxCHARy definíciók értékeinek módosításával állíthatjuk elő. A 0 érékű bit világos, az 1 értékű bit sötét pontot fog eredményezni világos hátterű kijelző esetén. Az általam létrehozott példákban 0..7-ig inverz számok vannak, hogy könnyen be lehessen azonosítani.
#define USERCHARSETCHANGE
Karakterkészlet futás alatti változtatásának lehetősége. LcdChangeCharset(char* pch) függvénnyel lehet feltölteni az aktuális karakterkészletet. a karakterkészletet USERCHARSETARRAY típusú változóval lehet létrehozni a RAM-ban.
A cikk még nem ért véget, lapozz!