V tomto článku sa pokúsime oživiť 2x16 riadkový LCD display
Doporučené preštudovať: Bitový posun | Input/Output, D/A set
Príkladov oživenia LCD displejov je naozaj veľa. Pri väčšine kódov sa však dá stretnúť, že implementácia LCD driveru ako súčasť neakého väčšieho celku by bolo bez úpravy naozaj problém.
Popíšem princíp fungovania LCD modulov a navrhnem program na jeho oživenie.
Ako LCD displej som si zvolil typ PVC160203PGL01.
LCD displej je klasický LCD 2x16 znakov bez podsvietenia.
Napájanie ............... od 4.7 - 5.3 V.
Prúd ...................... 2.5 mA.
Schéma zapojenia:
LCD obsahuje HD44780 radič poskytujúci znakovú sadu pre LCD.
LCD umožňuje dva módy prijímania dát: 4-bitový a 8-bitový.
Dáta sa odosielajú prostredníctvom 4 resp. 8 bitovej zbernice. LCM (Load Control Module) modul ďalej podporuje dva režimy: znakový a riadiaci.
Pri Riadiacom režime LCM modul spracuje vstupné signály na 8 bitovej zbernici a vykoná ich definovanú funkcionalitu, tabuľka 7., napr.posunutie kurzora, odstránenie znakov na displeji a podobne.
Pri oživovaní musí byť LCD v riadiacom režime a oživí sa po odosielaní sekvencií riadiacích impulzo.
Pri dátovom režime, LCM spracuje vstupné dáta na 8 bitovej zbernici a zobrazí definovaný znak . Jednotlivé režimy a módy sa nastavujú prostredníctvom troch riadiacích vstupov LCD displeja E, RW, RS.
Každý jeden z týchto vstupov, môže byť v stave log. "0" alebo log. "1".
Vstupom RW (Read/Write) nastavujeme LCM do stavu:
log. "0"→ Write, zapisovania znakov do DDRAM
log. "1"→ Read - čítanie znakov z DDRAM.
Vstupom RS nastavujeme LCM modul do stavu:
log. "0"→ Command - LCM po prijatí dát ich vyhodnotí ako inštrukcie a vykoná definovanú funkcionalitu
log. "1"→ Dáta - LCM prijaté dáta berie ako znaky a zobrazí ich.
Vstup E slúži ako potvrdzovací. Odoslané dáta do LCD je nutné v určitú chvíľu potvrdiť.
Pre tento druh LCD, je oneskorenie nastavenia binárnych stavov:
log. "1"→ 1us → log "0"
Odosielanie dát v znakovom a riadiacom režime bude chronologicky:
Znak. [(set S)= log "0"] - [send Data] - [(set E) = log. "1"→ log "0"]
Riad. [(set S)= log "1"] - [send Data] - [(set E) = log. "1"→ log "0"]
Príkazová sada LCD
Príkazovou sadou LCD sme schopný ovládať LCD.
Sada nám umožňuje, operácie s kurzorom ako nastavenie na domovskú pozíciu, nastavenie kurzoru na
daný riadok a danú pozíciu, pohyb kurzoru vpred, povolenie/zakázanie blikania kurzoru, uspanie displeja,
zmazanie riadku displeja, ...
Znaková sada LCD
Kompletná znaková sada je k dispozícií v dátových listoch vyššie.
Prekopírovaná sada v zlej kvalite:
Z obrázka znakovej sady LCD vidíme, že pri prímaní znakov potrebujeme znaky od 0x20 - 0x7F.
Oživenie displeja
Pri zapnutí napájania displeja sa LCM modul nachádza v polo-disablovanom (inicializačnom móde).
V tejto fáze modul sám o sebe nedokáže spracovávať dáta na zobrazenie.
Z LCD pinov na riadiacej zbernici (E, R/W, RS) modul akceptuje len logické hodnoty:
E → log.1/0
R/W → log.0
RS → log.1
Neakceptuje:
R/W → log.1 (čítanie displeja)
RS → log.0 (znakový režim).
Očakáva sekvenciu riadiacich znakov z tabuľky 7. odoslané v určitom poradí a s určitým oneskorením.
Po obdŕžaní riadiacích inštrukcií, sa LCM prepne do plne funkčného režimu v ktorom povolí ostatnú funkcionalitu LCD.
Oživenie displeja - výpis z kódu |
Delay_ms(100);
LCD_Send_(1,LCD.bit8_1ine1,null,0, null); Delay_ms(5); LCD_Send_(1,LCD.bit8_1ine1,null,0, null); Delay_us(150); LCD_Send_(1,LCD.bit8_1ine1,null,0, null); Delay_us(150); LCD_Send_(1,LCD.bit8_line2,null,0, null); Delay_us(150); LCD_Send_(1,LCD.disable_lcd,null,0, null); Delay_ms(3); LCD_Send_(1,LCD.clear_lcd,null,0, null); Delay_ms(15); |
Návrh inicializácie som urobil so snahou čo najväčšej kompatibility s inými LCD modulmi.
Vypisovanie textu na displej
Po nastavení riadiaceho vstupu RS na log. "0", sa procesorom odošlú dáta na dátovú zbernicu, porty procesora: RB1, RB2, RB3, RB7, RB8, RB9, RB13, RB14.
V okamihu odoslania dát zbernicou sa po 1ms nastaví riadiaci vstup LCD E na log. "1".
Po 2ms sa vstup E nastaví na log. "0" a na 1ms sa procesor uspí.
Vo fáze odosielania dát po zbernici LCM displeja nereaguje.
Dáta na dátovej zbernici spracuje až vo chvíli, kedy sa s oneskorením na vstup E privedie log. "1" a následne log. "0".
V tomto kroku LCM dostáva impulz, aby prijal dáta na dátovej zbernici.
Akonáhle ich príjme, tak sa znovu prepne do režimu "waiting", kedy čaká na potvrdzovací impulz na vstupe E.
Všeobecne platí, že pokiaľ LCD hneď po odoslaní dát nedostane potvrdzovací impulz, tak hladiny logických impulzov na dátovej zbernici ignoruje.
Hneď po potvrdzovacom impulze E je nutné, aby procesor počkal 1ms.
LCM je pomalší než MCU, a pri odosielaní by LCM modul dostal potvrdzovací impulz ešte skôr, než by stihol vypísať predošlé dáta a znaky by sa nevypísali.
Znaky vypisujeme prostredníctvom funkcie, ktorá musí obsahovať okrem iných parametrov parameter vyjadrujúci počet odosielaných dát na LCD displej, a parameter reprezentujúci samostatné dáta.
Počet prenášaných dát využívame pri odosielaní dát na LCD prijatých z USB.
Samotné dáta sa prenášajú ako byte/uint8_t prípadne ako string (text).
Parameter funkcie je ako unsigned char ∗ dáta čo je pointer dátového typu unsigned char odkazujúci do pamäte procesora - na miesto v pamäti, na ktorého adrese sa nachádzajú dáta.
Byte reprezentuje 8 bitov, čo je 0-255. Pointer typu unsigned char odkazuje na adresu v pamäti, ktorá zaberá 8 bitov = 1 byte.
Zápis dát
Pri zápise dát aplikujeme postup, ktorý som ako ukážkový popísal v teórií >> Bitový Posun << .
Download source code
---------------------------------------------------------------------
Názov súboru: Diall_LCD.zip
Názov obshiahnutých súčastí: LCD_D.h, main.c
Autor: Diallix
Posledná revízia: 20.8. 2018
Jazyk: C
Licencia: freeware
---------------------------------------------------------------------
Ukážky
Užitočný Software: >> LCD Software <<