ACASĂ Vize Viza pentru Grecia Viză în Grecia pentru ruși în 2016: este necesar, cum se face

Afișare dinamică pe avr. Indicator cu șapte segmente. Programarea funcționării unui indicator cu mai multe cifre și șapte segmente

Continuând lecția, să ne uităm la afișajul dinamic. Dacă ai studiat cu atenție indicația statică, știi că un indicator de segment este un set de LED-uri. Pentru a conecta indicatorul, aveți nevoie de 7 pini de microcontroler. Dar dintr-o dată a trebuit să folosim mai mulți indicatori, de exemplu 2, 3, 4...

Atunci vom avea nevoie de 14, 21, 28 de picioare, și nu sunt destule picioare... Aici ne vine în ajutor afișajul dinamic. Scopul principal al afișajului dinamic este reducerea numărului de pini pentru microcontroler utilizați. Vă rugăm să rețineți că în diagramă sunt implicate 9, nu 14 picioare. Picioarele de control sunt toate conectate în paralel.

Într-un sens general, acest design funcționează după cum urmează: mai întâi, configurația primului număr este scoasă pe magistrala comună și pornim PB1. Primul indicator se aprinde, cu numărul dorit. Apoi îl oprim, trimitem configurația celui de-al doilea număr pe magistrala de date, aprindem al doilea indicator și îl oprim.

In detaliu. În primul moment totul este oprit PORTB=0x00; PORTD=0xFF; deoarece circuitul este cu un anod comun „+”. Apoi, configurația primului număr, de exemplu „0”, este trimisă la PORTD. Din afișajul static ne amintim:

cazul 0 : ( PORTD= 0xC0 ; pauză ; )

cazul 0: (PORTD=0xC0; pauză; )

Dar rețineți că „+” este conectat la PORTB.1, adică. pentru a ilumina un segment trebuie să porniți PORTB.1=1 picior;

În al doilea moment de timp, oprim totul din nou, trimitem configurația celui de-al doilea număr și activăm, de această dată, al doilea indicator. În continuare, repetăm.

La frecvențe înalte, ochiul uman nu poate discerne aceste comutatoare, iar indicatorul pare să fie aprins în mod constant. Se recomandă să nu folosiți frecvențe care sunt multiple de 50 Hz. În proiectul meu de testare am folosit 120Hz. Cronometrul este setat la o frecvență de 1 MHz. Codul este procesat în întreruperea timer1. Întreruperea este apelată de 240 de ori pe secundă, deoarece există doi indicatori, așa că împingem 1000.000/240=4166 sau 0x1046 în registrul de comparație. Nu a fost posibil să asociați Proteus cu un indicator dinamic, dar a funcționat imediat pe hardware.

Notă!!! Când conectați un indicator, se recomandă atașarea unui rezistor de limitare a curentului la fiecare segment, mai degrabă decât unul comun. De asemenea, recomand conectarea firului indicator comun printr-un tranzistor, altfel puteți arde piciorul.

Pentru un circuit cu un anod comun

Pentru un circuit catod comun

Am folosit un cronometru dintr-un proiect anterior ca firmware de testare.

Video cu funcționarea firmware-ului

Actualizat 4/3/15. Salutare tuturor. În ultimul articol, ne-am uitat la algoritmul de comunicare cu LCD-ul, precum și la ieșirea de informații către acesta și l-am testat într-un simulator. În această postare, voi vorbi pe scurt despre o metodă „necostisitoare” de afișare a informațiilor - aceasta este indicator cu șapte segmente , care este cel mai simplu dintre indicatori, pentru afișarea cifrelor arabe, precum și a unor simboluri care pot fi afișate pe acesta. Vom lua în considerare, de asemenea, un program C pentru AVR și conexiune în hardware și simulator.

Pentru afișarea literelor, sunt utilizați indicatori mai complexi cu mai multe segmente și matrice. Dar aici vom vorbi despre șapte segmente... Vom lua în considerare și ceea ce este afișaj dinamic , ca o modalitate de a afișa instantaneu valoarea măsurată. Pentru a face acest lucru, vom lua în considerare utilizarea întreruperilor în program.
Deci, ar trebui să știți că indicatorii vin cu un anod și catod comun, ca în figura de mai jos. Aveam la îndemână un indicator cu un catod comun (partea de jos a figurii), a cărui ieșire de control este conectată la minus. Cu asta vom lucra.

