Ovládání znakových LCD s řadičem HD44780

   S řadičem HD44780 pracuje naprostá většina znakových displejů. Vyrábějí se provedeních od 1x8 znaků do 4x40 znaků. K propojení s jednočipem je třeba 4 nebo 8 datových vodičů, jeden na přepínání zápisu instrukcí / dat (RS) a další s hodinovým signálem (E). Pro případné čtění obsahu displeje je třeba připojit ještě jeden (R/W), jinak je trvale uzemněn. Základní znakovou sadu lze doplnit osmi vlastními znaky, které jsou pak dostupné pod kódy 0-7 a 8-15.
   Displeje se 4x40 znaky se od ostaních trochu liší. HD44780 má totiž DDRAM (RAM, ve které je uložen obsah displeje) jen na 80 znaků, což stačí jen na 2x40 nebo 4x20 znaků. Tyto displeje proto mají 2 řadiče a mimo vývody E mají všechny ostatní vývody spojeny paralelně. Vývody E jsou pak označeny E1 a E2 a každý z nich ovládá polovinu displeje.

Obvyklé číslování a význam vývodů

   Takto je zapojena většina displejů, ale rozhodně není na škodu stáhnout katalogový list konkrétního typu a ověřit si to. Vývody 15 a 16 jsou jen u typů s podsvětlením. Některé typy s podsvětlením mají jeho napájení mimo hlavní konektor. Dále je třeba dát pozor na interní propojení napájení podsvětlení a vlastního LCD. K tomuto účelu jsou na displejích plošky určené k zakápnutí cínem.

Vývod Název Funkce
1 Vss GND
2 Vcc napájení +5V
3 Vee, V0 nastavení kontrastu
4 RS volba mezi 0 - instrukce, 1 - data
5 R/W volba mezi 0 - zápis, 1 - čtení
6 E hodinový vstup
7 DB0 data 0
8 DB1 data 1
9 DB2 data 2
10 DB3 data 3
11 DB4 data 4
12 DB5 data 5
13 DB6 data 6
14 DB7 data 7
15 LED+ anoda podsvětlení
16 LED- katoda podsvětlení

Komunikace 8-bitovou sběrnicí

   Při tomto druhu komunikace je využito všech 8 datových vodičů. Z grafů v katalogovém listu není zrovna patrné, kdy vlastně dojde k převzetí dat za sběrnce, ale osvědčil se mi kladný impulz na E, když jsou data na DB0 až DB7 stabilní (v uvedeném grafu to jednou vypadá, že data se čtou při sestupné, uprostřed grafu dokonce do platných dat nezasahuje ani jedna hrana a na konci s přivřeným okem zase sestupná ... asi nějaká staší verze :-).

Komunikace 4-bitovou sběrnicí

   Při tomto druhu komunikace jsou využity jen 4 datové vodiče DB4-DB7 a zbytek je uzemněn. Graf toho opět moc neřekne, ale průběhy mají být stejné jako při 8-bit komunikaci. Data nebo instrukce jsou vyslány vždy nadvakrát. Nejprve se na DB4-DB7 pošle horní polovina bytu, vygeneruje se kladný pulz na E, na sběrnici se pošle spodní polovina bytu a generuje se druhý pulz na E.
   Vyjímku tvoří první instrukce, která inicializuje displej jako 4-bitový. Zde se pošle jen horní polovina inicializačního bytu a jen jeden pulz na E. Celý byte se pak vyšle znovu, ale už 4-bit způsobem, aby se nastavily i spodní 4 bity slova (počet řádků a font).

Znaková sada

   Řadič HD44780 má několik variant. Nejběžnejší (jiný jsem vlastně ani nikdy neviděl) je typ HD44780A00. Ten obsahuje mimo základní anglickou sadu některé řecké, německé, japonské a kdo ví jaké další znaky. Základní znaky odpovídají ASCII kódování a jednotlivé kódy jsou v tabulce. Dále existuje verze A02 s více evropskými znaky a verze Bxx s patrně zákaznickou sadou.


