PICAXE a maticové LED displeje

Maticové LED znakovky, i když mají jen malé rozlišení, se používají hlavě proto, že s nimi lze dosáhnout efektního vzhledu a zobrazení jednoduché grafiky, jsou relativně velké a čitelné z větší vzdálenosti, v šeru aktivním svitem poutají pozornost.

Jako příklad zapojení maticové LED 8×8 bodů použijeme typ BL-M07C881UR-11. LED tvořící řádku jsou připojeny na port B mikrokontroléru PICAXE 20X2, jednotlivé řádky jsou aktivovány posuvným registrem 4094, který současně zajistí omezení proudu pro LED. Toto zapojení se hodí k vyzkoušení funkce a programu, nicméně vede k viditelným rozdílům jasu LED v řádku podle toho, kolik LED v něm svítí. Pro odstranění tohoto jev by bylo třeba posílit výstupy posuvného registru dostatečně dimenzovanými tranzistory a do ovládání sloupců vložit omezení proudu rezistory. Nám ale nyní jde především o způsob obsluhy programem, takže zvolíme zapojení co nejjednodušší.

LED9

Zapojení maticového displeje 8×8

maticovka

Vnitřní zapojení jedné maticové znakovky

První pogram slouží pouze k rozsvícení obrazce podle nákresu ve schématu. Při reálném použití budou pravděpodobně data připravená programem nebo uložená v datové části EEPROM.

REM LED maticový displej BL-M07C881UR-11 - PICAXE 20X2
REM zobrazení čtverců
setfreq m32
let dirsB=%11111111             ;nastavení portu B pro pins
do                              ;smyčka zobrazení
  low c.0                       ;nastavit bit pro posuvný registr
  for b0=1 to 8                 ;cyklus pro 8 řádků
    select b0                   ;tabulka grafiky po řádcích
    case 1 b2=%11111111
    case 2 b2=%10011001
    case 3 b2=%10100101
    case 4 b2=%11000011
    case 5 b2=%11000011
    case 6 b2=%10100101
    case 7 b2=%10011001
    case 8 b2=%11111111
    endselect
  let pinsB=0              ;zhasnutí řádku
  pulsout c.1,1             ;posunutí na další řádek
  let pinsB=b2                  ;zobrazení řádku z tabulky
  high c.0                      ;bit pro posuvný registr
  pause 10                      ;doba svícení
  next b0                       ;konec cyklu osmi rádků
loop

Stejnou maticovou LED použila firma Adafruit v modulu, ten navíc obsahuje řadič Holtek HT16K33 se sériovým vstupem I2C, který lze velmi jednoduše obsloužit příkazy PICAXE. Modul může mít na I2C sběrnici jednu ze čtyř adres E0, E2, E4, E6. Adresa se volí pajecími propojkami na plošném spoji, z výroby je nastavena adresa E0. Po adrese následuje jeden příkazový byte a případně další jeden až šestnáct byte dat. Příkazy pro nastavení a ovládáni displeje:

$20 – vypnutí systémového oscilátoru (stand by)
$21 – zapnutí systémového oscilátoru
$80 – vypnutí displeje
$81 – zapnutí displeje, bez blikání
$83 – zapnutí displeje, blikání rychlostí 2Hz
$85 – zapnutí displeje, blikání rychlostí 1Hz
$87 – zapnutí displeje, blikání rychlostí 0,5Hz
$E0 až $EF – řízení jasu pomocí PWM s činitelem plnění 1/16 až 16/16
00 až 0F – nastavení adresy pro zápis následujících dat

Poslední příkaz slouží k naplnění paměti zobrazovanými daty, po zápisu je adresa automaticky inkrementována (zvětšena o jednu), takže zápis celé matice lze provést najednou. Displej 8×8 využívá pouze sudé adresy, na lichou adresu můžeme zapsat jakákoliv data, nejsou zobrazena. Pořadí jednotlivých bitů je poněkud zpřeházené – zleva jsou zobrazeny bity 7, 0, 1, 2, 3, 4, 5, 6 – což poněkud komplikuje ovládání.

ada8x8mini

Pořadí bitů v modulu

LED10

Schéma zapojenís PICAXE 08M2

Příklad zobrazuje na displeji střídavě kolečko a čtvereček, oba znaky se plynule rozsvěcí i zhášejí.

