Fórum témák

» Több friss téma
Cikkek » Tényleg nincs királyi út? I. rész
Tényleg nincs királyi út? I. rész
Szerző: icserny, idő: Jún 22, 2013, Olvasva: 26937, Oldal olvasási idő: kb. 6 perc
Lapozás: OK   6 / 8

LCD kijelzők vezérlése

Folyadékkristályos kijelzőkkel (LCD = Liquid Crystal Display) a mindennapi életben számos területén találkozunk, hiszen elterjedten alkalmazzák különféle készülékek (pl. zsebszámológépek, lézernyomtatók, digitális mérlegek, digitális karórák, kenyérsütők, telefonok, italautomaták, digitális lázmérők stb.) kijelzőjeként

Alfanumerikus modul használata

Elsőként egy - ma már ipari szabványnak tekinthető - kétsoros alfanumerikus kijelző modult fogunk vezérelni. A "modul" kifejezés itt arra utal, hogy mi nem közvetlenül az LCD kijelző szegmenseit vezéreljük, hanem olyan LCD-t használunk, ami egybe van építve egy HD44780, vagy azzal kompatibilis IC-re épülő vezérlő áramkörrel is, ami az LCD kijelzőhöz erősített nyomtatott áramköri lapon helyezkedik el. Az "alfanumerikus" jelző pedig arra utal, hogy ezek a modulok saját karaktergenerátorral rendelkeznek (ezen kívül legfeljebb 8 db karaktert mi is definiálhatunk), így a megjelenítendő karakter kódját kell kiküldenünk neki. Ettől eltérően viselkednek a hétszegmenses, vagy a grafikus kijelzők.

Az alfanumerikus kijelzőkről egy korábbi cikkemben már részletesen ismertettem, ezért a részletekre most nem térek ki. Annál is inkább, mert az Energia beépített LiquidCrystal könyvtári modulja jótékonyan elfedi a fölösleges részleteket előlünk.

Hardver követelmények:

  • Launchpad kártya MSP430G2553 vagy MSP430G2452 mikrovezérlővel
  • HD44780 kompatibilis 16x2 karakteres LCD kijelző

A Launchpad kártyát az alábbi ábra szerint huzalozzuk össze  az LCD modullal.

lcd16x2_schema.png 

6_1. ábra: Az MSP430 Launchpad kártya és az LCD modul összekötésének vázlata