Instrukce

   Jednotlivé instrukce a délky vykonávání jsou uvedeny v tabulce. Jediné z instrukcí, které ještě potřebují rozvést jsou přepínání zápisu do DDRAM nebo CGRAM. Nejenže se přepne na zápis do DDRAM, ale také se příštím zápisem dat data uloží na zvolenou 7-bitovou adresu, takže třeba pomocí tohoto příkazu lze nastavovat pozici kurzoru na LCD. Každé adrese odpovídá jedna pozice na displeji a rozložení záleží na inicializaci. U jednořádkových displejů odpovídá prvnímu znaku zleva adresa 00h. U dvouřádkových také a druhý řádek začína na adrese 40h. U čtyřřádkových displejů začíná třetí řádek na adrese 14h a čtvrtý na 54h.
   Přepnutí zápisu do CGRAM má stejně jako do DDRAM také adresu a právě na tu se budou zapisovat data při vytváření vlastních znaků (viz. níže).

Význam instrukce RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Délka
smaže disp. a nastaví kurzor na začátek 0 0 0 0 0 0 0 0 0 1 1,64 ms
nastaví kurzor na začátek 0 0 0 0 0 0 0 0 1 x 1,64 ms
smer posuvu kurzoru I/D (0=vlevo, 1=vpravo), posuv textu S (0=ne, 1=ano) 0 0 0 0 0 0 0 1 I/D S 40 us
D - zapne displej, C - zapne kurzor,
B - zapne blikání kurzoru
0 0 0 0 0 0 1 D C B 40 us
1x posune (S/C=0 kurzor, S/C=1 text) smerem (R/L=0 vlevo, R/L=1 vpravo) 0 0 0 0 0 1 S/C R/L x x 40 us
inicializace:
DL=0 4-bit, DL=1 8-bit mód
N=0 jednořádkový, N=1 dvouřádkový disp.
F=0 font 5x8, F=1 font 5x10
0 0 0 0 1 DL N F x x 40 us
přepnutí na zápis do CGRAM 0 0 0 1 adresa v CGRAM 40 us
přepnutí na zápis do DDRAM 0 0 1 adresa v DDRAM 40 us
čtení příznaku BF (BF=0 příjem povolen, BF=1 řadič zaneprázdněn),
čtení adresy v DDRAM
0 1 BF adresa v DDRAM 0 us
zápis dat do CGRAM nebo DDRAM 1 0 data 40 us
čtení dat z CGRAM nebo DDRAM 1 1 data 40 us

Vytváření vlastních znaků

   Uživatel si může vytvořit až 8 vlastních znaků. Dají se pak vyvolat stejně jako ostatní znaky ze znakové sady a jsou dostupné pod kódy 0 až 7 a znovu pod kódy 8 až 15. Pokud počet nestačí, lze je klidně překreslovat přímo při výpisu textu, ale je to časově náročné.

Kód znaku Adresa v CGRAM Data
kód znaku řádek znaku 7 6 5 4 3 2 1 0
0, 8 0 0 0 0 0 0 x x x 0 1 0 1 0
0 0 1 0 0 1 0 0
0 1 0 0 1 1 1 0
0 1 1 1 0 0 0 1
1 0 0 1 1 1 1 1
1 0 1 1 0 0 0 0
1 1 0 0 1 1 1 0
1 1 1 0 0 0 0 0
1, 9 0 0 1 0 0 0 x x x 0 0 0 1 0
0 0 1 0 0 1 0 0
0 1 0 0 1 1 1 0
0 1 1 0 0 0 0 1
1 0 0 0 1 1 1 1
1 0 1 1 0 0 0 1
1 1 0 0 1 1 1 1
1 1 1 0 0 0 0 0

   Tabulka ukazuje postup zapisování znaků "ě" a "á". Levý sloupec udává, pod kterými kódy bude znak dostupný. Adresa v CGRAM je dělená na dvě trojice bitů. Horní 3 udávají kód znaku (0-7 resp. 8-15), spodní 3 udávají řádek znaku. Následuje 8 datových bitů pro každý řádek, přičemž nejvyšší 3 mohou být libovolné. Každý znak se skládá jen ze sedmi řádků a poslední je vyhrazen pro kurzor. Zápis se provádí následovně: Nejprve se vyšle instrukce pro přepnutí na zápis do CGRAM s adresou zápisu a následně se pošlou data pro příslušný řádek tabulky. Znovu se pošle instrukce pro zápis do CGRAM, ale tentokrát s adresou pro druhý řádek znaku a následně data pro druhý řádek znaku. Podrobněji v ukázkovém programu.

