Jak si sami vytvořit dynamický displej. Vícemístný sedmisegmentový ukazatel

DAbyste na indikátoru zobrazili vícemístné číslo, musíte s ním nejprve provést záludnou manipulaci, která spočívá v rozbití čísla na jeho součásti. Jako příklad uvedu zobrazení čísla 1234 na quad sedmisegmentovém ukazateli se společnou anodou.


Chcete-li zobrazit čtyřmístné číslo, musíte vytvořit jednu společnou proměnnou, ve které bude ležet číslo, které chcete zobrazit (proměnná W), čtyři proměnné, ve kterých budou uložena data pro každé znamení (N) a další čtyři proměnné pro přechodné transformace (M), abyste se nedotkli hlavní proměnné. Proměnná musí odpovídat hodnotě, která v ní bude uloženajá Tedy pro proměnnouWtyp bude dostačujícícelé číslo , protože proměnná tohoto typu je schopna uložitZměňte hodnoty z -32768 na +32767 (neboslovo pokud neplánujete používat záporná čísla). V proměnnýchNbude obsahovat čísla od 0 do 9, takže pomocí proměnné likebyte
. A v proměnnýchM budestejné hodnoty jako v proměnnéW, takže nastavíme typ celé číslo .

Ztlumit W jako celé číslo
Dim N1 As Byte
Dim N2 As Byte
Dim N3 jako Byte
Dim N4 jako Byte
Dim M1 jako celé číslo
Dim M2 jako celé číslo
Dim M3 jako celé číslo
Dim M4 jako celé číslo


Po deklaraci proměnných nakonfigurujeme výstupní portykterý bude použit pro připojení indikátoru:

DDRC = &B11111111
DDRD = &B11111111


DDRC =&B 00001111 a DDRD =&B 01111111 (čtyři první větve portu Cpro anody a prvních šest portů D pod segmenty).

Poté přiřadíme k proměnné W hodnota, kterou budeme zobrazovat na indikátoru:

W=1234

"Arial","sans-serif""> V hlavní smyčce programu přiřadíme proměnným M hodnotu proměnnéW, dělám toto:

M1 = W
M2 = M1
M3 = M1
M4 = M1


"Arial","sans-serif""> To není paranoia)), je to děláno s cílem, aby všechny proměnné M obsahovaly stejné číslo, protože během operace přiřazení může snadno vniknout přerušení (pokud nějaké existuje a není zakázáno), v jehož handleru se variabilníW se může změnit. A kdyby zadání vypadalo takto: M1= W, M2= W, M3= W, M4= W proměnné M budou obsahovat různé hodnoty, což povede k nepořádku v odečtech.

Po přiřazení hodnot k proměnným začneme pracovat
každý z nich, transformující se takovým způsobem, že do proměnné N narazit na hodnotu, která bude
zobrazeno na indikátoru: v proměnné
N 1 by měla být "1", in N 2 – „2“, v N 3 – „3“ a v N 4 – „4“.

M1 = M1 / ​​1000 " M1 = 1234 / 1000 = 1,234
N1 = Abs (ml) " N1 = Abs (1,234) = 1

Abs – funkce, která do proměnné vrací celé číslo N 1 hit jedna, což je přesně to, co bylo požadováno.

Chcete-li přiřadit dvojku proměnné N Operace 2 bude trochu složitější:

M2= M2 Mod 1000 " M2 =1234 Mod 1000 = 234
M2 = M2 / 100 " M2 = 234 / 100 = 2,34
N2 = Abs (m2) " N2 = Abs (2,34) = 2

"Arial","sans-serif""> Pro začátek funkceMod první tři vrátíme do proměnné
číslice čísla (zbytek po dělení 1000) a pak je vše jako v prvním případě.

S posledními dvěma číslicemi je to téměř stejné:

M3 = M3 Mod100
M3 = M3 / 10
N3 = Abs (m3)

M4 = M4 Mod 10
N4= Abs (m4)


Nyní naše proměnné obsahují hodnoty, které chceme zobrazit, je čas, aby mikrokontrolér kopl nohama a zobrazil tyto hodnoty na indikátoru, za tímto účelem nazýváme podprogram pro zpracování zobrazení:

"Arial","sans-serif"">

Gosub Led

"Arial","sans-serif""> Procesor skočí na podprogram s popiskemLed:

Led:

Portc = &B00001000

"Arial","sans-serif""> Zde sloužíme na vysoké úrovniPORTC .3, máme k této noze připojenou anodu první kategorie. Poté zvolíme, které segmenty je třeba rozsvítit, aby se zobrazila hodnota první proměnné. Je pro nás jedna, takže nula bude na jejích nohách Portd .1 a Portd .2, což odpovídá segmentům Indikátor B a C.

Vyberte případ N1









Konec Vyberte
Čeká 5

"Arial","sans-serif""> Po rozsvícení potřebných segmentů počkejte 5 ms a pokračujte k zobrazení následujících čísel:

Portc = &B00000100
Vyberte případ N2
Případ 0 : Portd = &B11000000
Případ 1: Portd = &B11111001
Případ 2: Portd = &B10100100
Případ 3: Portd = &B10110000
Případ 4: Portd = &B10011001
Případ 5: Portd = &B10010010
Případ 6: Portd = &B10000010
Případ 7: Portd = &B11111000
Případ 8: Portd = &B10000000
Případ 9: Portd = &B10010000
Konec Vyberte

Čeká 5

Portc = &B00000010

Vyberte případ N3
Případ 0 : Portd = &B11000000
Případ 1: Portd = &B11111001
Případ 2: Portd = &B10100100
Případ 3: Portd = &B10110000
Případ 4: Portd = &B10011001
Případ 5: Portd = &B10010010
Případ 6: Portd = &B10000010
Případ 7: Portd = &B11111000
Případ 8: Portd = &B10000000
Případ 9: Portd = &B10010000
Konec Vyberte

Čeká 5

Portc = &B00000001

Vyberte případ N4
Případ 0 : Portd = &B11000000
Případ 1: Portd = &B11111001
Případ 2: Portd = &B10100100
Případ 3: Portd = &B10110000
Případ 4: Portd = &B10011001
Případ 5: Portd = &B10010010
Případ 6: Portd = &B10000010
Případ 7: Portd = &B11111000
Případ 8: Portd = &B10000000
Případ 9: Portd = &B10010000
Konec Vyberte

Čeká 5

"Arial","sans-serif""> Po zobrazení informací na indikátoru se musíte vrátit do hlavní programové smyčky, kde je potřeba smyčku dokončit a označit konec programu.

"Arial","sans-serif""> To je to, co nakonec dostaneme:

"Arial","sans-serif"">

"Arial","sans-serif""> Vzhledem k malému zpoždění přepínání nebude přepínání pro lidské oko patrné a uvidíme celé číslo 1234.

