PICAXE a obsluha standardního LCD nebo OLED displeje

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.

rom_a00Obvykle 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).

LCD_8

Zapojení LCD displeje s osmi datovými vodiči

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.

LCD_4

Zapojení displeje se čtyřmi datovými vodiči

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.

LCD_p

Zapojení LCD displeje přes posuvný registr

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

new_hantek410_2

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ě.