Dacă există mai mulți indicatori, atunci catozii sunt controlați de mai multe picioare MK. !!! Dar folosiți întotdeauna tranzistori, pentru că... Porturile I/O se pot arde din cauza curentului relativ ridicat. Am folosit tranzistoare obișnuite 315. În figura de mai jos am arătat o legătură aproximativă, prin intermediul acestora, a ieșirii de control a indicatorului și a controlerului. Pentru instalare avem nevoie de 11 picioare de microcontroler, i.e. pentru a afișa informații pe segmente sunt 8 picioare (7 + punct) și câte un picior pentru fiecare indicator pentru a-l controla, am trei dintre ele, deci sunt și trei picioare de control. Mai jos am prezentat și descris programul. Pentru a controla segmentele, vom folosi pini de la un port, pentru a nu ne confunda. A scris pentru un microcontroler ATmega8 . Dacă doriți să scăpați de „piatră”, atunci aceasta nu este o problemă, de exemplu, în cazul în care puteți schimba cu ușurință setările pentru o altă „piatră”, în principal acestea sunt numerele de pin și porturi. Acolo sunt descrise și regulile generale de universalitate și transfer.

Desen al conectării unui tranzistor la un MK și un indicator.

Să trecem la program. În acest mic program (pe Si ) Am dat un exemplu de includere a trei elemente indicator și de ieșire a unui număr cu virgulă. Utilizarea unui temporizator și întrerupere pentru ieșirea către indicator. În timpul scrierii programului, trebuie să decidem ce pin de port ar trebui să corespundă segmentului de pe indicator. Elementul indicator în sine este prezentat în figura de mai jos. Pe partea laterală există o descriere a conectării știfturilor la segmentele elementului indicator (pinul portului – numărul piciorului elementului (Fig. de mai sus) – litera segmentului – numărul din matricea responsabilă de pornire segmentele de pe element).

PB0 - 12 - controlul primului element

PB6 - 9 - controlul celui de-al doilea element
PB7 - 8 - controlul celui de-al treilea element
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

