Řízení segmentových LED zobrazovačů
Pro zobrazování číslic, písmen a některých znaků jsou často používány segmentové zobrazovací jednotky. Příslušný znak se zobrazí rozsvícením nebo zviditelněním příslušných segmentů. Mezi nejběžnější patří sedmisegmentové LED zobrazovače, které sestávají ze 7 LED diod uspořádaných do tvaru osmičky (součástí bývá ještě 8.LED pro desetinnou tečku). Jednotlivé segmenty jsou označeny písmeny a až g, desetinná tečka dp (na schématu není zakreslená). Zobrazovače se vyrábí od jednomístného až po čtyřmístný a vnitřní LED diody mohou mít společnou anodu, nebo katodu. V této lekci se naučíme nejdříve používat jednomístný 7segmentový LED zobrazovač, kdy při zobrazování svítí požadované segmenty trvale. U vícemístných zobrazovačů se pak seznámíme s jejich řízením pomocí tzv. multiplexního buzení.
Obr. 1: Schéma zapojení 7segmentové jednotky
Obr. 2: Zobrazení písmene A
Obr. 3: Zobrazení písmene J
Obr. 4: Schéma zapojení úlohy
Na 7segmentovém jednomístném LED zobrazovači se společnou anodou chceme postupně vypisovat písmena podzravu A, H, O, J. Každý segment (katodu LED) musíme připojit na jednotlivý pin portu D mikropočítače. Požadovaná písmena si musíme převést na kód úrovní Log0 a Log1 – na ten segment (pin), který má svítit, zapíšeme 0 a na ten, který svítit nemá, 1. Kombinaci úrovní pro jednotlivé bity portu si můžeme definovat jako konstanty (Const) a v programu je pak pouze při zobrazování požadovaného znaku volat svým jménem.
’---------------------------------------------------------------------------------
’ PROGRAM DISPLEJ-7LED-1-text.bas Ukázka olvádání 7segmentového LED zobrazovače
’ Program, kterým při stisku tlačítka Tl1 postupně vypíše písmena nápisu “AHOJ”.
’---------------------------------------------------------------------------------
$regfile = “m8def.dat” ‘nadefinoování použitého čipu
$crystal = 12000000 ‘nadefinování interního krystalu z důvodu přesnosti
‘nadefinování vstupů a výstupů
Config Portc.0 = Input
Portc.0 = 1 ‘zapnutí pull-up rezistoru
Config Portd = Output ‘na port D jsou zapojeny katody segmentů zobrazovače
‘aliasing
Tl1 Alias Pinc.0 ‘nadefinování tlačítka, protože je to vstup, tak musí být PIN
Const A = &B10001000
Const H = &B10001001 ‘nadefinování úrovní na jednotlivých pinech (bitech) portu
Const O = &B11000000 ‘pro jednotlivé znaky nápisu
Const J = &B11100001
’------------------------------- HLAVNI PROGRAM ------------------------
Zacatek:
Portd = &B11111111 ‘posilá na celý port D hodnotu v binárním kódu
Do
If Tl1 = 0 Then ‘nekonečná smyčka
Portd = A
Waitms 400
Portd = H
Waitms 400
Portd = O
Waitms 400
Portd = J
Waitms 400
Else ‘není-li tlačítko stisknuto,
Goto Zacatek ‘vrací se program na začátek
End If
Loop
’---------------------------- KONEC HLAVNIHO PROGRAMU ---------------
End ‘konec programu
‘Poznámka:
‘Použitý 7segmentový zobrazovač má společnou anodu.
‘Při použití zobrazovače se společnou katodou budou segmenty rozsvěcovány přivedením Log1.
U vícemístných zobrazovačů bychom pro samostatné připojení 7 segmentů potřebovali příliš mnoho výstupů mikropočítače, bez desetinné tečky 7 x počet míst. Snížení počtu potřebných výstupů z mikropočítače se dosáhne použitím dekodéru, který převádí 4místný BCD kód (binárně dekadický kód) na signály pro 7segmentové zobrazovače, a rychlým přepínáním společné elektrody jednotlivých zobrazovačů, tzv. multiplexním řízením. Řídicí program vyšle na vstup BCD převodníku kód zobrazovaného znaku a současně zapne zobrazovač (místo), na kterém se má tento znak zobrazit. V jednom okamžiku tedy svítí pouze segmenty jednoho zobrazovače. Má-li být zobrazování bez blikání, je nutné provádět obnovení znaků na každé pozici minimálně jednou za 20 ms. Společná elektroda se obvykle ovládá ještě přes pomocný tranzistor, pokud to proudové zatížení výstupu mikropočítače dovolí, je možné ji připojit přímo na výstup mikropočítače.
Obr. 5: Schéma zapojení úlohy
Obr. 6: Realizace úlohy
Nejdříve si ověříme činnost BCD převodníku 4543 na jeden 7segmentový zobrazovač. Můžeme si provést zapojení podle výše uvedeného schéma s tím, že vodič vedoucí na rezistor R10 a bázi tranzistoru T2 zapojíme na GND – budeme používat jen jeden zobrazovač. Každým stiskem tlačítka S1 budeme zvyšovat proměnnou typu byte od 0 do 9. Protože proměnná nabývá jen 10 hodnot a je již v BCD kódu, můžeme ji přímo posílat na port D, maximální hodnota proměnné o 4 bitech je 15.
’-----------------------------------------------------------------------------
’ PROGRAM DISPLEJ-7LED-1a.bas Ukázka olvádání 7segmentového LED zobrazovače
’ Program, který při každém stisku tlačítka Tl1 postupně zvyšuje a na displeji
’ zobrazuje číslice od 0 po 9.
’------------------------------------------------------------------------------
$regfile = “m8def.dat” ‘nadefinoování použitého čipu
$crystal = 12000000 ‘nadefinování interního krystalu z důvodu přesnosti
Config Portc.0 = Input ‘nadefinování vstupů a výstupů
Portc.0 = 1
Config Portd = Output
‘aliasing
Tl1 Alias Pinc.0 ‘nadefinování tlačítka, jelikož je to vstupní tak musí být PIN
Dim Cislo As Byte ‘celočíselní proměnná “Cislo” typu byte (0 až 255)
Cislo = 0 ‘vynulování proměnné “Cislo”
Portd = &B11111111 ‘posilani na celý port D hodnotu v binárním kódu - zhasnutí
’-------------------------------- HLAVNI PROGRAM -----------------------
‘nekonečná smyčka
Do
If Tl1 = 0 Then Cislo = Cislo + 1 ‘s každým stiskem tlačítka se proměnná “Cislo” zvýší o 1
If Cislo = 10 Then Cislo = 0 ‘pokud proměnná dosáhne hodnoty 10 bude vynulována
Portd = Cislo ‘zapsání hodnoty proměnné “Cislo” do portu D
Waitms 250 ‘čekání 250 ms
Loop
’-------------------------- KONEC HLAVNIHO PROGRAMU -------------------
End ‘konec programu
Pokud jsme si vyzkoušeli činnost tohoto programu, můžeme přejít k dvoumístnému displeji - viz schéma, a ukázat si jeho řízení. Na programu si rovněž ukážeme možnost zkráceného zápisu podmínek If, použití větších proměnných typu integer a také použití podprogramů – částí programů, které se často opakují a volají se příkazem Gosub.
’----------------------------------------------------------------------------------------
’ PROGRAM DISPLEJ-7LED-2a.bas Ukázka olvádání dvoumístného 7segmentového LED ‘zobrazovače.
’ Program, který při každém stisku tlačítka Tl1 postupně zvyšuje a na displeji
’ zobrazuje číslice od 0 po 99. Příklad multiplexního řízení displeje.
’----------------------------------------------------------------------------------------
$regfile = “m8def.dat” ‘nadefinoování použitého čipu
$crystal = 12000000 ‘nadefinování interního krystalu z důvodu přesnosti
Config Portc.0 = Input ‘nadefinování vstupů a výstupů
Portc.0 = 1
Config Portd = Output
‘aliasing
Tl1 Alias Pinc.0 ‘nadefinování ltačítka, jelikož je to vstupní tak musí být PIN
Dim Cislo As Integer ‘celočíselná proměnná “Cislo” typu integer (-32768 až + 32767)
Dim Cislo1 As Integer ‘celočíselná proměnná “Cislo1” typu integer - pro jednotky
Dim Cislo10 As Integer ‘celočíselná proměnná “Cislo10” typu integer - pro desítky
Cislo = 0 ‘vynulování proměnné “Cislo”
Portd = &B11111111 ‘posilani na celý port D hodnotu v binárním kódu - zhasnutí displeje
’------------------------------------- HLAVNI PROGRAM -------------------------
'nekonečná smyčka
Do
If Tl1 = 0 Then Cislo = Cislo + 1 ‘s každým stiskem tlačítka se proměnná “Cislo” zvýší o 1
Cislo1 = Cislo Mod 10 ‘vyděl prom. Cislo 10 a zbytek po dělení zapiš do prom. Cislo1
Gosub Jednotky ‘skočí na podprogram Jednotky a po jeho provedení se vrátí do hl.pr.
Cislo10 = Cislo \ 10 ‘vyděl prom. Cislo 10 a výsledek zapiš do prom. Cislo10
Gosub Desitky ‘skočí na podprogram Desítky a pak se vrátí do hl.programu
If Cislo >= 100 Then Cislo = 0 ‘je-li prom. Cislo >= 100, dojde k jejímu vynulování
Loop
End
’------------------------------ KONEC HLAVNIHO PROGRAMU --------------------------
’------------------------------------ PODPROGRAMY ---------------------------------------
‘Podprogram pro zobrazení jednotek
Jednotky:
If Cislo1 = 0 Then ‘když promněnná Cislo1 je nějaká hodnota, pak pošli
Portd = &B00010000 ‘na PortD hodnotu v BCD kódu a zapni zobrazovač jednotek
Elseif Cislo1 = 1 Then
Portd = &B00010001
Elseif Cislo1 = 2 Then
Portd = &B00010010
Elseif Cislo1 = 3 Then
Portd = &B00010011
Elseif Cislo1 = 4 Then
Portd = &B00010100
Elseif Cislo1 = 5 Then
Portd = &B00010101
Elseif Cislo1 = 6 Then
Portd = &B00010110
Elseif Cislo1 = 7 Then
Portd = &B00010111
Elseif Cislo1 = 8 Then
Portd = &B00011000
Elseif Cislo1 = 9 Then
Portd = &B00011001
End If
Waitms 1
Return ‘konec podprogramu a návrat do hlavního programu
‘Podprogram pro zobrazení desítek
Desitky:
If Cislo10 = 0 Then ‘když promněnná Cislo10 je nějaká hodnota, pak pošli
Portd = &B00100000 ‘na PortD hodnotu v BCD kódu a zapni zobrazovač desítek
Elseif Cislo10 = 1 Then
Portd = &B00100001
Elseif Cislo10 = 2 Then
Portd = &B00100010
Elseif Cislo10 = 3 Then
Portd = &B00100011
Elseif Cislo10 = 4 Then
Portd = &B00100100
Elseif Cislo10 = 5 Then
Portd = &B00100101
Elseif Cislo10 = 6 Then
Portd = &B00100110
Elseif Cislo10 = 7 Then
Portd = &B00100111
Elseif Cislo10 = 8 Then
Portd = &B00101000
Elseif Cislo10 = 9 Then
Portd = &B00101001
End If
Waitms 1
Return ‘konec podprogramu a návrat do hlavního programu
Pokud jste si ověřili činnost programu, zkuste jej upravit tak, aby při nulové hodnotě desítek nesvítila na zobrazovači pro desítky nula.
Při zkoušení programu jste si jistě všimli, že zobrazovaná hodnota stisků se velmi rychle mění. Je to způsobeno „odskoky“ tlačítka, které při jednom stisku ve skutečnosti vygeneruje několik impulsů a rychlý mikropočítač je vyhodnotí jako větší množství stisků. Aby nedocházelo k těmto falešným impulsům, provádí se řada opatření, které umožní vyhodnotit jen jeden stisk tlačítka. V BASCOMu máme k dispozici příkaz, který nám toto ošetření odskoků tlačítka pomůže jednoduše vyřešit. Je to příkaz Debounce, jehož příklad použití je v následujícím ukázkovém programu.
’------------------------------------------------------------------------------------
’ PROGRAM DISPLEJ-7LED-2a-deb.bas Ukázka olvádání dvoumístného 7segmentového LED
zobrazovače s ošetřením odskoků tlačítka příkazem DEBOUNCE.
’ Program, který při každém stisku tlačítka Tl1 postupně zvyšuje a na displeji
’ zobrazuje číslice od 0 po 99. Příklad multiplexního řízení displeje.
’-------------------------------------------------------------------------------------
$regfile = “m8def.dat” ‘nadefinoování použitého čipu
$crystal = 12000000 ‘nadefinování interního krystalu z důvodu přesnosti
Config Portc.0 = Input ‘nadefinování vstupů a výstupů
Portc.0 = 1
Config Portd = Output
Config Debounce = 35 ‘doba mezi opakovaným testováním stisku tlačítka v ms
Tl1 Alias Pinc.0 ‘nadefinování ltačítka, jelikož je to vstupní tak musí být PIN
Dim Cislo As Integer ‘celočíselná proměnná “Cislo” typu integer (-32768 až + 32767)
Dim Cislo1 As Integer ‘celočíselná proměnná “Cislo1” typu integer - pro jednotky
Dim Cislo10 As Integer ‘celočíselná proměnná “Cislo10” typu integer - pro desítky
Cislo = 0 ‘vynulování proměnné “Cislo”
Portd = &B11111111 ‘pošle na celý port D hodnotu v binárním kódu - zhasnutí displeje
’--------------------------------- HLAVNI PROGRAM --------------------------------------
‘nekonečná smyčka
Do
Debounce Pinc.0 , 0 , Inkrem , Sub ‘když je i po 35 ms opět na vstupu Log0, skoč na návěští
Cislo1 = Cislo Mod 10 ‘proměnnou Cislo 10 a zbytek po dělení zapiš do proměnné Cislo1
Gosub Jednotky ‘skočí na podprogram Jednotky a po jeho provedení se vrátí
Cislo10 = Cislo \ 10 ‘vyděl proměnnou Cislo 10 a výsledek zapiš do proměnné Cislo10
Gosub Desitky ‘skočí na podprogram Desítky a po jeho provedení se vrátí
If Cislo >= 100 Then Cislo = 0 ‘je-li proměnná Cislo >= 100, dojde k jejímu vynulování
Loop
End
’------------------------------ KONEC HLAVNIHO PROGRAMU ------------------------
’------------------------------------ PODPROGRAMY --------------------------------------
Inkrem:
Cislo = Cislo + 1 ‘s každým stiskem tlačítka se proměnná “Cislo” zvýší o 1
Return
‘Podprogram pro zobrazení jednotek a desítek je stejný jako v předcházejícím programu
Příkaz Debounce zajistí, že číslo na displeji se bude při každém stisku tlačítka měnit pouze o jedničku.