Graficke displeje
http://www.ebastlirna.cz/modules.php?name=Forums&file=viewtopic&t=41183
http://elektronika.kvalitne.cz/ATMEL/necoteorie/LCDmatKS0108.html
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 |