Zdroj a projekt v Proteus si můžete stáhnout níže:"Arial","sans-serif"">

Dynamické zobrazení se široce používá k zobrazení různých informací, jako je teplota, napětí, čas nebo jednoduše počet spuštění jakýchkoli zařízení nebo senzorů. Dynamický displej na základně je dokonale kompatibilní s mikrokontroléry. V literatuře o programování mikrokontrolérů AVR je však tato problematika probírána velmi povrchně a ne v každé knize věnované příslušnému tématu. Proto se blíže podíváme na to, jak připojit sedmisegmentový indikátor s dynamickou indikací k mikrokontroléru, v tomto případě k ATmega8, ale analogie zůstává pro AVR MK jakékoli řady.

Dynamické sedmisegmentové ukazatele jsou podle počtu číslic (číslic) jednomístné, dvoumístné, třímístné, čtyřmístné a velmi zřídka šestimístné. Zaměříme se na čtyřmístné sedmisegmentové ukazatele jako nejčastěji používaný typ dynamického zobrazení. Vyrábějí se se společnou anodou a společnou katodou. Schémata zapojení pro LED jednotlivých segmentů jsou uvedena na obrázcích.

Jak je vidět z obrázků, každá číslice, nazývaná číslice, má svůj vlastní samostatný výstup společný v rámci číslice. Protože uvažujeme o 4místné dynamické indikaci, existují čtyři takové piny - číslice1, číslice2, číslice3, číslice4.

Pinout 4místného sedmisegmentového indikátoru je znázorněn na obrázku níže. V tomto případě je pohled zobrazen shora, to znamená, že indikátor není třeba otáčet vzhůru nohama.

Jak funguje dynamické zobrazení?

Nyní se podívejme, jak funguje dynamický displej se společnou katodou. Například potřebujeme zobrazit číslo 1987. K tomu bychom měli v prvním okamžiku aplikovat vysoký potenciál na anody segmentů, které tvoří jednotku - b a c, a aplikovat nízký potenciál na společná katoda prvního výboje. Společné katody zbývajících tří číslic – číslice2, číslice3 a číslice4 – zůstávají nezapojené.

Ve druhém časovém okamžiku segmenty tvořící číslici 9 přijímají energii, společná katoda druhé číslice je připojena k záporu a číslice 1 ztrácí energii; digit2, digit3, jako dříve, zůstanou nezapojené.

Ve třetím okamžiku se na třetím indikátoru rozsvítí číslo 8 a ostatní indikátory zhasnou.

Ve čtvrtém okamžiku je napájen poslední indikátor a zobrazí se číslo 7.

Pak se vše znovu opakuje. Když je frekvence přepínání z výboje do výboje větší než 25 Hz, díky světelné setrvačnosti LED naše oči nestihnou postřehnout, jak k přepínání dochází, takže vizuálně vnímáme integrální záři všech výbojů současně.

Schéma připojení dynamické indikace k mikrokontroléru ATmega 8

Dynamické indikační segmenty připojíme přes proudově omezující s nominální hodnotou 330 Ohmů na piny portu D mikrokontroléru ATmega8. Piny odpovídající digit1, digit2, digit3, digit4 budou připojeny přes tranzistory typu n-p-n, například BC547 nebo 2n2222 na piny portu B.

Algoritmus pro zápis kódu pro připojení dynamického displeje

Pro upřesnění akcí použijeme 4místný sedmisegmentový indikátor se společnou katodou. Prvním krokem je vytvoření pole čísel od 0 do 9. Už jsme se to naučili dříve, . Dále je třeba rozdělit 4místné číslo na čtyři samostatné číslice. Například číslo 1987 je třeba rozdělit na 1, 9, 8 a 7. Potom je třeba zobrazit jedno v první číslici ukazatele, devět ve druhé, osm ve třetí a sedm ve čtvrté.

Mezi mnoha algoritmy pro rozdělení víceciferného čísla na jednotlivá čísla použijeme operace dělení a zbytek dělení. Podívejme se na příklad:

1987/1000 → 1

1987%1000/100 → 9

1987%100/10 → 8

1987%10 → 7

V jazyce C při použití celočíselného datového typu int Při provádění dělení se zahazují všechny desetiny, setiny atd., tedy všechna čísla menší než jedna. Zbývají pouze celá čísla. Matematické zaokrouhlování zde nefunguje, to znamená, že 1,9 v tomto případě bude 1, nikoli 2.

Příkaz "zbytek dělení" je označen znakem procenta " % " Tento příkaz zahodí všechna celá čísla a ponechá zbytek čísla. Například 1987%1000 → 987; 1987 % 100 → 87; 1987%10 → 7.

Dále byste měli napsat příkaz, který nejprve zobrazí první číslici a odpovídající číslo, poté po určité době druhou číslici a odpovídající číslo; a tak dále. Níže je kód s komentáři.

KÓD

#definovat F_CPU 1 000 000 l

#zahrnout

#zahrnout

#define CHISLO PORTD

#define RAZRIAD PORTB

unsigned int razr1 = 0, razr2 = 0, razr3 = 0, razr4 = 0;

int číslo bez znaménka = (

// čísla od 0 do 10

0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f

};

void vse_chislo (nepodepsané int rabivka_chisla)

{

razr1 = rabivka_chisla/1000; // tisíce

razr2 = rabivka_chisla%1000/100; // stovky

razr3 = rabivka_chisla%100/10; // desítky

razr4 = rabivka_chisla%10; // jednotky

}

int main (void)

{

DDRB = 0b00001111;

DDRD = 0b11111111;

RAZRIAD = 0b00000001; // zpočátku 1. číslice

CHISLO = 0x3f; // číslo 0

zatímco (1)

{

vse_chislo (1987); // zobrazení čísla

RAZRIAD = 0b00000001; // zapnout 1. číslici, zbytek vypnout

CHISLO = chisla ; // zobrazení 1. číslice

_delay_ms(3);

RAZRIAD = 0b00000010; // zapnout 2. číslici, zbytek vypnout

CHISLO = chisla ; // zobrazení 2. číslice

_delay_ms(3);

RAZRIAD = 0b00000100; // zapnout 3. číslici, zbytek vypnout

CHISLO = chisla ; // zobrazení 3. číslice

_delay_ms(3);

RAZRIAD = 0b00001000; // zapnout 4. číslici, zbytek vypnout

CHISLO = chisla ; // zobrazení 4. číslice

_delay_ms(3);

}

}

Vylepšení programu pro dynamické zobrazení

