Struktura

Řízení sedmisegmentových LED zobrazovačů

Ří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 ag, 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

obrazekObr. 2: Zobrazení písmene AobrazekObr. 3: Zobrazení písmene J

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

obrazekObr. 5: Schéma zapojení úlohyObr. 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.

Zdroje

Obrázky: 

  • Obr. 1-6: Archiv autora.

Rozšiřující pojmy

http://fyzika.jreichl.com/main.article/view/1340-zapojeni-sedmisegmentoveho-displeje

Procvič si

Pomocí příkazu Const si nadefinuj různá písmena nebo znaky a vytvoř si texty podle svého návrhu.

Tip

Ověř si znovu vliv použití příkazu Debounce na rychlost změny čísel na displeji při jednom stisku tlačítka. Víš čím je to způsobeno?

Logolink