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. 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.
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. 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.
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é.
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ákUká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ákSoubor 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. Poslední aktualizace: 11.3.2007 |