Ovládání grafických LCD modulů s řadičem KS0108 (S6B0108)
Tento řadič se používá např. u LCD s rozlišením 128x64 pixelů s označením ATM12864, PG12864, .... Mudul displeje obsahuje i teplotně kompenzovaný generátor záporného napětí, které je pro funkci LCD nezbytné. Nevýhodou je poměrně velký počet ovládacích vodičů a absence znakové sady - jedná se o čistě grafický LCD a znakovou sadu je nutné vytvořit externě. Sběrnice je paralelní 8-bitová, dále jsou nutné vývody E, RS, CS1 a CS2 a pro případné čtení obsahu LCD nebo busy příznaku ještě vývod RW. Posledním vývodem je RST, který není nutný. Zapojení vývodů modulu je uvedeno v tabulce. Číslování a význam vývodů
Číslo 1 bývá označeno na desce LCD modulu.
Komunikace s displejem
Celý displej je rozdělěn na 2 poloviny s rozlišením 64x64 pixelů. Každá z nich má
svůj vlastní řadič. Všechny vývody mimo CS1 a CS2 jsou spojeny paralelně. Pomocí vývodů CS1 a CS2
se volí práce buď s levým, pravým nebo oběma řadiči (aktivní v log.1). Displej komunikuje po
8-bitové paralelní sběrnici. Volba mezi zápisem a čtením se provádí pomocí vývodu RW a volba mezi
instrikcí a daty pomocí vývodu RS (stejně jako u řadiče HD44780). Záporným pulzem na vývodu RST
se LCD vypne a vynulují se interní registry. Obsah obrazové paměti se nezmění, takže po zapnutí LCD instrukcí
se objeví původní obraz. Tento vývod není nutný a stačí ho připojit na +5V. Instrukce displeje
Po instrukcích zápisu a čtení dat, se automaticky zvyšuje hodnota čítače adresy v X. Po posledním (63) sloupci se začíná opět zleva. Stránky se automaticky neinkrementují. Registr pro psuv prvního řádku lze využít pro vertikální posouvání obsahu LCD.
Ukázkový program
Na schématu je možný způsob připojení LCD k jednočipu 89C2051.
Trimr R4 nastavuje kontrast displeje, jinak asi není co dodat. Problém je, že LCD
zabírá skoro všechny vývody jednočipu, takže buď se musí použít typ s více porty nebo
různé posuvné registry pro "rozmnožení" výstupů. Poslední, a docela vhodná, možnost je
použít jeden samostatný jednočip pro řízení LCD a posílat do něj instrukce
nebo data asynchronním kanálem, což používám u své zatím jediné konstrukce s tímto LCD. Znaková sada v externí EEPROM
Jak jsem se již zmínil, řadič KS0108 nemá vlastní znakovou sadu, takže jsem
vytvořil vlastní. Velikost znaku je 5x7 pixelů. Znaková sada je poměrně velká, takže jsem ji
uložil do sériové EEPROM 24C16. Bez změny programu nelze použít menší ani větší paměť,
protože se liší způsobem adresování. Znakovou sadu do EEPROM naprogramuje
toto zapojení.
Zbytek paměti, což je nejméně 768 Bytu (od bytu 1280 výše), lze využít
pro jiné účely. Nevýhodou použité paměti je, že již nelze na stejnou sběrnici
připojit další paměť, ale pouze jiné obvody, které mají jinou adresu. Tento typ
EEPROM totiž využívá bity A0, A1 a A2, které normálně slouží k odlišení adresy až
osmi EEPROM, pro adresování paměti. Rutiny kreslení úseček
Nedávno proběhla na MCU serveru diskuze "Jak kreslit spojnice bodů", což mě inspirovalo k "vyextrahování" patřičných rutin ze svých starších pokusů a vytvoření tohoto ukázkového prográmku.
Zřejmě nejjednodušším řešením kreslení úseček je následující metoda:
Dejme tomu, že úsečka je definována body A a B. Porovnáme je podle X souřadnice a
případně prohodíme, aby A byl na X ose vždy vlevo od B. Tím pádem teď může úsečka od bodu A směřovat jen do
I. nebo IV. kvadrantu. Tyto dvě možnosti se liší pouze tím, že v I. kvadrantu Y poroste, zatímco ve
IV. bude klesat, jinak je vše stejné. Porovnáním Ay a By určíme kvadrant. Nyní porovnáme
délku úsečky v ose X a Y a vypočteme směrnici vztaženou k delší ose - tedy kratší/delší.
Výpočet je vhodné provádět v pevné řádové čárce (float je zde k ničemu a celou rutinu mnhonásobně zpomaluje).
Nyní nastavíme počáteční pozici úsečky - bod A a vykreslíme ho. Následně inkrementujeme/dekrementujeme (+1/-1)
delší osu a ke kratší přičítáme/odečítáme směrnici (+ pro I., - pro IV. kvadrant). Po každé
inkrementaci vykreslíme bod podle aktuálních X,Y souřadnic. Počet kroků je logicky dán
počtem bodů v delší ose. Na každou úsečku je tedy třeba jen jedno celočíselné,
neznamínkové dělení a pak jen přičítání/odečítání a sem tam nějaká rotace. Poslední aktualizace: 30.7.2006 |