Fórum témák

» Több friss téma
Cikkek » Karakteres LCD kijelző driver AVR és PIC mikrovezérlőkhöz
Karakteres LCD kijelző driver AVR és PIC mikrovezérlőkhöz
Szerző: benjami, idő: Jan 17, 2013, Olvasva: 27699, Oldal olvasási idő: kb. 5 perc
Lapozás: OK   2 / 5

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!
Következő: »»   2 / 5
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem