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. 1 perc
Lapozás: OK   4 / 5

A ’Hello world’ program

Kiindulásnak írjunk egy programot, ami a kijelzőn megjeleníti a "Hello world" szöveget (azért maradtam az angol verziónál, mert az ékezetes betűket sajnos nem tartalmazza a standard karakterkészlet). Miután a charlcd.h-ban elvégeztük a konfigurációs beállításokat, rátérhetünk a főprogramunkra (a cikkben a könyvtári és a mikrovezérlőcsaládtól függő inlude fájlok, valamint a main függvény különböző típusú visszatérési értéke miatti eltérések ismertetésétől eltekintek, a letölthető mintaprogramokban ezek megtekinthetőek).


Egyszeri frissítési üzemmódban (LCDMODEONCE…) az LcdText feltöltése után meg kell hívni az LcdRefreshAll() függvényhívást. (C18 fordító esetében a memcpy helyett a memcpypgm2ram függvényt használjuk!)

  1. #include "charlcd.h"
  2. int main(void)
  3. {
  4.   LcdInit();
  5.   memcpy((char *)LcdText, " Hello world ", 32);
  6.   LcdRefreshAll();
  7.   while(1)
  8.   {
  9.   }
  10. }

 


Megszakítás nélküli folyamatos frissítési üzemmódban (LCDMODECONTBUSY) a végtelen ciklusba be kell iktatni egy LcdProcess() függvényhívást.

  1. #include "charlcd.h"
  2. int main(void)
  3. {
  4.   LcdInit();
  5.   memcpy((char *)LcdText, "   Hello world!                 ", 32);
  6.   while(1)
  7.   {
  8.     LcdProcess();
  9.   }
  10. }


Megszakításos folyamatos frissítési üzemmódban (LCDMODECONTIRQ) üzemmódban csak az LcdText tömböt kell feltölteni, a többit elintézi a driver.

  1. #include "charlcd.h"
  2. int main(void)
  3. {
  4.   LcdInit();
  5.   memcpy((char *)LcdText, "   Hello world!                 ", 32);
  6.   while(1)
  7.   {
  8.   }
  9. }

 

Mivel a PIC16 és PIC18 vezérlők nem használnak a megszakításhoz ugrótáblázatot, manuálisan kell beilleszteni a közös megszakításkiszolgáló függvényünkbe. Ezt egyszerűen egy LcdIntProcess() függvényhívással tehetjük meg. PIC18 esetén az inicializáló függvény beállítástól függően engedélyezheti a kétszintű megszakítás használatát, a függvényhívást a beállított prioritási szint megszakításkiszolgáló függvényébe kell beilleszteni (ha nem használjuk a többszintű megszakítást, akkor a magas prioritásúba). Nem szükséges a megszakítás forrásának szelektálásával bajlódnunk, ezt az LcdIntProcess() megteszi helyettünk (charlcd.h-ban megnézhető hogyan). Ugyanazt a közös megszakításkiszolgáló függvényt természetesen a többi megszakítás kiszolgálására is felhasználhatjuk.
Ezt a következőképpen tehetjük meg PIC16 esetén:

  1. static void interrupt isr(void)
  2. {
  3.   LcdIntProcess();
  4. }

PIC18 esetén:

  1. #pragma code high_vector_section = 0x8
  2. void InterruptVectorHigh(void)
  3. {
  4. _asm goto YourHighPriorityISRCode _endasm
  5. }
  6. #pragma code low_vector_section = 0x18
  7. void InterruptVectorLow(void)
  8. {
  9.  _asm goto YourLowPriorityISRCode _endasm
  10. }
  11.  
  12. #pragma code
  13.  
  14. #pragma interrupt YourHighPriorityISRCode
  15. void YourHighPriorityISRCode(void)
  16. {
  17.   // ha LCDTIMERPR18 == -1 vagy 1 akkor ide illesszük be
  18.   LcdIntProcess();
  19. }
  20.  
  21. #pragma interruptlow YourLowPriorityISRCode
  22. void YourLowPriorityISRCode(void)
  23. {
  24.   // ha LCDTIMERPR18 == 0 akkor ide illesszük be
  25.   LcdIntProcess();
  26. }


A cikk még nem ért véget, lapozz!
Következő: »»   4 / 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