I když LCD a OLED znakové displeje pracují na zcela jiném principu, jejich připojení i řízení je zpravidla totožné. Podívejme se na to, jak se tyto displeje řídí pomocí PICAXE.
Mikrokontrolérem neovládáme jednotlivé segmenty, displej má vlastní řadič a z hlediska ovládání se chová jako statický. Jednotlivé znaky jsou obvykle v rastru 5×8 bodů. Displeje se vyrábí v různém uspořádání, časté jsou 8×2, 16×1, 16×2, 16×4, 20×2, 20×4, 24×2, 24×4, 40×2 nebo 40×4 znaky. Generátor znaků je součástí displeje, příklad popisu znaků z generátoru je na následujícím obrázku.
Obvykle můžeme počítat s tím, že najdeme „na svém místě“ znakovou sadu v rozsahu znaků $20 (mezera) přes znaménka, číslice, velká písmena a malá písmena základní (anglické) abecedy. Znaky s kódy od $A0 výš se mohou lišit s ohledem na lokalizaci nebo speciální určení, takže se můžeme setkat se středoevropskou sadou (v níž jsou i naše znaky s diakritikou), s azbukou, čínskými nebo japonskými znaky, s inverzně zobrazenou základní sadou a podobně. Totéž se týká znaků $10 a $1F.
Jsou-li potřeba jiné než základní znaky, je třeba si předem z katalogových listů zjistit, jakou znakouvou sadu daný displej má. Bývá zvykem, že displej dovoluje uživateli prvních 8 nebo 16 znaků zapsat zvenčí a následně používat podobně jako ostatní znaky, tím je možné v omezené míře doplnit možnosti displeje o lokální znaky nebo semigrafiku, případně vytvořit i větší téměř grafické symboly (při zobrazení jsou vidět tenké dělicí linie mezi znaky). Zapojení i obsluha displeje se standardizovala a až na výjimky je stejná bez ohledu na výrobce.
Zapojení a obsluha osmibitové komunikace
Schéma ukazuje minimální zapojení při osmibitové komunikaci. Je využito všech 8 datových pinů displeje. Řídící signál E svou sestupnou hranou říká řadiči, že data jsou platná a mají se převzít. Řídící signál RS určuje, jestli se přijatá data budou interpretovat jako povel pro řízení displeje (RS=0) nebo jako data k zobrazení (RS=1). Řídící signál R/W určuje, zda se budou data do řadiče zapisovat (R/W=0) nebo se budou z něj číst (R/W=1). Pro základní funkci není čtení nutné. Vstup napětí Trim slouží k tomu, abychom nastavili správný kontrast displeje, je možné omezit rozsah napětí asi na 0 – 1,5 V. Při výrazně nevhodném nastavení zůstane diplej celý neaktivní nebo naopak všechny znaky zčernají (nastavuje se zkusmo).
Každý displej se musí po zapnutí napájení inicializovat, musí se mu určit, jestli bude pracovat v osmibitové nebo čtyřbitové komunikaci, kolik řádků má, jestli má být viditelný kurzor, zda a kam se má posunovat po zápisu znaku, zda má blikat. Musí se vymazat obsah displeje a zapnout zobrazení, jinak může displej provádět všechny příkazy správně ve své paměti, ale není nic vidět.
Následující příklad programu ukazuje obsluhu LCD displeje 16×2 znaky. Nejprve se zobrazí text „Test LCD 16×2“, tak text odroluje směrem vlevo a opět zprava přiroluje, a pak se v dalším řádku postupně zobrazí čísla od 0 do 99.
REM LCD displej 2x16 s 8 datovými vodiči - PICAXE 20X2 REM výpis "Test LCD 16x2",odrolování a počítání na 2. řádku data 0 ,("Test LCD 16x2 ") ;uložení textu do EEPROM let dirsB=%11111111 ;nastavení portu B pro pins gosub inicializace ;inicializace LCD for b1=0 to 15 ;výpis textu read b1,b0 ;znak po znaku z EEPROM gosub zapis_znaku next b1 pause 3000 ;prodleva na čtení b0=24 ;povel k rolování vlevo for b1=1 to 40 ;provést 40x (dojede zpět) gosub zapis_povelu pause 200 ;zpomalení rolování next b1 for b3=0 to 99 ;výpis čísel od 0 do 99 (z proměnné) b0=192+15 ;přechod na konec 2. řádku gosub zapis_povelu b0=4 ;nastavit psaní zprava doleva gosub zapis_povelu b0=b3//10+48 ;převod jednotek na znak a výpis gosub zapis_znaku b0=b3/10+48 ;převod desítek na znak a výpis gosub zapis_znaku b0=6 ;nastavit psaní zleva doprava gosub zapis_povelu pause 500 ;zpomalení počítání next b3 end ;konec ukázky inicializace: pause 100 b0=%00110000 ;8 bit režim gosub zapis_povelu ;zápis 1 pause 5 ;nutná prodleva gosub zapis_povelu ;zápis 2 gosub zapis_povelu ;zápis 3 b0=%00111000 ;2 řádky, znaky 5x8 gosub zapis_povelu b0=%00000001 ;smazání displeje gosub zapis_povelu b0=%00001100 ;zapnutí LCD, kurzor ne, neblikat gosub zapis_povelu return zapis_znaku: ;zápis znaku z b0 high c.0 ;přenos znaku (nastavení RS) let pinsB=b0 ;nastavení dat pulsout c.1,1 ;zápis return zapis_povelu: ;zápis povelu z b0 low c.0 ;přenos povelu (nastavení RS) let pinsB=b0 ;nastavení dat pulsout c.1,1 ;zápis return
Podprogramy inicializace, zapis_znaku a zapis_povelu jsou v podstatě univerzální pro osmibitovou komunikaci a dané zapojení. V inicializace je nutné zachovat určité prodlevy mezi povely (viz dokumentace k danému řadiči). Program je napsán pro základní hodinový kmitočet mikrokontroléru 4 MHz, v případě zvýšení kmitočtu se musí prodlevy zachovat! Přehled používaných povelů s kódy v desítkové soustavě je uveden v následující tabulce.
kód
|
význam
|
1
|
Vymaže displej a nastaví kurzor a "okno" na začátek první řádky
|
2
|
Přesune kurzor i "okno" displeje na začátek první řádky
|
4
|
Nastaví režim psaní zprava doleva
|
5
|
Nastaví rolování displeje vlevo
|
6
|
Nastaví režim psaní zleva doprava
|
7
|
Nastaví rolování displeje vpravo
|
10
|
Vypne zobrazení displeje (nezobrazuje se, ale displej pracuje dál)
|
12
|
Skryje kurzor
|
13
|
Rozbliká kurzor
|
14
|
Zapne zobrazení displeje a zapne viditelnost kurzoru
|
16
|
Pohyb kurzoru o jednu pozici vlevo
|
20
|
Pohyb kurzoru o jednu pozici vpravo
|
24
|
Odroluje "okno" displeje o jednu pozici vlevo (všechny řádky)
|
28
|
Odroluje "okno" displeje o jednu pozici vpravo (všechny řádky)
|
64 + n
|
Nastaví adresu pro zadávání uživatelského znaku na n (0<n<63)
|
128 + n
|
Přesune kurzor na pozici n prvního řádku (0<n<39)
|
192 + n
|
Přesune kurzor na pozici n druhého řádku (0<n<39)
|
Zapojení a obsluha čtyřbitové komunikace
Aby se ušetřily piny mikrokontroléru, lze k přenosu dat použít jen čtyři vodiče a každý byte přenášet rozdělený na dvě poloviny, nejprve bity 4 – 7, potom bity 0 – 3. Komunikace s displejem je samozřejmě 2x pomalejší a obslužný program mírně složitější, nicméně čtyřbitová komunikace se v praxi používá asi častěji než osmibitová, protože zapojení je jednodušší a úspora pinů významnější. Nepoužité datové piny displeje se většinou musí uzemnit.
Ukázková úloha zůstane stejná, hlavní program také může zůstat prakticky beze změny, jedinou úpravou je využití jen 4 pinů (0 až 3) pro paralelní přenos dat (dirsB=%00001111). Mírně se změní inicializace (nastavení čtyřbitové komunikace), rozšířené musí být podprogramy pro zápis znaku a zápis povelu. Fragment programu je zde:
inicializace: low c.0 ;zápis povelu let pinsB=%0011 ;8 bit režim jako základní pulsout c.1,1 ;zápis 1 pause 5 ;nutná prodleva pulsout c.1,1 ;zápis 2 pulsout c.1,1 ;zápis 3 let pinsB=%0010 ;4 bit režim nastavit pulsout c.1,1 ;nastaveno, lze používat podprogramy b0=%00101000 ;2 řádky, font 5x8 gosub zapis_povelu b0=%00000001 ;smazání displeje gosub zapis_povelu b0=%00001100 ;zapnutí displeje, kurzor ne, neblikat gosub zapis_povelu return zapis_znaku: ;zápis znaku z b0 high c.0 ;bude přenos znaku let pinsB=b0/16 ;nastavení horní poloviny bytu pulsout c.1,1 ;zápis horní poloviny bytu let pinsB=b0 and 15 ;nastavení dolní poloviny bytu pulsout c.1,1 ;zápis return zapis_povelu: ;zápis povelu z b0 low c.0 ;bude přenos povelu let pinsB=b0/16 ;nastavení horní poloviny bytu pulsout c.1,1 ;zápis horní poloviny bytu let pinsB=b0 and 15 ;nastavení dolní poloviny bytu pulsout c.1,1 ;zápis return
Zapojení a obsluha přes posuvný registr
V případě osmibitové komunikace potřebujeme 10 pinů mikrokontroléru, při čtyřbitovou 6. Počet pinů můžeme za cenu zpomalení dále snížit podobným trikem jako při řízení LED displeje použitím posuvného registru, na který můžeme připojit jak data, tak signál RS. Vystačili bychom se 3 piny obsluhovanými programem. Přidáme-li jednoduchý monostabilní obvod generující signál zápisu (E) po naplnění posuvného registru, pak stačí dokonce 2 piny. Příklad bude opět stejný, změní se jen podprogramy pro výstup znaku a výstup povelu, mírně inicializace. V základním programu je jen jedna změna, vypuštěné nastavení pro paralelní operace s daty, už nebudou potřeba.
Signál E se odvozuje od série šesti kladných pulzů signálu clk pro posuvný registr, tranzistor už během jediného pulzu vybije kondenzátor, ten se po posledním pulzu série začne opět nabíjet. Obvod 555 je použit netradičně jako komparátor s hysterezí, na jeho výstupu je kladný pulz, jehož sestupná hrana (ta zapisuje data do řediče displeje) přijde asi 5 ms po posledním pulzu série. Dále jsou uvedeny pouze odlišné podprogramy.
inicializace: b5=%00011 ;povel - 8 bit režim jako základní gosub serie ;zápis 1 gosub serie ;zápis 2 gosub serie ;zápis 3 b5=%00010 ;povel - 4 bit režim nastavit gosub serie b0=%00101000 ;2 řádky, font 5x8 gosub zapis_povelu b0=%00000001 ;smazání displeje gosub zapis_povelu b0=%00001100 ;zapnutí displeje, kurzor ne, neblikat gosub zapis_povelu return zapis_znaku: ;zápis znaku z b0 b5=b0/16+16 ;nastavení horní poloviny bytu dat gosub serie b5=b0 and %00001111 +16 ;nastavení dolní poloviny bytu dat gosub serie return zapis_povelu: ;zápis povelu z b0 b5=b0/16 ;nastavení horní poloviny bytu povelu gosub serie b5=b0 and %00001111 ;nastavení dolní poloviny bytu povelu gosub serie return serie: ;vyšle 6 pulzů do 4094 podle b5 pulsout b.1,4 ;pulz pro nahození klopného obvodu b6=b5 and %10000 ;maska pro RS if b6<>0 then high b.0 else low b.0 endif ;nastavení RS pulsout b.1,4 ;vyšle RS b6=b5 and %01000 ;maska pro nejvyšší bit if b6<>0 then high b.0 else low b.0 endif ;nastavení D7 pulsout b.1,4 ;vyšle D7 b6=b5 and %00100 ;maska pro další bit if b6<>0 then high b.0 else low b.0 endif ;nastavení D6 pulsout b.1,4 ;vyšle D6 b6=b5 and %00010 ;maska pro další bit if b6<>0 then high b.0 else low b.0 endif ;nastavení D5 pulsout b.1,4 ;vyšle D5 b6=b5 and %00001 ;maska pro nejnižší bit if b6<>0 then high b.0 else low b.0 endif ;nastavení D4 pulsout b.1,4 ;vyšle D4 pause 10 ;10 ms prodleva na HW generování E return
Snímek na černé stopě nahoře ukazuje sérii šesti hodinových pulzů pro posuvný registr (clk) a z toho odvozený signál na vstupu obvodu 555 (dole modrá stopa) a signál zápisu do řadiče (E) dole na červené stopě.