Výše uvedený algoritmus je spíše cvičným algoritmem, a proto je poněkud zjednodušený, ale vyskytuje se i v programech, které neprovádějí žádné rychlé výpočty v reálném čase. Jedinou nevýhodou tohoto algoritmu je použití zpoždění, o jejichž negativním dopadu jsme hovořili dříve. Chcete-li se zbavit používání zpoždění, můžete použít přerušení z čítačů časovače. V níže uvedeném kódu jsou zpoždění generována pomocí nulového čítače časovače a voláním přerušení, když tento čítač přeteče.

Aby se zajistilo, že se při každém přerušení budou čísla zobrazovat postupně v každé číslici indikátoru, byla přidána proměnná bc547, která se při příštím volání přerušení ISR zvýší o jedničku (TIMER0_OVF_vect). Poté se zkontroluje hodnota proměnné bc547 a příslušný bit se napájí. Když bude bc547 větší než čtyři, je resetováno na jedničku.

Indikátory jsou obvykle umístěny na místech vhodných pro prohlížení informací na nich zobrazených. Zbytek digitálních obvodů může být umístěn na jiných deskách plošných spojů. S rostoucím počtem indikátorů se zvyšuje počet vodičů mezi deskou indikátoru a digitální tabulí. To vede k určitým nepříjemnostem při vývoji konstrukce a provozu zařízení. Stejný důvod vede ke zvýšení jeho nákladů.

Počet propojovacích vodičů lze snížit tím, že indikátory budou pracovat v pulzním režimu. Lidské oko má setrvačnost, a pokud přinutíte indikátory zobrazovat informace jeden po druhém dostatečně vysokou rychlostí, pak se člověku bude zdát, že všechny indikátory zobrazují své informace nepřetržitě. Díky tomu je možné střídavě přenášet zobrazované informace stejnými vodiči. Obvykle stačí obnovovací frekvence 50 Hz, ale je lepší tuto frekvenci zvýšit na 100 Hz.

Podívejme se na blokové schéma sedmisegmentových LED indikátorů na obrázku 1. Tento obvod může poskytovat dynamickou indikaci vydávané digitální informace.


Obrázek 1. Blokové schéma dynamické indikace

V diagramu na obrázku 1 jsou zobrazeny čtyři digitální číslice. Každý bit je krátce připojen k vlastnímu vstupu přepínače. Generátor slouží k nastavení rychlosti aktualizace informací na indikátorech. Binární čítač postupně generuje čtyři stavy obvodu a prostřednictvím tlačítek poskytuje alternativní napájení sedmisegmentových indikátorů.

Výsledkem je, že když spínač dodává binární dekadický kód ze vstupu A na vstupy sedmisegmentového dekodéru, tento kód se zobrazí na indikátoru HL1. Když spínač dodává binárně-dekadický kód ze vstupu B na vstupy sedmisegmentového dekodéru, tento kód se v cyklu zobrazí na indikátoru HL2 atd.

Rychlost aktualizace informací v uvažovaném schématu bude čtyřikrát nižší než frekvence generátoru. To znamená, že pro získání frekvence blikání indikátoru 100 Hz je zapotřebí frekvence generátoru 400 Hz.

Kolikrát jsme tím snížili počet propojovacích vodičů? Záleží na tom, kde nakreslíme průřez obvodu. Ponecháme-li na indikační desce pouze indikátory, pak bude jejich provoz vyžadovat 7 informačních signálů pro segmenty a čtyři spínací signály. Celkem je zde 11 vodičů. Ve statickém zobrazovacím obvodu bychom potřebovali 7×4=28 vodičů. Jak vidíte, výhry jsou zřejmé. Při implementaci 8bitové zobrazovací jednotky bude zisk ještě větší.

Ještě větší zisk bude, pokud je průřez obvodu nakreslen podél vstupů indikátorů. V tomto případě bude čtyřmístná zobrazovací jednotka vyžadovat pouze šest signálních vodičů a dva napájecí vodiče obvodu. Takový bod průřezu dynamického zobrazovacího obvodu se však používá velmi zřídka.

Nyní spočítejme proud protékající každým segmentem LED, když se rozsvítí. K tomu použijeme ekvivalentní obvod průtoku proudu jedním ze segmentů indikátoru. Toto schéma je znázorněno na obrázku 2.


Jak již bylo zmíněno dříve, LED vyžaduje pro normální provoz proud 3 až 10 mA. Nastavíme minimální proud LED na 3 mA. V pulzním provozním režimu však jas indikátoru N-krát klesne, přičemž koeficient N se rovná pracovnímu cyklu proudových impulsů dodávaných do tohoto indikátoru.

Pokud budeme udržovat stejnou jasnost žhavení, pak musíme N-krát zvětšit velikost pulzního proudu protékajícího segmentem. U osmimístného ukazatele je koeficient N roven osmi. Nejprve zvolíme statický proud procházející LED rovnou 3 mA. Poté, aby byl zachován stejný jas LED v osmimístném indikátoru, bude vyžadován pulzní proud:

I seg din = I seg stat× N= 3 mA × 8 = 24 mA.

Jen některé řady digitálních mikroobvodů mohou stěží poskytnout takový proud. Pro většinu sérií mikroobvodů budou vyžadovány zesilovače vyrobené na tranzistorových spínačích.

Nyní určíme proud, který poteče přepínačem, který přepíná napájení jednotlivých bitů osmibitové zobrazovací jednotky. Jak je vidět z diagramu na obrázku 2, proud z kteréhokoli segmentu indikátoru může protékat klíčem. Když se zobrazí číslo 8, bude muset svítit všech sedm segmentů indikátoru, což znamená, že pulzní proud protékající klávesou v tuto chvíli lze určit následovně:

I cl = I segding× N seg= 24 mA × 7 = 168 mA.

Jak se vám líbí tento proud?! V radioamatérských obvodech se často setkávám s řešeními, kdy je spínací proud odebírán přímo z výstupu dekodéru, který nedokáže vyrobit proud větší než 20 mA a kladu si otázku - kde takový indikátor hledat? V úplné tmě? Výsledkem je „zařízení pro noční vidění“, tedy zařízení, jehož hodnoty jsou viditelné pouze v úplné tmě.

Nyní se podíváme na schematický diagram výsledné zobrazovací jednotky. Je to znázorněno na obrázku 3.



Obrázek 3. Schéma dynamické zobrazovací jednotky

Nyní, když jsme obdrželi dynamický zobrazovací obvod, můžeme diskutovat o jeho výhodách a nevýhodách. Nepochybnou výhodou dynamického zobrazení je malý počet propojovacích vodičů, díky čemuž je v některých případech nepostradatelný, například při práci s maticovými indikátory.

Nevýhodou je přítomnost velkých pulzních proudů, a protože jakýkoli vodič je anténa, slouží dynamická indikace jako silný zdroj rušení. Dalším zdrojem rušení je napájení.

Vezměte prosím na vědomí, že náběžné hrany spínacích impulsů jsou velmi krátké, takže jejich harmonické složky pokrývají rádiový frekvenční rozsah až po ultrakrátké vlny.

