Popis
Zobrazované znaky budeme do LCD displeje (resp. do jeho řadiče) přenášet přes datovou sběrnici paralelního portu. Řídící signály LCD displeje potřebné pro řízení komunikace s displejem připojíme k řídící sběrnici paralelního portu, konkrétně k signálům /Strobe a /Autofeed.
Pro jednoduchost bude LCD displej zapojen tak, že do něj bude možné pouze zapisovat. Nebudeme také využívat pokročilé vlastnosti displeje jako je možnost nahrát si vlastní znakovou sadu apod.
V následujícím textu si stručně uvedeme ty nejdůležitější informace o ovládání a komunikaci s LCD displejem. Zájemce o detailnější popis odkážu na stránky výrobcehttp://www.ges.cz/sheets/d/dem16217syhly.pdf a články na webu HW.czhttp://hw.cz/Teorie-a-praxe/Dokumentace/ART632-Inteligentni-displeje-a-jejich-pripojeni-k-PC.html a případně i osobní stránky jednoho radioamatérahttp://elektronika.kvalitne.cz/ATMEL/necoteorie/LCDmatice.html.
Ovládání LCD displeje
LCD displej, resp. jeho řadič HD44780 či kompatibilní obsahuje dvě interní paměti RAM. První z nich CGRAM je pamět znakového generátoru a slouží k dynamické změně sady znaků, které lze zobrazit na displeji. Toho se například využívá při zobrazování znaků specifických pro český jazyk.
Druhá paměť pro nás mnohem zajímavější je paměť DDRAM, což je v podstatě video paměť displeje. Každá adresa v této paměti odpovídá určité pozici na displeji. Zápisem kódu znaku do paměti DDRAM na danou adresu dojde k zobrazení znaku na displeji na příslušné pozici. Bohužel je paměť DDRAM organizována tak, že jednotlivé řádky na sebe nenavazují, tzn. že při posunu zobrazovaného textu musíme sami softwarově řešit korektní přechod znaků z konce prvního řádku na druhý. A to i přesto, že řadič displeje podporuje instrukci pro posun textu. Nepomůže nám ani automatický posun adresy DDRAM při zápisu znaku do DDRAM paměti. V tabulce 1.5 je seznam adres v DDRAM paměti a odpovídající pozice na LCD displeji. Adresy jsou uvedeny hexadicimálně.
Na obrázku 1.12 jsou uvedeny kódy znaků. Bity určující sloupec v mapě znaků tvoří vyšší půlbyte kódu znaku.
LCD displej se ovládá pomocí instrukcí přenášených po datové sběrnici. Samotné znaky k zobrazení se pak do paměti DDRAM přenesou v rámci režimu přenosu dat do interní RAM.
Seznam podporovaných instrukcí najdeme v tabulce 1.6. Některé z nich si zaslouží podrobnější komentář:
Instrukce Zapni/vypni displej/kurzor nevypíná vnitřní logiku displeje, ale pouze zobrazování znaků. Znaky uložené v paměti DDRAM tedy zůstanou zachovány.
Instrukce Nastav posun displeje/kurzoru umožňuje měnit pozici kurzoru nebo posouvat zobrazované znaky. Pozor na to, že řadič automaticky přesune znak z konce první řádky na druhou až když adresa znaku dosáhne hodnoty 0x3F (tato funkce je tedy pro víceřádkové displeje nepoužitelná - nutno řešit SW).
Instrukce Nastav vlastnosti displeje slouží pro nastavení typu komunikace a způsobu zobrazování. Je to první isntrukce posílaná do displeje při jeho inicializaci.
Instrukce Nastav adresu v paměti DDRAM umožňuje ovlivnit stav čítače adresy paměti DDRAM. Uvedená hodnota bude použita při následujícím přenosu dat z/do DDRAM paměti.
Instrukce Zapiš data do RAM, kdy je nastaven signál RS na log. 1, umožňuje přenést data do paměti CGRAM nebo DDRAM. Výběr paměti je proveden předchozí instrukcí Nastav adresu v paměti CGRAM/DDRAM, která nastavila do adresové čítače buď adresu CGRAM nebo adresu DDRAM. Po zápisu dat se automaticky sníží nebo zvýší o 1 stav adresového čítače dané paměti v závislosti na stavu bitu I/D (instrukce Nastav vstupní režim). Další znak tedy můžeme hned zapisovat aniž bychom předtím museli nastavit adresu. Pozor ovšem musíme dávat při přechodu mezi řádky, kdy musíme pro první znak na druhém řádku před jeho zápisem nastavit nejprve správnou adresu. Adresový čítač totiž sám tento přechod neprovede, ale jeho hodnota v případě displeje 2x16 by byla 0x10, tedy znak za posledním znakem prvního řádku.
Instrukce | Signály | Kód instrukce | Doba | ||||||||
RS | RW | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ||
Smaž displej | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1.53ms |
Nastav kurzor na začátek | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | x | 1.53ms |
Nastav vstupní režim | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | SH | 39us |
Zapni/vypni displej/kurzor | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B | 39us |
Nastav posun displeje/kurzoru | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | x | x | 39us |
Nastav vlastnosti displeje | 0 | 0 | 0 | 0 | 1 | DL | N | F | x | x | 39us |
Nastav adresu v CGRAM | 0 | 0 | 0 | 1 | A5 | A4 | A3 | A2 | A1 | A0 | 39us |
Nastav adresu v DDRAM | 0 | 0 | 1 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | 39us |
Vyčti příznak BUSY a adresu | 0 | 1 | BF | A6 | A5 | A4 | A3 | A2 | A1 | A0 | 0us |
Zapiš data do RAM | 1 | 0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 43us |
Vyčti data z RAM | 1 | 1 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 43us |
Bit | Význam hodnoty | |
I/D | 0 = pohyb kurzoru doleva | 1 = pohyb kurzoru doprava |
SH | 0 = posun displeje (znaků) vypnut | 1 = posun displeje (znaků) zapnut |
D | 0 = displej (zobrazení) vypnut | 0 = displej (zobrazení) zapnut |
C | 0 = zobrazení kurzoru vypnuto | 1 = zobrazení kurzoru zapnuto |
B | 0 = blikání kurzoru vypnuto | 1 = blikání kurzoru zapnuto |
S/C | 0 = posouvá se kurzor | 1 = posouvá se displej (znaky) |
R/L | 0 = posun kurzoru/displeje doleva | 1 = posun kurzoru/displeje doprava |
DL | 0 = 4bitová datová sběrnice | 1 = 4bitová datová sběrnice |
N | 0 = jednořádkový displej | 1 = dvouřádkový displej |
F | 0 = znak se skládá z 5x7 pixelů | 1 = znak se skládá z 5x10 pixelů |
BF | 0 = řadič displeje čeká na instrukce | 1 = řadič displeje provádí instrukci |
Jak už jsme naznačili v popisu schématu, při komunikaci s displejem budeme používat celou šířku datové sběrnice, tj. 8 bitů. Což je mimo jiné i vychozí nastavení displeje po zapnutí napájecího napětí. Protože máme vývod displeje R/W uzemněn, je možný pouze zápis do displeje. Proto při komunikaci s displejem nemůžeme použít dotazování se na připravenost displeje přijmout další instrukci (pomocí instrukce na vyčtení příznaku BUSY), ale musíme vždy počkat určitou minimální dobu, kterou trvá zpracování instrukce v displeji. Tyto doby jsou uvedeny v tabulce 1.6.
Průběh signálů při osmibitové komunikaci je zobrazen na obrázku 1.13. Z něj je patrné, že data musí být na sběrnici už stabilní před sestupnou hranou signálu E. Prakticky se to dělá tak, že nejprve umístíme na sběrnici data a pak vygenerujeme kladný impulz signálu E.
Incializace LCD displeje se provádí podle sekvence zobrazené na obrázku 1.14. Prodlevy mezi instrukcemi uvedené v inicializační sekvenci jsou skutečně ty nejmenší možné, které musíme dodržet,. Často bývá nutné je prodloužit, nastavit vlastnosti displeje několikrát apod., prostě inicializační sekvenci přizpůsobit konkrétnímu displeji a jeho zapojení.
Schéma
Na obrázku 1.15 je zobrazeno schéma zařízení LCD displej, v tabulce 1.7 pak nalezneme seznam potřebných součástek.
Schéma samotné nepotřebuje příliš komentářů. LCD displej je typu STN, 2x16 znaků. Jinými slovy je to standardní dvouřádkový displej s řadičem HD44780 nebo kompatibilním. Zatímco displej samotný je zobrazovacím prvkem, řadič displeje se stará jednak o komunikaci displeje s okolím a jednak o řízení procesu zobrazování. V následujícím textu budeme ovšem pod pojmem LCD displej myslet celek, tzn. displej a řadič dohromady.
Pomocí konektoru JP1 připojujeme k LCD displeji napájení a zem a uzemňujeme vývod R/W displeje, tzn. že displej bude trvale přepnutý do režimu zápisu. Dále přes něj připojujeme trimr R5, kterým se nastavuje řídící napětí pro jas displeje.
Konektor JP2 slouží k propojení vývodu RS displeje se signálem /Strobe paralelního portu. Vývod RS slouží k přepínání zápisu dat / instrukcí. Jinými slovy logická hodnota na tomto vývodu říká, zda data na sběrnici jsou znakem nebo instrukcí. Dále přes konektor JP2 propojujme vývod E se signálem /Autofeed paralelního portu. Vývod E je vstupem, kterým se aktivuje řadič, něco jako chip select. Tento vstup se používá při operacích čtení a zápisu dat. A konečně jsou přes konektor JP2 připojeny i vodiče datové displeje na datovou sběrnici paralelního portu. V našem případě budeme využívat celou šířku datové sběrnice, tedy všech 8bitů, byť displej umí komunikovat i přes 4bitovou sběrnici.