#include
#include
#include
/*Să definim un element cu șapte segmente pentru fiecare pin de port (figura de mai sus)*/
#definiți un 128
#definiți b 32
#definiți de la 8
#definiți d 2
#define e 1
#definiți f 64
#definiți g 16
#define dp 4
/*Aceste macrocomenzi conțin numere corespunzătoare la două ridicate la putere,egal cu numărul „piciorului” portului la care segmentul indicator cuacelași nume ca macro-ul.*/
scurt fără semn int j, k = 0; /*variabilele sunt folosite în macro-ul de întrerupere*/
float i = 0; /*Variabilă pentru ieșire către indicator*/
scurt nesemnat int w = 0; /*Indicator variabil pentru pornirea punctului*/
Slot caracter nesemnat; /*O matrice care stochează numerele de care aveți nevoie
ieșire prin port către indicator, astfel încât acesta să arate o cifră egală cu numărul
element de matrice. Numerele depind doar de macrocomenzi.*/
void Slot_init() /*Funcția de inițializare a indicatorului*/
{
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); /*Numele macro corespund numelor segmentelor indice*/
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; /*Punct*/
}
/*Aceste variabile stochează numerele care trebuie afișate*/
char Elem1, Elem2, Elem3;
/* Funcția extrage cifre dintr-un număr format din trei cifre Număr */
void Display (număr flotant)
{
plutitor N1, N2; /*Variabile pentru funcția modf*/
N1 = modf(Număr, &N2); /* Împărțiți numărul în părți întregi și fracționale, N1 = fracționar N2 = întreg*/
dacă (N1 != 0) /*Dacă nu este egal cu zero, atunci există o fracție*/
{
Număr= Număr*10; /*apoi înmulțiți numărul cu 10, pentru o ieșire normală cuindicator de număr fracționar din trei cifre*/
w = 1; /* variabilă indicator care este utilizată în bucla de mai jos pentru a include punctul*/
}
short unsigned int Num1, Num2, Num3;
Num1=Num2=0;
în timp ce (Număr >= 100) /*Sute*/
{
Număr -= 100;
Num1++;
}
în timp ce (Număr >= 10) /*Zeci*/
{
Număr -= 10;
Num2++;
}
Num3 = Număr; /*Unități*/
Elem1 = Slot;
if (w == 1) /*Condiție pentru includerea unui punct pe al doilea element*/
{
Elem2 = (Slot|0×04); /*adăugare logică cu un pin corespunzător unui punct*/
w = 0; /*Opriți punctul*/
}
altfel
Elem2 = Slot;
Elem3 = Slot;
}
int main (void) /*începutul programului principal*/
{
DDRB = 0Xff; /*configurează toți pinii portului B ca ieșiri*/
DDRD = 0xff; /*configurează toți pinii portului D ca ieșiri*/
PORTD = 0×00; /*Setați 0*/
PORTB |= _BV(PB6);
PORTB |= _BV(PB0);
PORTB |= _BV(PB7);
slot_init();
sei(); /*Activează întreruperea generală*/
/*Inițializează cronometrul T0*/
TIMSK = (1</*T0 indicator de activare a depășirii cronometrului contor*/
TCCR0 = (0</* 1000000/8 = 125000= 125000/256 = 488,28 Hz */
în timp ce (1) /*Buclă fără sfârșit, afișați variabila pe indicator*/
{
_delay_ms(1000);
i=i+0,1;
dacă (i == 99,9)
i = 0,0;
afișaj(i);
} /*Consola de închidere a buclei fără sfârșit*/
} /*Paranteza de închidere a programului principal*/

Următorul pas este adăugarea unei funcții de întrerupere care va fi declanșată de un vector special TIMER0_OVF_vect, care este responsabil pentru întreruperile de depășire T0. Pentru aceasta folosim cronometrul/contorul hardware T0. Mai sus, în program am notat setările cronometrului și acolo am calculat și frecvența cu care va apărea afișarea dinamică. Acestea. Când registrul de numărare din contor este debordant, Programul general se oprește și funcția de mai jos este executată, după ieșirea din el se continuă execuția programului principal.

ISR (TIMER0_OVF_vect)
{
PORTB &= 0x3e; //Curăţare PB7, PB6, PB0
_pentru (j = 0; j<=30; j++) { } // Întârzierea opririi tranzistorului
(k == 3) ? k = 0: k++; /*Variabilă care este responsabilă pentru secvența de incendiuindicator cu trei elemente, 0,1 și 2. La un anumit număr, 1 este setat pe un anumit picior, apoi tranzistorul se deschide și segmentele indicatoare corespunzătoare variabilei Elemn se aprind */
comutator (k)
{
cazul 0: PORTB |= (1<< PINB7); // Unități
PORTD = Elem3;
pauză;
cazul 1: PORTB |= (1<< PINB6); // Zeci
PORTD = Elem2;
pauză;
cazul 2: PORTB |= (1<< PINB0); // Sute
PORTD = Elem1;
}
}

Programul de mai sus a fost testat în hardware și în simulator. Mai jos sunt imaginile în consecință. Am lipit totul în fier de călcat cu un baldachin, repede. După cum puteți vedea, există trei elemente indicator, respectiv trei tranzistoare (încercuit). Nu avem nevoie de tranzistori în simulator (Proteus). Există, de asemenea, o diferență semnificativă în program, și anume în întrerupere, unde hîntârziere pentru oprirea tranzistorului - introduceți 50 de cicluri de ceas în simulator. Totul ar trebui să funcționeze.

Pe măsură ce am publicat postări, programul nostru pentru indicator s-a schimbat puțin, și anume, am adăugat un al patrulea element, afișând pe el un semn minus, simbolurile „H” și „C”, formatul de ieșire a timpului și combinația tuturor modurilor. Deci citește, analizează și experimentează.

Mai jos sunt sursele și proiectul bazat pe materialul de mai sus.

(Descărcări: 795 persoane)

Asta e tot. În articolul următor voi descrie conectarea senzorilor de temperatură și voi afișa informațiile pe indicator. Pe curând!

Afișajul dinamic este utilizat pe scară largă pentru a afișa diverse informații, cum ar fi temperatura, tensiunea, ora sau pur și simplu numărul de declanșări ale dispozitivelor sau senzorilor. Afișajul dinamic de pe bază este perfect compatibil cu microcontrolere. Cu toate acestea, în literatura despre programarea microcontrolerelor AVR, această problemă este discutată foarte superficial și nu în fiecare carte dedicată subiectului relevant. Prin urmare, vom arunca o privire mai atentă asupra modului de conectare a unui indicator cu șapte segmente cu indicație dinamică la un microcontroler, în acest caz la ATmega8, dar analogia rămâne pentru AVR MK din orice serie.

În funcție de numărul de cifre (cifre), indicatorii dinamici cu șapte segmente sunt de o cifră, două cifre, trei cifre, patru cifre și foarte rar șase cifre. Ne vom concentra pe indicatorii cu patru cifre și șapte segmente ca tip de afișare dinamică cel mai frecvent utilizat. Sunt fabricate cu un anod comun și un catod comun. Diagramele de conectare pentru LED-urile segmentelor individuale sunt prezentate în figuri.

După cum se poate vedea din cifre, fiecare cifră, numită cifră, are propria sa ieșire separată comună în cadrul cifrei. Deoarece luăm în considerare o indicație dinamică de 4 cifre, există patru astfel de pini - digit1, digit2, digit3, digit4.

Pinout-ul indicatorului cu 4 cifre și șapte segmente este prezentat în figura de mai jos. În acest caz, vederea este afișată de sus, adică indicatorul nu trebuie răsturnat cu susul în jos.

Cum funcționează afișarea dinamică?

Acum să vedem cum funcționează un afișaj dinamic cu un catod comun. De exemplu, trebuie să afișăm numărul 1987. Pentru a face acest lucru, în primul moment, ar trebui să aplicăm un potențial ridicat anodilor segmentelor care formează unitatea - b și c și să aplicăm un potențial scăzut la catod comun al primei descărcări. Catozii comuni ai celor trei cifre rămase – digit2, digit3 și digit4 – rămân neconectați.

În al doilea moment de timp, segmentele care formează cifra 9 primesc putere, catodul comun al celei de-a doua cifre este conectat la negativ, iar cifra 1 pierde putere; digit2, digit3, ca și înainte, rămân neconectate.

În al treilea moment, numărul 8 de pe al treilea indicator se aprinde, iar indicatoarele rămase se sting.

În al patrulea moment de timp, ultimul indicator primește putere și este afișat numărul 7.

Apoi totul se repetă din nou. Când frecvența de comutare de la descărcare la descărcare este mai mare de 25 Hz, din cauza inerției luminoase a LED-urilor, ochii noștri nu au timp să observe cum se produce comutarea, așa că vizual percepem strălucirea integrală a tuturor descărcărilor simultan.

Schema de conectare a indicației dinamice la microcontroler ATmega 8

Vom conecta segmentele de indicație dinamică prin intermediul unor limitatoare de curent cu o valoare nominală de 330 Ohmi la pinii portului D al microcontrolerului ATmega8. Pinii corespunzători digit1, digit2, digit3, digit4 vor fi conectați prin tranzistoare de tip n-p-n, de exemplu BC547 sau 2n2222 la pinii portului B.

Algoritm pentru scrierea codului pentru conectarea afișajului dinamic

Pentru a face acțiunile mai specifice, vom folosi un indicator cu 4 cifre și șapte segmente cu un catod comun. Primul pas este să creați o matrice de numere de la 0 la 9. Am învățat deja acest lucru mai devreme, . Apoi, trebuie să împărțiți numărul din 4 cifre în patru cifre separate. De exemplu, numărul 1987 trebuie împărțit în 1, 9, 8 și 7. Apoi trebuie afișat unul în prima cifră a indicatorului, nouă în a doua, opt în a treia și șapte în a patra.

Printre mulți algoritmi de împărțire a unui număr cu mai multe cifre în numere individuale, vom folosi operațiile de împărțire și rest de împărțire. Să ne uităm la un exemplu:

1987/1000 → 1

1987%1000/100 → 9

1987%100/10 → 8

1987%10 → 7

În limbajul C când se utilizează un tip de date întreg int Când se efectuează împărțirea, toate zecimile, sutimile etc., adică toate numerele mai mici de unu sunt aruncate. Rămân doar numere întregi. Rotunjirea matematică nu funcționează aici, adică 1,9 în acest caz va fi 1, nu 2.

Comanda „restul diviziunii” este indicată de semnul procentului „ % " Această comandă elimină toate numerele întregi și lasă restul numărului. De exemplu, 1987%1000 → 987; 1987%100 → 87; 1987%10 → 7.

În continuare, ar trebui să scrieți o comandă care va afișa mai întâi prima cifră și numărul corespunzător, apoi, după o anumită perioadă de timp, a doua cifră și numărul corespunzător; și așa mai departe. Mai jos este codul cu comentarii.

COD

#defini F_CPU 1000000L

#include

#include

#define CHISLO PORTD

#define RAZRIAD PORTB

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

număr int nesemnat = (

// numere de la 0 la 10

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

};

void vse_chislo (unsigned int rabivka_chisla)

{

razr1 = rabivka_chisla/1000; // mii

razr2 = rabivka_chisla%1000/100; // sute

razr3 = rabivka_chisla%100/10; // zeci

razr4 = rabivka_chisla%10; // unități

}

int main(void)

{

DDRB = 0b00001111;

DDRD = 0b11111111;

RAZRIAD = 0b00000001; // inițial prima cifră

CHISLO = 0x3f; // numărul 0

în timp ce (1)

{

vse_chislo(1987); // afișează numărul

RAZRIAD = 0b00000001; // pornește prima cifră, dezactivează restul

CHISLO = chisla ; // afișează prima cifră

_delay_ms(3);

RAZRIAD = 0b00000010; // pornește a 2-a cifră, dezactivează restul

CHISLO = chisla ; // afișează a 2-a cifră

_delay_ms(3);

RAZRIAD = 0b00000100; // pornește a 3-a cifră, dezactivează restul

CHISLO = chisla ; // afișează a 3-a cifră

_delay_ms(3);

RAZRIAD = 0b00001000; // pornește a 4-a cifră, dezactivează restul

CHISLO = chisla ; // afișează a 4-a cifră

_delay_ms(3);

}

}

Îmbunătățirea programului de afișare dinamică

Algoritmul de mai sus este mai mult un algoritm de antrenament și, prin urmare, oarecum simplificat, dar apare și în programele care nu efectuează calcule rapide în timp real. Singurul dezavantaj al acestui algoritm este utilizarea întârzierilor, al căror impact negativ a fost discutat mai devreme. Pentru a scăpa de utilizarea întârzierilor, puteți utiliza întreruperi de la contoarele temporizatoare. În codul de mai jos, întârzierile sunt generate folosind un cronometru zero și apelând o întrerupere atunci când acest contor depășește.

Pentru a vă asigura că la fiecare întrerupere numerele sunt afișate secvenţial în fiecare cifră a indicatorului, a fost adăugată variabila bc547, care este mărită cu una la următoarea apelare a întreruperii ISR ​​(TIMER0_OVF_vect). Apoi valoarea variabilei bc547 este verificată și bitul corespunzător este alimentat cu putere. Când bc547 devine mai mare de patru, este resetat la unu.

DPentru a afișa un număr cu mai multe cifre pe indicator, trebuie mai întâi să efectuați o manipulare dificilă cu acesta, care constă în împărțirea numărului în componentele sale. Ca exemplu, voi da afișarea numărului 1234 pe un indicator quad cu șapte segmente cu un anod comun.


Pentru a afișa un număr din patru cifre, trebuie să creați o variabilă comună în care să se afle numărul pe care doriți să-l afișați (variabilă W), patru variabile în care vor fi stocate datele pentru fiecare semn (N) și încă patru variabile pentru transformări intermediare (M), pentru a nu atinge variabila principală. Variabila trebuie să corespundă valorii care va fi stocată în eaeu. Deci pentru variabilăWtipul va fi suficientîntreg , deoarece o variabilă de acest tip este capabilă să stochezeModificați valorile de la -32768 la +32767 (saucuvânt cu excepția cazului în care intenționați să utilizați numere negative). În variabileNvor exista numere de la 0 la 9, deci folosind o variabilă caoctet
. Și în variabileM va fiaceleași valori ca în variabilăW, așa că setăm tipul întreg .

Dim W ca număr întreg
Dim N1 ca octet
Dim N2 ca octet
Dim N3 ca octet
Dim N4 ca octet
Dim M1 ca întreg
Dim M2 ca întreg
Dim M3 ca întreg
Dim M4 ca întreg


După declararea variabilelor, configurăm porturile de ieșirecare va fi folosit pentru conectarea indicatorului:

DDRC = &B11111111
DDRD = &B11111111


DDRC =&B 00001111 și DDRD =&B 01111111 (patru primele etape ale portului Cpentru anozi și primele șase porturi D pentru segmente).

Apoi atribuim variabilei W valoarea pe care o vom afișa pe indicator:

W=1234

"Arial","sans-serif""> În bucla principală a programului atribuim valoarea variabilei variabilelor MW, eu fac asta:

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


"Arial","sans-serif""> Aceasta nu este paranoia)), acest lucru se face cu scopul ca toate variabilele M să conțină același număr, deoarece în timpul operației de atribuire o întrerupere poate intra cu ușurință (dacă există una și nu este dezactivată), în al cărui handler variabilW poti schimba. Și dacă sarcina a mers așa: M1= W, M2=W, M3=W, M4=W variabilele M vor conține valori diferite, ceea ce va duce la o dezordine în citiri.

După atribuirea de valori variabilelor, începem să lucrăm cu acestea
fiecare dintre ele, transformându-se în așa fel încât într-o variabilă N atinge valoarea care va fi
afisat pe indicator: intr-o variabila
N 1 ar trebui să fie „1”, în N 2 – „2”, în N 3 – „3”, iar în N 4 – „4”.

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

Abs – o funcție care returnează un număr întreg la o variabilă.La o variabilă N Am lovit unul, care este exact ceea ce era necesar.

Pentru a atribui un doi unei variabile N Operațiunea 2 va fi puțin mai complicată:

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""> Pentru început, funcțiaMod le revenim pe primele trei la variabilă
cifre ale numărului (restul împărțirii cu 1000), apoi totul este ca în primul caz.

Este aproape la fel cu ultimele două cifre:

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

M4 = M4 Mod 10
N4= Abs (m4)


Acum variabilele noastre conțin valorile pe care vrem să le afișăm, este timpul ca microcontrolerul să lovească cu picioarele și să afișeze aceste valori pe indicator, pentru a face acest lucru numim subrutină de procesare a afișajului:

"Arial","sans-serif"">

Gosub Led

"Arial","sans-serif""> Procesorul va trece la subrutina cu etichetaLED:

LED:

Portc = &B00001000

"Arial","sans-serif""> Aici servim un nivel înalt dePORTC .3, avem primul anod de categorie conectat la acest picior. Apoi alegem ce segmente trebuie aprinse pentru a afișa valoarea primei variabile. Ea este una pentru noi, așa că zero va fi pe picioarele ei Portd .1și Portd .2, care corespunde segmentelor Indicatorul B și C.

Selectați cazul N1









Încheierea selectării
Așteaptă 5

"Arial","sans-serif""> După ce segmentele necesare au fost aprinse, așteptați 5 ms și continuați la afișarea următoarelor numere:

Portc = &B00000100
Selectați cazul N2
Cazul 0 : Portd = &B11000000
Cazul 1: Portd = &B11111001
Cazul 2: Portd = &B10100100
Cazul 3: Portd = &B10110000
Cazul 4: Portd = &B10011001
Cazul 5: Portd = &B10010010
Cazul 6: Portd = &B10000010
Cazul 7: Portd = &B11111000
Cazul 8: Portd = &B10000000
Cazul 9: Portd = &B10010000
Încheierea selectării

Așteaptă 5

Portc = &B00000010

Selectați cazul N3
Cazul 0 : Portd = &B11000000
Cazul 1: Portd = &B11111001
Cazul 2: Portd = &B10100100
Cazul 3: Portd = &B10110000
Cazul 4: Portd = &B10011001
Cazul 5: Portd = &B10010010
Cazul 6: Portd = &B10000010
Cazul 7: Portd = &B11111000
Cazul 8: Portd = &B10000000
Cazul 9: Portd = &B10010000
Încheierea selectării

Așteaptă 5

Portc = &B00000001

Selectați cazul N4
Cazul 0 : Portd = &B11000000
Cazul 1: Portd = &B11111001
Cazul 2: Portd = &B10100100
Cazul 3: Portd = &B10110000
Cazul 4: Portd = &B10011001
Cazul 5: Portd = &B10010010
Cazul 6: Portd = &B10000010
Cazul 7: Portd = &B11111000
Cazul 8: Portd = &B10000000
Cazul 9: Portd = &B10010000
Încheierea selectării

Așteaptă 5

"Arial","sans-serif""> După afișarea informațiilor pe indicator, trebuie să reveniți la bucla principală a programului, unde trebuie să finalizați bucla și să indicați sfârșitul programului.

"Arial","sans-serif""> Iată ce obținem în final:

"Arial","sans-serif"">

"Arial","sans-serif""> Datorită întârzierii mici de comutare, comutarea nu va fi vizibilă pentru ochiul uman și vom vedea numărul întreg 1234.

Puteți descărca sursa și proiectul în Proteus mai jos:"Arial","sans-serif"">