Ukázkový program pro 8-bitovou komunikaci a vytváření vlastních znaků pro C51

   Tento jednoduchý prográmek vypíše na LCD nejprve text bez vlastních znaků a pak text s vlastními znaky (háčky, čárky). Program je stavěný pro 12MHz krystal a displej minimálně 1x16 znaků. Vývod R/W je trvale uzemněný - čtení se neprovádí. Trimrem R5 se nastavuje kontrast displeje.

Zdroják


Ukázkový program pro 4-bitovou komunikaci s C51

   Tento prográmek je pro 4-bitovou komunikaci. Vypíše 2 texty a následně spustí běžící text. Program je stavěný pro 12MHz krystal a displej 1x16 znaků. Vývod R/W je trvale uzemněný - čtení se neprovádí. Trimr R5 nastavuje kontrast displeje.

Zdroják


Soubor rutin pro 4-bit kominikaci pro AVR

   Po delší době experimentování s AVR jsem se rozhodl zkulturnit pár rutinek pro AVR. LCD je zde připojen ve 4-bitovém módu, "busy" příznak je ignorován a namísto něj se generuje konstantní zpoždění 40us nebo 1.64ms pro mazání LCD. Zpoždění je vypočteno ze zadaného kmitočtu krystalu "XTAL", takže nezapomenout nastavit! Jsou zde obsaženy jak základní rutiny pro odesílání dat/istrukcí tak rozšířené rutiny pro výpis stringů z FLASH, stringů z RAM a BCD čísel s potlačením počátečních nul (buďto se nevypisují nebo se nahrazují mezerami).


   Častým problémem nejen na AVR bývá komplikovaná inicializace do 4-bit módu. Po prvním zapnutí napájení je totiž LCD nastaven na 8-bit komunikační mód. První instrukcí (ješte v 8-bit módu) dojde k přepnutí na 4-bit verzi. Vzhledem k tomu, že DB0-DB3 jsou na GND, tak LCD obdrží jen horní část init. bytu, dolní 4 bity jsou 0b0000. Následně, pokud potřebujeme nastavit i spodní čtveřici bitů inicializace, musíme celou inicializaci zopakovat tentokrát již ve 4-bit módu. Od teď už lze komuninovat jen ve 4-bit módu. Ovšem co se stane při ISP programování, kdy se celý MCU resetuje, zatímco LCD zůstává stále v 4-bit módu? MCU se bude pokoušet zapsat první inicializaci v 8-bit módu (je jeden tik na E) a tím dojde ke ztrátě synchronizace. Proto se buďto musí vždy po programování nebo resetu MCU odpojit a připojit napájení nebo provést komplikovanější inicializaci. To jest před celou init. sekvencí nejprve poslat instrukci pro inicializaci do 8-bit módu (DB4-DB7 = 0b0010), ale jakoby 4-bitovou komunikací! Pokud byl LCD předtím v 4-bit módu, korektně se přepne do defaultního 8-bit módu a pokud šlo o první zapnutí, tak první E pulz (data bity 4-7) neprovede nic (LCD už je v 8-bit módu) a druhý pulz bude LCD chápát jako další intrukci. Ještě před druhým pulzem se však musí datové linky DB4-DB7 nastavit na kombinaci 0b0000 a navíc generovat 40us zpoždění (vykonání první instrukce). Vzhledem k tomu, že ostatní data piny jsou rovněz na log.0, obdrží LCD instrukcí 0b00000000 a bude ji ignorovat. Po dalších 1.64ms pak lze provést vlastní inicializaci jak už jsem ji popsal. Zní to sice drobek složitě, ale snažší způsob mě nenapadl.
Zdrojáky ke ztažení.


Poslední aktualizace: 11.3.2007