Použití dynamické indikace tedy umožňuje minimalizovat počet propojovacích vodičů mezi digitálním zařízením a indikátorem, ale zároveň je silným zdrojem rušení, takže jeho použití v rádiových přijímacích zařízeních je nežádoucí.

Je-li z nějakého důvodu, např. potřeba použití maticových indikátorů, nutné použít dynamickou indikaci, pak musí být přijata všechna opatření k potlačení rušení.

Opatření pro potlačení rušení od dynamické indikace zahrnují stínění jednotky, propojovacího kabelu a desek. Použití minimální délky propojovacích vodičů, použití napájecích filtrů. Při stínění bloku může být nutné stínit samotné indikátory. V tomto případě se obvykle používá kovová síť. Tato mřížka může současně zvýšit kontrast zobrazených znaků.

Literatura:

Spolu s článkem "Dynamický displej" čtěte:

Indikátory jsou navrženy tak, aby určité osobě zobrazovaly různé typy informací. Nejjednodušší typ informací je...
http://site/digital/Indic.php

Indikátory vybití plynu se používají jak k indikaci bitové informace, tak k zobrazení desetinné informace. Při konstrukci desetinných indikátorů se katoda...
http://site/digital/GazIndic/

V dnešní době se LED diody používají téměř všude k zobrazení binárních informací. To je způsobeno...
http://site/digital/LED.php

Princip činnosti indikátorů z tekutých krystalů... Provozní režimy indikátorů z tekutých krystalů... Tvorba barevného obrazu...
http://site/digital/LCD.php

Aktualizováno 3. 4. 2015. Ahoj všichni. V minulém článku jsme se podívali na algoritmus pro komunikaci s LCD a také na výstup informací na něj a vyzkoušeli jsme jej v simulátoru. V tomto příspěvku budu stručně mluvit o „levné“ metodě zobrazování informací - to je sedmisegmentový indikátor

, což je nejjednodušší z indikátorů, pro zobrazení arabských číslic a také některých symbolů, které na něm lze zobrazit. Zvážíme také C program pro AVR a propojení v hardwaru a simulátoru. Pro zobrazení písmen se používají složitější vícesegmentové a maticové indikátory. Ale tady budeme hovořit o sedmi segmentech... Také se zamyslíme nad tím, co je dynamické zobrazení
Měli byste tedy vědět, že indikátory jsou dodávány se společnou anodou a katodou, jako na obrázku níže. Měl jsem po ruce indikátor se společnou katodou (spodní část obrázku), jehož řídicí výstup je spojen s mínusem. S tím budeme pracovat.

Pokud existuje několik indikátorů, pak jsou katody řízeny několika nohami MK. !!! Ale vždy používejte tranzistory, protože... I/O porty se mohou spálit kvůli relativně vysokému proudu. Použil jsem běžné tranzistory 315. Na obrázku níže jsem ukázal jejich přibližné zapojení řídicího výstupu indikátoru a regulátoru. Pro instalaci potřebujeme 11 nožiček mikrokontroléru, tzn. pro zobrazení informací o segmentech je k ovládání 8 nohou (7 + tečka) a jedna noha pro každý indikátor, já je mám tři, takže ovládací nohy jsou také tři. Níže jsem uvedl a popsal program. Pro ovládání segmentů použijeme piny z jednoho portu, abychom se nepletli. Napsal pro mikrokontrolér ATmega8 . Pokud se chcete „kámenů“ zbavit, pak to není problém například v, kde můžete snadno změnit nastavení pro jiný „kámen“, jde především o čísla pinů a portů. Jsou zde také popsána obecná pravidla univerzálnosti a přenosu.

Nákres připojení tranzistoru k MK a indikátoru.

Pojďme k naprogramovat. V tomto malém programu (na Si ) Uvedl jsem příklad zahrnutí tří indikačních prvků a výstup čísla s čárkou. Použití časovače a přerušení pro výstup do indikátoru. Při psaní programu se musíme rozhodnout, který pin portu by měl odpovídat segmentu na indikátoru. Samotný indikační prvek je znázorněn na obrázku níže. Na straně je popis připojení pinů k segmentům indikačního prvku (pin portu – číslo nohy prvku (obr. výše) – písmeno segmentu – číslo v poli zodpovědné za zapnutí segmenty na prvku).

PB0 - 12 - ovládání prvního prvku

PB6 - 9 - ovládání druhého prvku
PB7 - 8 - ovládání třetího prvku
PD7 – 11 – (A) – 128
PD6 – 10 – (F) – 64
PD5 – 7 – (B) – 32
PD4 – 5 – (G) – 16
PD3 – 4 – – 8
PD2 – 3 – (DP) – 4
PD1 – 2 – (D) – 2
PD0 – 1 – (E) – 1