A fenti ábra azt a tipikus esetet mutatja be, amikor 5 V-os modult kötünk az egyébként 3,5 V-os tápfeszültségű Launchpad kártyához. Az LCD modul egyébként 3,5 V-on is működne, de a VEE lábra akkor negatív feszültséget kellene kötni a normális kontraszt biztosítására. Emiatt egyszerűbb az a megoldás, hogy az USB csatlakozó melletti TP1 pontról veszünk 5 V-os feszültséget a kijelző számára, ahogy az ábrán is látható. Ebben az esetben a VEE kontrasztvezérlő lábat földre is köthetjük (szebb lesz a kép, ha nem közvetlenül, hanem egy 200 Ω - 1 kΩ közötti értékű ellenálláson keresztül kötjük földre. Az R/W lábat kössük földre, mert nem szabad olvasás módba kapcsolni (az MSP430 mikrovezérlő bemenetei nem tolerálnák az LCD modul 5 V-os jelszintjét). Emiatt a foglaltság figyelésére nincs lehetőségünk, a karakterek kiírása után fix idejű késleltetéseket kell beiktatnunk, hogy a modulnak legyen ideje feldolgozni a kapott adatokat vagy parancsokat. A háttérvilágítás két kivezetése többnyire nincs elkülönítve, hanem a többi kivezetés mellett kapnak helyet, folytatólagosan. A LED anódja a 15., a katódja pedig a 16. kivezetés.

"Van másik!"

Néha sikerül 3,3 V-os tápfeszültségű LCD modult beszerezni (pl. az E-bay kínálatában). Ezeket arról lehet felismerni, hogy a modul hátoldalán az U3-as jelű IC is be van építve (ez állítja elő a kontraszt beállításához szükséges feszültséget). 

lcd1602-3.3v-back.jpg

6_2. ábra: Egy 3,3 V-os LCD modul hátulnézete (vegyük észre: U3 be van építve)

A fenti ábrán látható HJ1602A 3,3 V-os modul esetén a bekötés annyiban módosult a 6_1. ábrához képest, hogy a tápfeszülséget a Launchpad valamelyik VCC jelzésű kivezetéséről vesszük (3,5 V-os tápfeszültség), a VEE lábat pedig nem kötjük be.

 lcd3v3_schema_bb.png

6_3. ábra: A HJ1602 3,3 V-os LCD modul és a Launchpad kártya összekapcsolása

Első próbálkozásunkhoz az Energia hardware\msp430\libraries\LiquidCrystal\examples\ mappájában található mintapéldák közül a Hello World programot választottam ki, de a látványosabb megjelenés kedvéért egy kicsit cifrázni fogunk rajta:

6_1. lista: Az LCD_16x2 program listája

  1. #include  "LiquidCrystal.h" //Becsatoljuk a programkönyvtárat
  2.  
  3. int i, k;
  4. //Inicializáljuk a programkönyvtárat az alábbi lábkiosztással
  5. LiquidCrystal lcd(P2_0, P2_1, P2_2, P2_3, P2_4, P2_5);
  6.  
  7. void setup() {
  8.   lcd.begin(16, 2);              //Beállítjuk a sorok és oszlopok számát)
  9.   lcd.print(""); //Kiírunk egy szöveget az első sorba
  10.   for(i=0; i < 16; i++) {
  11.     k = (i * 7) & 0x0F;
  12.     lcd.setCursor(k, 1);
  13.     lcd.print(k,HEX);
  14.     delay(100);
  15.   }
  16.   delay(2000);
  17.   lcd.clear();                   //Képernyő törlése
  18.   lcd.print("hello, world!");
  19. }
  20.  
  21. void loop() {
  22.   lcd.setCursor(0, 1);          
  23.   lcd.print(millis()/1000);      //Kiíratjuk a Reset óta eltelt időt
  24. }

Az LCD modul használatához be kell csatolni a LiquidCrystal.h fejléc állományt, és példányosítani kell a LiquidCrystal objektumosztályt.  Ekkor, vagyis a példányosításkor kell megadnunk azt is, hogy a kijelző kivezetéseit a mikrovezérlő melyik lábához rendeljük hozzá. Amint a fenti listán látható, a kivezetések felsorolásánál a sorrend a következő: RS láb, E láb, D4, D5, D6 és D7 lábak.

A setup() függvény elején inicializálnunk kell az LCD modult.  Az alábbi utasításban

  1. lcd.begin(16, 2);

az első paraméter a soronkénti karakterek száma (tipikusan 8, 16, 20, 24), a második pedig a sorok száma (1, 2 vagy 4).

Az LCD képernyőre az lcd.print() metódussal írathatunk ki. A kiírás helyét (a kurzort) az lcd.setCursor() metódussal állíthatjuk be. Ennek első paramétere az oszlopszámot, a második pedig a sorszámot adja meg. Ügyeljünk rá, hogy mindkettő számozása 0-tól kezdődik!

A for ciklust csak azért szerveztük, hogy a 0 ... F hexadecimális karakterek kiíratása "összevissza" sorrendben történjen. Egyébként a kurzot beállítjuk a második sor k-adik oszlopába, s kiíratjuk a k számot hexadecimálisan. Némi várakozás után az lcd.clear() metódussal töröljük a képernyőt.  

A loop() végtelen ciklusban a második sorba kiíratjuk a legutóbbi újraindítás óta eltelt időt. A millis() függvényhívás eredméyne milliszekundumokban adja meg ezt az értéket. Az 1000-el történő osztással ezt másodpercekké alakítjuk.

A programfutás eredménye az alábbi képen látható.

lcd_hello_world2.jpg

6_4. ábra: Az LCD_16x2 program futtatása

 

 Nokia 5110 grafikus kijelző vezérlése

A hajdani Nokia 5110 telefonokhoz kifejlesztett monokróm grafikus kijelző kis panelre szerelve ma is kapható (pl. a Sparkfun, E-bay és Adafruit kínálatában). SPI (szinkron soros) kommunikációval vezérelhető. Az Energia IDE gyárilag nem tartalmaz hozzá meghajtó szoftvert (egyelőre), mi most a Rei Vilo által közzétett LCD_5110_SPI könyvtárat fogjuk hozzá használni, amelyet az Energia által a felhasználó Dokumentumok/Energia mappában egy libraries nevű almappában helyezünk el. Ez a program az MSP430G2553 USCI_B modult használja, hardveres támogatású SPI kommunikáció megvalósításához.  

lcd_5110.jpg

6_5. ábra: Nokia 5110 kijelző, kísérleti panelre szerelve

Hardver követelmények:

  • Launchpad kártya MSP430G2553 vagy mikrovezérlővel
  • Nokia 5110 monokróm grafikus LCD kijelző

A Launchpad kártyát az alábbi ábra szerint huzalozzuk össze  az LCD modullal. Ügyeljünk a kivezetések sorrendjére, mert ezeket a kijelzőket többféle lábkiosztási sorrenddel készítik!

nokia5110_schema_bb.png

 6_6. ábra: Az MSP430 Launchpad kártya és a Nokia 5110 modul összekötésének vázlata

A 6_6. ábrán a Sparkfun által forgalmazott kijelző modul lábkiosztását követtük, amelyen a lábak sorrendje balról jobbra így néz ki:

Sorsz.   Név  
Szín Leírás Launchpad
1. VCC narancs   Tápfeszültség VCC
2. GND fekete Közös pont (föld) GND
3. SCE szürke Kiválasztás (chip select)         P2.2
4. RST türkiz Reset P1.0
5. D/C lila Adat/parancs választójel      P2.3
6. DIN kék SPI adatküldés (MOSI) P1.7
7. SCLK sárga SPI órajel (CLK) P1.5
8. LED barna Háttárvilágítás P2.1

 

A program működéséhez be kell csatolnunk az SPI.h és az LCD_5110_SPI.h fejléc állományokat. Előbbi a "gyári" könyvtárak között található, utóbbit nekünk kell a felhasználói könyvtárunkban az Energia/libraries könyvtárban elhelyezni. Rei Vilo programja úgy van megírva, hogy az MSP430 Launchpad kártyán kívül a Stellaris Launchpad kártyával is működjön. A program ezért meg van tűzdelve feltételes fordítási direktívákkal. Most csak azok a programsorok fordulnak be a programunkba, amelyek vagy nincsenek feltételhez kötve, vagy pedig az __MSP430G2553__ szimbólum definiáltságához vannak kötve.

A setup() függvényben előbb az SPI soros kommunikációs egységet kell beállítani, ezt követően pedig az LCD modult inicializáljuk. Az SPI modul órajelének sebességét úgy kell beállítani, hogy az 5 MHz-et ne haladja meg, mert ennyit bír a Nokia 5110 modul PCD8544 típusú vezérlője.

A háttérvilágítást kezdetben bekapcsoljuk (a későbbiek során pedig a Launchpad kártya felhasználói nyomógombjával ki-be kapcsolgathatjuk).  A képernyő bal felső sarkában kiírjuk a "Hello!" üzenetet. Egy másodperc elteltével töröljük a képernyőt, majd a bal alsó sarokba kiírjuk a "Light off" üzenetet. (A mobiltelefonokhoz hasonlóan mindig a gombbal indítható műveletet írjuk ki, azaz a következő gombnyomás lekapcsolja a háttérvilágítást.)

A végtelen ciklusban figyeljük a nyomógombot (lenyomás esetén átváltjuk a háttérvilágítás állapotát), majd nagyobb méretű betűkel felváltva az MSP430, illetve az LM4F feliratokat írjuk ki.

Ezt követően kisebb karaktermérettel egy csillagot (vagy szorzásjelet) szánkáztatunk a képernyőn balról jobbra.

A program kétféle méretű fonttal rajzol ki karaktereket. A fontokat a könyvtárhoz mellékelt  Terminal6.h és Terminal12.h. Tehát bár ebben a programban csak karaktereket/szöveget íratunk ki, a kiírás kicsit komplikáltabb, mint az előző pontban, hiszen most nekünk kell megadni a karakterek alakját is - nincs beépített karakter generátor.

6_2. lista: Az LCD_5110_SPI_main program listája (szerző: Rei Vilo, forrás: GitHub)

  1. #include "Energia.h"
  2. #include "SPI.h"
  3. #include "LCD_5110_SPI.h"
  4.  
  5. #if defined(__MSP430G2553__)
  6.   LCD_5110_SPI myScreen;
  7.  
  8. #elif defined(__LM4F120H5QR__)
  9.   LCD_5110_SPI myScreen(PA_7,    // Chip Select
  10.                         PA_2,    // Data/Command
  11.                         PB_5,    // Reset
  12.                         PA_6,    // Backlight
  13.                         PUSH2);  // Push Button 2
  14. #endif
  15. boolean               backlight = false;
  16. uint8_t k = 0;
  17.  
  18.  
  19. // Add setup code
  20. void setup() {
  21. #if defined(__MSP430G2553__)
  22.     SPI.begin();
  23.     SPI.setClockDivider(SPI_CLOCK_DIV4);
  24.     SPI.setBitOrder(MSBFIRST);
  25.     SPI.setDataMode(SPI_MODE0);
  26. #elif defined(__LM4F120H5QR__)
  27.     SPI.setModule(2);
  28.     SPI.setClockDivider(SPI_CLOCK_DIV16); // max. frequency = 5 MHz !
  29. #endif
  30.     myScreen.begin();
  31.     myScreen.setBacklight(backlight);
  32.     myScreen.text(0, 0, "Hello!");  
  33.     delay(1000);
  34.     myScreen.clear();
  35.     myScreen.text(0, 5, "Light off");
  36. }
  37.  
  38. void loop() {
  39.     if (myScreen.getButton()) {
  40.         backlight = (backlight==0);
  41.         myScreen.setFont(0);
  42.         myScreen.text(0, 5, backlight ? "Light_on" : "Light_off ");
  43.         myScreen.setBacklight(backlight);
  44.     }
  45.     myScreen.setFont(1);
  46.     if (k==0)   myScreen.text(0, 2, " MSP430" );
  47.     else if (k==8)   myScreen.text(0, 2, "  LM4F  " );
  48.     myScreen.setFont(0);
  49.     for (uint8_t i=0; i < 14; i++) myScreen.text(i, 4, (i==k) ? "*" :  " " );
  50.     k ++;
  51.     k %= 14;
  52.     delay(200);
  53. }

A program futási eredménye az alábbi fényképen látható.

lcd_5110_msp.jpg

6_7. ábra: Az LCD_5110_SPI_main program futtatása


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