REM LED maticový displej Adafruit - PICAXE 08M2
REM zobrazení čtverců
data 00,(%10000001)         ;data pro křížek
data 01,(%01000010)
data 02,(%00100100)
data 03,(%00011000)
data 04,(%00011000)
data 05,(%00100100)
data 06,(%01000010)
data 07,(%10000001)
data 08,(%00011000)         ;data pro kolečko
data 09,(%00100100)
data 10,(%01000010)
data 11,(%10000001)
data 12,(%10000001)
data 13,(%01000010)
data 14,(%00100100)
data 15,(%00011000)
hi2csetup i2cmaster,$e0,i2cfast,i2cbyte  ;inicializace I2C
hi2cout (%00100001)                      ;oscilátor displeje zapnut
hi2cout (%10000001)                      ;zapnutí displeje bez blikání
gosub prevod                             ;převod dat na přehozené bity
do                                       ;začátek cyklu programu
  read 0,b20,b21,b22,b23,b24,b25,b26,b27                  ;načtení a přenos křížku
  hi2cout 0,(b20,0,b21,0,b22,0,b23,0,b24,0,b25,0,b26,0,b27)
  gosub rozsvit pause 500 gosub zhasni pause 500          ;rozsvítit/zhasnout
  read 8,b20,b21,b22,b23,b24,b25,b26,b27                  ;načtení a přenos kolečka
  hi2cout 0,(b20,0,b21,0,b22,0,b23,0,b24,0,b25,0,b26,0,b27)
  gosub rozsvit pause 500 gosub zhasni pause 500          ;rozsvítit/zhasnout
  loop                                                    ;konec cyklu programu
rozsvit:                                 ;pomocí PWM postupně rozsvítí displej v 16 krocích
  hi2cout ($81) for b0=0 to 15 b1=b0+$E0 hi2cout (b1) pause 50 next b0 return
zhasni:                                  ;pomocí PWM postupně zhasne displej v 16 krocích
  for b0=0 to 15 b1=$EF-b0 hi2cout (b1) pause 50 next b0 hi2cout ($80) return
prevod:                                  ;konverze dat v paměti na přehozené bity
  read 255,b2                            ;načtení příznaku, jestli už konverze proběhla
  if b2<>127 then                        ;při prvním spuštění konvertuj
    for b0=0 to 15                       ;pro 16 bytu (není nutné přepisovat celou EEPROM
      b4=0                               ;vynulování pracovní proměnné
      read b0,b1                         ;načti byte
      b3=b1 and %10000000
      if b3>0 then let b4= %10000000 endif
      b3=b1 and %01000000
      if b3>0 then let b4=b4+%00000001 endif
      b3=b1 and %00100000
      if b3>0 then let b4=b4+%00000010 endif
      b3=b1 and %00010000
      if b3>0 then let b4=b4+%00000100 endif
      b3=b1 and %00001000
      if b3>0 then let b4=b4+%00001000 endif
      b3=b1 and %00000100
      if b3>0 then let b4=b4+%00010000 endif
      b3=b1 and %00000010
      if b3>0 then let b4=b4+%00100000 endif
      b3=b1 and %00000001
      if b3>0 then let b4=b4+%01000000 endif
      write b0,b4                       ;zapiš konvertovaná data zpět
      next b0
    write 255,127                       ;po dokončení zapiš příznak, že konverze proběhla
    endif
  return

V programu, který se může zdát zbytečně dlouhý na provedení plánované činnosti, je třeba všimnout si několika důležitých věcí:

Ukládání dat do EEPROM pomocí příkazů „data“ na začátku není součástí běhu programu, ale direktivou pro PC, data se uloží při programování. Zbytek datové oblasti EEPROM je vyplněn nulami.

Zobrazení bitů na displeji (70123456) je zcela jiné než pořadí v binárním zadání čísel (76543210). Můžeme si rozkreslit požadovaný motiv na čtverečkovaný papír, pak „ručně“ přeházet bity, případně převést na kratší zápis a zadat do programu. To je hodně pracné jak při tvorbě, tak jakékoli úpravě. V našem příkladu je zápis v binární podobě čitelný, jedničky jsou na místech svítících LED, úpravy jsou názorné a rychlé. Po přenosu do mikrokontroléru se ovšem data v této podobě nedají použít, proto se na začátku běhu volá podprogram „prevod“, který byt po bytu obsah datové EEPROM přečte, přehází bity a uloží zpět. V daném programu stačí přeházet 16 bytů.

Pokud by se konverze dat provedla vždy při spuštění mikrokontroléru, už při druhém chodu by rozházela bity do nepoužitelného stavu. Je nutné zajistit, aby se konverze provedla jen jednou. Při přenosu dat je do posledního bytu EEPROM uložena hodnota 0. Jakmile se provede konverze, uloží na toto místo hodnotu 127, která funguje jako příznak použití. Při každém dalším spuštění se už konverze přeskočí.

Změny jasu se dělají PWM modulací a týkají se všech LED najednou. Nelze měnit jas jednotlivých LED. Povely pro změnu jasu nedovolují nastavit střídu 0, pro úplné zhasnutí je nutné použit jiný povel.