#zahrnout
#zahrnout
#zahrnout
/*Pojďme definovat sedmisegmentový prvek pro každý pin portu (obrázek výše)*/
#definujte 128
#definujte b 32
#definujte od 8
#definujte d 2
#definujte e 1
#definujte f 64
#definujte g 16
#definujte dp 4
/*Tato makra obsahují čísla odpovídající dvěma umocněným,rovnající se číslu „nohy“ portu, ke kterému se indikátor segmentujestejný název jako makro.*/
short unsigned int j, k = 0; /*proměnné se používají v makru přerušení*/
float i = 0;
/*Proměnná pro výstup do indikátoru*/ krátké nepodepsané
int w = 0;
/*Variabilní indikátor pro zapnutí bodu*/
nepodepsaný znak Slot;
/*Pole, které ukládá čísla, která potřebujete výstup přes port do indikátoru tak, aby ukazoval číslo rovné číslu
{
prvek pole. Čísla závisí pouze na makrech.*/
void Slot_init()
/*Funkce inicializace indikátoru*/
Slot = (a+b+c+d+e+f);
Slot = (b+c);
Slot = (a+b+g+e+d);
Slot = (a+b+g+c+d); .
Slot = (f+g+b+c);
/*Názvy maker odpovídají názvům indických segmentů*/
Slot = (a+f+g+c+d);
Slot = (a+f+g+c+d+e);
}
Slot = (a+b+c);
Slot = (a+b+c+d+e+f+g);
Slot = (a+b+c+d+f+g);
Slot = dp; /*Tečka*/
{
/*Tyto proměnné ukládají čísla, která je třeba zobrazit*/
char Elem1, Elem2, Elem3;/* Funkce extrahuje číslice z třímístného čísla Číslo */
neplatný displej (plovoucí číslo)
{
plovák N1, N2;/*Proměnné pro funkci modf*/
N1 = modf(číslo, &N2);
}
/*Rozdělte číslo na celé číslo a zlomkové části, N1 = zlomek
N2 = celé číslo*/
if (N1 != 0) /*Pokud se nerovná nule, pak existuje zlomek*/
{
Číslo= Číslo*10; /*pak vynásobte číslo 10, pro normální výstup číslem
třímístný indikátor zlomkového čísla*/
}
w = 1;
{
/* proměnná indikátoru, která se používá ve smyčce níže k zahrnutí tečky*/
short unsigned int Num1, Num2, Num3;
}
Num1=Num2=0;
while (číslo >= 100) /*stovky*/
číslo -= 100;
{
Num1++;
while (číslo >= 10) /*desítky*/ Číslo -= 10;
}
Num2++;
Num3 = Číslo; /*Jednotky*/
Elem1 = Slot;
}
if (w == 1) /*Podmínka pro zahrnutí bodu na druhý prvek*/
{
Elem2 = (Slot|0×04); /*logické sčítání se špendlíkem odpovídajícím bodu*/
w = 0;
/*Vypnout tečku*/
jiný
Elem2 = Slot;
Elem3 = Slot;
int main (void) /*začátek hlavního programu*/
DDRB = 0Xff;
/*nakonfigurujte všechny piny portu B jako výstupy*/
DDRD = 0xff;</*nakonfigurujte všechny piny portu D jako výstupy*/
PORTD = 0×00;</*Nastavit 0*/
PORTB |= _BV(PB6); PORTB |= _BV(PB0);
{
PORTB |= _BV(PB7);
slot_init();
sei();
/*Povolit obecné přerušení*/
/*Inicializace časovače T0*/
} TIMSK = (1
} /*Příznak povolení přetečení časovače čítače T0*/

Dalším krokem je přidání funkce přerušení, která bude spouštěna speciálním vektorem TIMER0_OVF_vect, který je zodpovědný za přerušení přetečení T0. K tomu používáme hardwarový časovač/počítač T0. Nahoře jsme si v programu zapsali nastavení časovače a tam jsme také spočítali frekvenci, s jakou bude dynamické zobrazení probíhat. Tito. Když registr počtu v počítadle je přeplněný, Obecný program se zastaví a provede se níže uvedená funkce, po jejím ukončení pokračuje provádění hlavního programu.

ISR (TIMER0_OVF_vect)
{
PORTB &= 0x3e; //Čištění PB7, PB6, PB0
_for (j = 0; j<=30; j++) { } // Zpoždění vypnutí tranzistoru
(k == 3) ? k = 0: k++; /*Proměnná, která je zodpovědná za sekvenci požárutříprvkový indikátor, 0,1 a 2. Při určitém čísle se na určité noze nastaví 1, poté se tranzistor otevře a rozsvítí se segmenty indikátoru odpovídající proměnné Elemn */
přepínač (k)
{
případ 0: PORTB |= (1<< PINB7); // Jednotky
PORTD = Elem3;
přerušení;
případ 1: PORTB |= (1<< PINB6); // Desítky
PORTD = Elem2;
přerušení;
případ 2: PORTB |= (1<< PINB0); // Stovky
PORTD = Elem1;
}
}

Výše uvedený program byl testován v hardwaru a v simulátoru. Níže jsou podle toho obrázky. Vše v žehličce jsem připájel vrchlíkem, rychle. Jak vidíte, existují tři indikační prvky, respektive tři tranzistory (zakroužkováno). Tranzistory v simulátoru (Proteus) nepotřebujeme. V programu je také jeden podstatný rozdíl, a to v přerušení, kde je hzpoždění pro vypnutí tranzistoru - zadejte v simulátoru 50 hodinových cyklů. Všechno by mělo fungovat.

Jak jsme publikovali příspěvky, náš program pro indikátor se trochu změnil, konkrétně jsme přidali čtvrtý prvek, zobrazující na něm znaménko mínus, symboly „H“ a „C“, formát výstupu času a kombinaci všech režimů. Takže čtěte, analyzujte a experimentujte.

Níže jsou uvedeny zdroje a projekt založený na výše uvedeném materiálu.

(Staženo: 795 lidí)

To je vše. V dalším článku popíšu zapojení teplotních čidel a zobrazím informace na indikátoru. Brzy se uvidíme!

Někdy je potřeba k mikrokontroléru připojit několik sedmisegmentových indikátorů nebo LED matici a k ​​zobrazení informací se používá dynamická indikace. Podstatou dynamického zobrazení je sekvenční zobrazování informací na indikátorech. Níže uvedený diagram ukazuje příklad připojení několika sedmisegmentových indikátorů (například se společnou katodou) k implementaci dynamické indikace obecně, s přihlédnutím k bodu, je získáno 8 segmentů, ale staromódním způsobem se nazývají tímto způsobem. Všechny piny (anody) stejnojmenných segmentů jsou spojeny dohromady, celkem tedy 8 linek, které jsou připojeny k mikrokontroléru přes odpory. Společná katoda každého indikátoru je připojena k mikrokontroléru přes tranzistor.


Algoritmus indikace je následující: nejprve nastavíme požadované logické úrovně na řádcích v závislosti na tom, které segmenty je třeba zapnout na prvním indikátoru (indikace zleva doprava), s vysokou logickou úrovní pro zapnutí, nízkou až vypněte segment. Dále aplikujeme vysokou logickou úroveň na bázi tranzistoru VT1, čímž připojíme společnou katodu prvního indikátoru ke společnému vodiči, v tuto chvíli se rozsvítí ty segmenty, které mají na anodách logickou jedničku. Po určité době (pauze) indikátor vypneme aplikací nízké logické úrovně na bázi tranzistoru, poté opět změníme logické úrovně na linkách v souladu s výstupní informací určenou pro druhý indikátor a odešleme zapínací signál do tranzistoru VT2. Všechny indikátory tedy přepínáme v pořadí v kruhovém cyklu, a to je celá dynamická indikace.

Pro získání pevného obrazu bez blikání je nutné přepínání provádět vysokou rychlostí, aby nedocházelo k blikání LED, obnovovací frekvence musí být nastavena na 70 Hz nebo více, já ji obvykle nastavuji na 100 Hz. Pro výše diskutovanou konstrukci se pauza vypočítá takto: pro frekvenci 100 Hz je perioda 10 ms, celkem jsou tedy 4 indikátory, doba svícení každého indikátoru je nastavena na 10/4 = 2,5 ms; . V jednom pouzdře jsou vícemístné sedmisegmentové indikátory, u kterých jsou stejnojmenné segmenty spojeny uvnitř samotného pouzdra, k jejich použití je nutné použít dynamickou indikaci.

Chcete-li implementovat dynamickou indikaci, musíte použít přerušení, když jeden z časovačů přeteče. Níže je uveden kód využívající časovač TMR0:

;Implementace dynamického zobrazení pro 4 sedmisegmentové indikátory;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ................ ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Implementace dynamického zobrazení pro 4 sedmisegmentové indikátory

;Kmitočet generátoru hodin například 4 MHz, cyklus stroje 1 µs

org 0000h ;spuštění provádění programu od adresy 0000h

goto Start ;přejděte na štítek Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Přerušte rutinu

org 0004h ;spuštění provádění podprogramu od adresy 0004h

movwf W_TEMP ;uložení hodnot registru klíčů

swapf STATUS,W ;

movwf STATUS_TEMP ;

bcf ind1 ;vypnout 1. indikátor

bcf ind2 ;vypnout 2. indikátor

bcf ind3 ;vypnout 3. indikátor

bcf ind4 ;vypnout 4. indikátor

incf list,F ;registrovat přírůstkový list

movlw .5 ;zkontrolujte obsah registru listů

xorwf list,W ;pro rovnost číslu 5

btfss STAV,Z ;

goto met1 ;číslo v registru listů se nerovná 5

movlw .1 ;číslo v registru listů je 5: zápis čísla 1

movwf list ;zaregistrovat list

met1 movlw .1 ;kontrola obsahu registru listů

xorwf list,W ;pro rovnost číslu 1

btfss STAV,Z ;

goto met2 ;číslo v registru listů se nerovná 1: přejděte na met2

movf datind1,W ;číslo v registru listů je 1: kopie

movwf PORTB ;obsah registru datind1 do registru PORTB

bsf ind1 ;zapněte 1. indikátor

goto exit ;přejít na štítek exit

met2 movlw .2 ;kontrola obsahu registru listů

xorwf list,W ;pro rovnost číslu 2

btfss STAV,Z ;

goto met3 ;číslo v registru listů se nerovná 2: přejděte na met3

movf datind2,W ;číslo v registru listů je 2: kopie

movwf PORTB ;obsah registru datind2 do registru PORTB

bsf ind2 ;zapněte 2. indikátor

goto exit ;přejít na štítek exit

met3 movlw .3 ;kontrola obsahu registru listů

xorwf list,W ;pro rovnost číslu 3

btfss STAV,Z ;

goto met4 ;číslo v registru listů se nerovná 3: přejděte na met4

movf datind3,W ;číslo v registru listů je 3: kopie

movwf PORTB ;obsah registru datind3 do registru PORTB

bsf ind3 ;zapněte 3. indikátor

goto exit ;přejít na štítek exit

met4 movf datind4,W ;kopírování obsahu registru datind3

movwf PORTB ;pro registraci PORTB

bsf ind4 ;zapněte 4. indikátor

exxit bcf INTCON,T0IF ;resetuje příznak přerušení přetečení TMR0

movlw .100 ;zapište číslo 156 do registru časovače TMR0

swapf STATUS_TEMP,W ;obnovení obsahu registrů klíčů

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;ukončit rutinu přerušení

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Hlavní program

Start ............. ;počáteční nastavení registru

............. ;speciální účel

.................

bsf STATUS,RP0 ;zapište binární číslo 11010011 pro registraci

movlw b"11010011" ;OPTION_REG, čímž se nastaví vnitřní

movwf OPTION_REG ;zdroj hodin pro TMR0

bcf STATUS,RP0 ;zapněte předděličku před TMR0

;nastavte faktor předděličky na 1:16

clrf shet ;vynulování registru listů před spuštěním

;přerušení při přetečení TMR0, provedeno

;jednou, po zapnutí napájení

clrf datind1 ;

clrf datind2 ;indikátory, ekvivalentní vypnutí

clrf datind3 ;ukazatele, jelikož ukazatele se společným

clrf datind4 ;katoda

bcf INTCON,T0IF ;resetuje příznak přerušení přetečení TMR0

bsf INTCON,T0IE ;povolit přerušení přetečení TMR0

bsf INTCON,GIE ;povolit globální přerušení

movlw b"00000110" ;příklad výstupu čísla 13.52

movlw b"11001111" ;

movlw b"01101101" ;

movlw b"01011011" ;

................. ;

................. ;

................. ;

konec ;konec celého programu

V hlavním programu jsme nejprve nastavili časovač pomocí registru OPTION_REG dříve, o použití časovačů pro . Dále vymažeme registr listů určený pro zadání počtu od 1 do 4 pro každý indikátor. Tento registr se inkrementuje v rutině zpracování přerušení a tam se upraví (bude počítat od 1 do 4), takže toto vymazání se provede jednou po zapnutí napájení. Pomocí tohoto registru určíme, který indikátor zapnout, a vydáme mu odpovídající data. Dalším krokem je vymazání registrů úložiště informací, čtyři registry dataind1,2,3,4 odpovídající čtyřem indikátorům. Vymazání je ekvivalentní vypnutí indikátorů, protože při rutině zpracování přerušení se obsah těchto registrů přenese do registru PORTB, ke kterému jsou připojeny anody indikátorů. To je nezbytné, aby se po povolení přerušení na indikátorech nezobrazovaly žádné odpadky, tomu lze v zásadě zabránit, pokud okamžitě zaznamenáte správné informace pro výstup; Dále resetujeme příznak přerušení přetečení časovače, povolíme přerušení přetečení TMR0 a nakonec povolíme globální přerušení.

V podprogramu zpracování přerušení nejprve vypneme všechny indikátory (aplikací nízkých logických úrovní na báze tranzistorů), protože není známo, který z nich je zapnutý. Zvětšujeme registr listů, kontrolujeme shodnost čísla 5, pokud existuje taková shoda, zapíšeme do registru číslo 1, protože je nutné počítat od 1 do 4. Dále zkontrolujeme, které číslo je v registru; listový registr, podle kterého načteme data z registrů úložiště informací (dataind) pro příslušný indikátor a zapneme jej. Poté resetujeme příznak přerušení přetečení TMR0, zapíšeme do časovače číslo 100 (výpočet této hodnoty je uveden níže) pro časovou prodlevu a ukončíme obsluhu přerušení. Při prvním přerušení se rozsvítí první indikátor, při druhém přerušení druhý a tak dále v kruhovém cyklu. V hlavním programu zbývá pouze načíst data do registrů úložiště informací pro každý indikátor. V podprogramu přerušení nezapomeňte uložit a obnovit hodnoty klíčových registrů, o tom jsem psal v článku o.

Pro výstup čísel je lepší použít generátor znaků ve formě datové tabulky. Chcete-li například zobrazit číslo 3456 na indikátorech, musí být rozděleno na číslice a je lepší použít samostatné registry k uložení čísel číslic (od 0 do 9), poté tyto registry spustit pomocí generátoru znaků, čímž získáte správné bajty (načtené do dataind registrů) pro zapálení odpovídajících segmentů.

Vezměme frekvenci generátoru hodin na 4 MHz, cyklus stroje na 1 μs. Frekvence aktualizace každého indikátoru nechť je 100 Hz (perioda T = 10 ms), požadované časové zpoždění je 10/4 = 2,5 ms. Koeficient předděličky pro TMR0 nastavíme na 1:16, přičemž maximální možné zpoždění je 256x16 = 4096 μs a potřebujeme pauzu 2,5 ms. Vypočítejme číslo, které bude zaznamenáno v TMR0: 256-((256x2,5)/4,096) = 256-156,25 = 99,75. Po zaokrouhlení dostaneme číslo 100.

Níže si můžete stáhnout model programu Proteus, firmware a zdrojový kód s implementací dynamické indikace na 4-místném indikátoru se společnou katodou pomocí mikrokontroléru PIC16F628A. Například indikátor zobrazuje čísla 0000; 0001; 0002; 13,52; 9764.

Nyní se podíváme na připojení matice s rozlišením 8x8 pixelů (LED). Struktura matice je obvykle uvažována z hlediska řádků a sloupců. Na obrázku níže jsou katody všech LED zapojeny v každém sloupci a anody v každé řadě. Linky (8 linek, LED anody) jsou připojeny k mikrokontroléru přes odpory. Každý sloupec (LED katody) je připojen k mikrokontroléru přes 8 tranzistorů. Algoritmus indikace je stejný, nejprve nastavíme na řádcích potřebné logické úrovně, podle kterých mají ve sloupci svítit LED, poté připojíme první sloupec (indikace zleva doprava). Po určité pauze sloupec vypneme a změníme logické úrovně na řádcích tak, aby se zobrazil druhý sloupec, pak připojíme druhý sloupec. A tak postupně přepínáme všechny sloupce. Níže je schéma připojení matice k mikrokontroléru.


Celkově pro připojení takové matice budete potřebovat 16 pinů mikrokontroléru, což je docela hodně, takže pro redukci řídicích linek je lepší použít sériové posuvné registry.

Nejrozšířenějším sériovým registrem je čip 74HC595, který obsahuje posuvný registr pro načítání dat a úložný registr, přes který jsou data přenášena na výstupní linky. Načítání dat do něj je jednoduché, na hodinovém vstupu SH_CP nastavíme logickou 0, na datovém vstupu DS pak nastavíme požadovanou logickou úroveň, načež hodinový vstup přepneme na 1 a hodnota úrovně (na vstupu DS) je uloženy v posuvném registru. Zároveň jsou data posunuta o jeden bit. Opět resetujeme pin SH_CP na 0, nastavíme požadovanou úroveň na vstupu DS a zvedneme SH_CP na 1. Po plném načtení posuvného registru (8 bitů) nastavíme pin ST_CP na 1, v tuto chvíli se data přenesou do úložného registru a přivedeny na výstupní linky Q0... Q7, načež resetujeme výstup ST_CP. Během sériového načítání se data posunou z Q0 na Q7. Pin Q7' je připojen k poslednímu bitu posuvného registru, tento pin lze připojit ke vstupu druhého čipu, takže můžete načítat data do dvou nebo více čipů najednou. Pin OE přepne výstupní linky do třetího (vysokoodporového) stavu, když je na něj přivedena logická 1. Pin MR je určen k resetování posuvného registru, tedy k nastavení nízkých logických úrovní na výstupech překlopení registru. -flops, což je ekvivalentní načtení osmi nul. Níže je schéma načítání dat do čipu 74NS595, nastavení hodnoty 11010001 na výstupních řádcích Q0...Q7 za předpokladu, že tam zpočátku byly nuly:


Zvažte připojení matice 8x8 k mikrokontroléru PIC16F628A pomocí dvou posuvných registrů 74HC595, schéma je uvedeno níže:


Data se načtou do čipu DD2 (ovládání logických úrovní na řádcích, LED anody), poté se přes pin Q7' přenesou na DD3 (ovládání sloupců), resp. nejprve načteme byte pro povolení sloupce, pak bajt s logickými úrovněmi na řádcích. Na výstupní linky DD3 jsou připojeny tranzistory, které přepínají sloupce matice (LED katody). Níže je uveden programový kód pro zobrazení obrázku na matici:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;; ;Implementace dynamického zobrazení pro matici s rozlišením 8x8 ;Frekvence generátoru hodin je například 4 MHz, cyklus stroje 1 μs org 0000h ;spuštění provádění programu od adresy 0000h goto Start ;přejděte na štítek Start ;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; ;Podprogram zpracování přerušení org 0004h ;spuštění provádění podprogramu z adresy 0004h movwf W_TEMP ;uložení hodnot registrů klíčů swapf STATUS,W ; 124 ;zapište číslo 124 do registru časovače TMR0 movwf TMR0 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Implementace dynamického zobrazení pro matici s rozlišením 8x8

;Kmitočet generátoru hodin například 4 MHz, cyklus stroje 1 µs

org 0000h ;spuštění provádění programu od adresy 0000h

goto Start ;přejděte na štítek Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Přerušte rutinu

org 0004h ;spuštění provádění podprogramu od adresy 0004h

movwf W_TEMP ;uložení hodnot registru klíčů

swapf STATUS,W ;

movwf STATUS_TEMP ;

movf FSR,W ;uložte aktuální hodnotu registru FSR

movwf FSR_osn ;pro registraci FSR_osn

movf FSR_prer,W ;obnoví dříve uloženou hodnotu

movwf FSR ;registr FSR z registru FSR_prer

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (sériový posuvný registr)

movf stolb,W ;kopírování obsahu registru stolb

movwf var ;zaregistrovat var

movlw .8 ;zapište číslo 8 do registru scetbit, pro počítání

movwf scetbit ;vysílané bity

met2 btfsc var,0 ;nastavte výstup ds v souladu s

bsf ds ;hodnota 7. bitu registru var

bsf sh_cp ;hodiny na kolíku sh_cp pro zajištění dat

rrf var,F ;posuňte registr var doprava pro přípravu

; další kousek

decfsz scetbit,F ;dekrementace s podmínkou registru scetbit

goto met2 ;scetbit není nula: přejděte na met2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (sériový posuvný registr)

movf INDF,W ;zkopíruje obsah registru INDF

movwf var ;zaregistrovat var

movlw .8 ;zapište číslo 8 do registru scetbit, pro počítání

movwf scetbit ;vysílané bity

met1 btfsc var,7 ;nastavte výstup ds v souladu s

bsf ds ;hodnota 7. bitu registru var

bsf sh_cp ;hodiny na kolíku sh_cp pro zajištění dat

rlf var,F ;posun registru var doleva, pro přípravu

; další kousek

decfsz scetbit,F ;dekrementace s podmínkou registru scetbit

goto met1 ;scetbit není nula: přejděte na met1

bsf st_cp ;hodiny výstupu st_cp pro přenos načteny

bcf st_cp ;bajty k výstupním linkám mikroobvodů 74HC595

bcf STATUS,C ;reset bit C stavového registru před posunutím

rrf stolb,F ;posun doleva registr stolb

incf FSR,F ;zvyšte registr FSR, připravte další

;zaregistrujte se pro odesílání dat na 74HC595

decfsz list,F ;dekrementace s listem stavu registru

goto exxit ;registr Shet se nerovná 0: přechod na exxit

movlw data1 ;registr listů je 0: zaznamenejte adresu prvního

movwf FSR ;registr ukládání informací v registru FSR

movlw .8 ;zapište číslo 8 do evidence listů, pro uchování

movwf list ;sloupec počítá

movlw b"10000000" ;zápis binárního čísla 10000000

movwf stolb ;

exxit bcf INTCON,T0IF ;resetuje příznak přerušení přetečení TMR0

movlw .124 ;zapište číslo 124 do registru časovače TMR0

movf FSR,W ;uložte aktuální hodnotu registru FSR

movwf FSR_prer ;pro registraci FSR_prer

movf FSR_osn ,W ;obnoví dříve uloženou hodnotu

movwf FSR ;registr FSR z registru FSR_osn

swapf STATUS_TEMP,W ;obnovení obsahu registrů klíčů

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;ukončit rutinu přerušení

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Hlavní program

Start ............. ;počáteční nastavení registru

............. ;speciální účel

.................

bsf STATUS,RP0 ;zapište binární číslo 11010011 pro registraci

movlw b"11010010" ;OPTION_REG, čímž se nastaví vnitřní

movwf OPTION_REG ;zdroj hodin pro TMR0

bcf STATUS,RP0 ;zapněte předděličku před TMR0

;nastavte poměr předděličky na 1:8

movlw .8 ;před spuštěním zapište číslo 8 do registru listů

movwf shet ;přerušení při přetečení TMR0, provedeno

;jednou, po zapnutí napájení

movlw b"10000000" ;zápis binárního čísla 10000000

movwf stolb ;

Informace s logickými úrovněmi pro řádky každého sloupce jsou uloženy v 8 registrech úložiště informací, ke kterým je přístup. Adresa prvního registru se jmenuje data1. Kromě prvotního zápisu registrů shet a stolb je nutné do registru FSR_prer zapsat adresu prvního registru úložiště informací (registr je data1, zápis do FSR_prer se provede jednorázově, poté se upraví v handler), teprve poté povolte přerušení přetečení TMR0.

Před povolením přerušení je vhodné vymazat registry úložiště informací, tato operace se provádí pomocí přídavného registru tmp (jako čítače) a nepřímé adresování je ekvivalentní vypnutí matice;

V podprogramu obsluhy přerušení načteme obsah registru stolb do čipu DD2 (při prvním vstupu do handleru po povolení přerušení registr obsahuje číslo 10000000, jak je uvedeno výše). Načítání začíná nejméně významným bitem registru stolb, který se při načítání posouvá ve směru z Q0 na Q7 (uvnitř čipu DD2), algoritmus načítání byl diskutován výše, takže si myslím, že nebude těžké porozumět kód. Dále načteme obsah registru INDF do DD2, jedná se o jeden z registrů úložiště informací, jehož adresa je v FSR (při prvním vstupu do handleru po povolení přerušení se adresa prvního registru úložiště informací tzv. data1 je v FSR). Načítání začíná od nejvýznamnějšího bitu registru INDF. Po načtení uvažovaných 2 bajtů nataktujeme výstup st_cp, čímž se načtená data přenesou na výstupní linky mikroobvodů DD2, DD3. Při prvním vstupu do procesoru se tedy přepne první sloupec matice, ve kterém se rozsvítí LED diody, jejichž anody mají vysokou logickou úroveň, v souladu s obsahem registru data1 (první informace skladový rejstřík).

Dále posuneme registr stolb o jeden bit doprava, abychom druhý sloupec matice připravili pro komutaci při příštím vstupu do obsluhy přerušení. Před posunem je nutné vymazat příznak C registru STATUS, protože k posunu dochází přes tento příznak a jeho stav není v době posunu znám. Po posunu inkrementujeme registr FSR a připravíme další registr úložiště informací (po registru data1) s úrovněmi logických řádků pro druhý sloupec. Dále dekrementujeme registr listů s podmínkou, a pokud se nerovná nule, resetujeme příznak přerušení přetečení TMR0, zapíšeme číslo do časovače a ukončíme obsluhu přerušení.

Při příštím vstupu do handleru bude zahrnut druhý sloupec matice atd. Při vynulování listového registru (po přepnutí 8. sloupce) se do něj zapíše číslo 8 pro další cyklus přepínání pilířů, navíc se upraví hodnota registru stolb a adresa první informace úložný registr (data1) se zapisuje do registru FSR.

Počítejme časové zpoždění pro časovač TMR0, frekvence generátoru hodin 4 MHz, cyklus stroje 1 μs. Abychom zabránili blikání LED, vezmeme obnovovací frekvenci každého sloupce na 100 Hz (perioda T = 10 ms), časové zpoždění je 10/8 = 1,25 ms. Faktor předděličky TMR0 jsme nastavili na 1:8, přičemž maximální možné zpoždění je 256x8 = 2048 μs. Pro pauzu 1,25 ms musí časovač počítat (256x1,25)/2,048 = 156,25 krát, zaokrouhlením nahoru dostaneme 156 impulsů. Podle toho je nutné do časovače zapsat číslo 256-156 = 100, ale to není úplně správná hodnota, protože provedení podprogramu zpracování přerušení nějakou dobu trvá, v tomto případě to trvá asi 190 μs, přepočteno zabírání. při zohlednění koeficientu předděličky dostaneme 190/8 = 23,75 nebo 24 impulzů. Správná hodnota pro zápis do TMR0 je: 100+24=124.

V hlavním programu zapíšeme 8 registrů pro ukládání informací podle toho, co chceme na matici zobrazit. Níže je schéma vysvětlující výstup informací do matice pro výše uvedený kód.


Kromě posuvných registrů existují specializované drivery pro výstup informací do sedmisegmentových indikátorů a LED matice v tomto případě dynamickou indikaci realizuje samotný driver; Jeden z těchto populárních ovladačů jsem recenzoval v článku o .

Pod odkazem si můžete stáhnout firmware a zdrojový kód pro mikrokontrolér PIC16F628A s implementací dynamického zobrazení na matici 8x8 pomocí dvou posuvných registrů 74HC595, schéma zapojení bylo diskutováno výše. Na matici se střídavě zobrazují písmena R, L, číslo 46, smajlík a jen vzor v podobě křížku, tato animace je demonstrována na videu níže.

se štítky, . Přečtěte si .



Líbil se vám článek? Sdílejte se svými přáteli!