PICAXE a uživatelské znaky LCD displeje

Většina LCD displejů umožňuje uživateli zapsat do RAM nebo EEPROM řadiče displeje data a ty se pak zobrazují jako uživatelské (speciální, grafické) znaky. Bývá jich obvykle 8 nebo 16 a jejich adresy jsou namapovány do oblasti, kde má ASCII tabulka řídící symboly (obvykle adresy 0 -7 nebo 0 – 15). K čemu je to dobré a jak to využít ve spolupráci s PICAXE?

Jako příklad použijeme displej WD-C1602L-7GNNa s řadičem ST7066, ten má možnost uložit do paměti generátoru 8 uživatelských znaků s kódy 0 – 7. V našem případě jde o paměť RAM, takže po vypnutí napájení se vždy musí obsah do této paměti zavést znovu. U displejů s pamětí EEPROM stačí jednou znaky zavést a pak se mohou používat bez ohledu na vypínání napájení.

V jednom okamžiku nemůžeme na displeji zobrazit více než 8 (různých) uživatelských znaků, mikrokontroléru ale nic nebrání za chodu programu sadu uživatelských znaků změnit podle potřeby. To platí pro znaky v RAM, pokud jsou v EEPROM, jde to v principu udělat také, ale počet zápisů do EEPROM je mnohem menší než do RAM, takže když to bude mikrokontrolér dělat příliš často, může se vyčerpat životnost řadiče displeje a paměť EEPROM potom selže.

Pokud generátor znaků neobsahuje znaky s českou diakritikou, lze uživatelské znaky využít právě k jejich částečnému nahrazení (nevejdou se všechny potřebné). Použijeme jiný příklad, připravíme si speciální symboly vyjadřující stav nabití baterie:

LCD_z

Návrh symbolů pro znázornění stavu baterie

Jednotlivé symboly jsou uloženy od adresy uvedené pod obrázkem na druhém řádku, ukládají se po bytech shora dolů, nejnižší bit je vpravo (tři nejvyšší bity z každého bytu se nezobrazují). Je uveden pouze hlavní program, pod čarou pak podprogramy pro obsluhu displeje se čtyřmi datovými vodiči jak ukazuje schéma.

Program vypíše zleva do prvního řádku všechny zadané uživatelské znaky a pak na posledním znaku prvního řádku cyklicky zobrazuje animaci složenou z těchto znaků.

REM LCD displej 2x16 přes posuvný registr - PICAXE 20X2
REM ukládání uživatelských znaků a jejich použití - symbol baterie
data 0, (%01110,%11011,%10001,%10001,%10001,%10001,%10001,%11111);prázdná
data 8, (%01110,%11011,%10001,%10001,%10001,%10001,%11111,%11111);
data 16,(%01110,%11011,%10001,%10001,%10001,%11111,%11111,%11111);
data 24,(%01110,%11011,%10001,%10001,%11111,%11111,%11111,%11111);
data 32,(%01110,%11011,%10001,%11111,%11111,%11111,%11111,%11111);
data 40,(%01110,%11011,%11111,%11111,%11111,%11111,%11111,%11111);
data 48,(%01110,%11111,%11111,%11111,%11111,%11111,%11111,%11111);plná
gosub inicializace                 ;inicializace LCD
b0=%01000000                       ;nastavit adresu 0 paměti uživatelských znaků
gosub zapis_povelu
for b1=0 to 55                     ;zápis sedmi uživatelských znaků
 read b1,b0 gosub zapis_znaku next b1
b0=1 gosub zapis_povelu            ;smazání displeje, nastavení na začátek 1. ř.
pause 100
for b1=0 to 6                      ;výpis sedmi uživatelských znaků
 b0=b1 gosub zapis_znaku next b1
cyklus:                            ;animace nabíjení baterie
 for b1=0 to 6
 let b0=143 gosub zapis_povelu     ;poloha znaku
 let b0=b1 gosub zapis_znaku       ;výběr znaku
 pause 500
 next b1
 goto cyklus
end                                ;konec ukázky

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
LCD_4