Sari la conținut
ELFORUM - Forumul electronistilor

MATRICE LED 8X8


Vizitator

Postări Recomandate

Salutare, doresc sa realizez un program, în care doresc sa se afiseze pe un led 8x8, numerele de la 1 la 9 (numerele sa stea aprinse un interval de 1sec).

Codul pentru a afisa numarul 1 este: 

void main() {
        TRISB = 0;  //initializez portul B
        TRISD = 0;  //initializez portul D
        PORTB = 0;  //setez liniile portului B ca iesiri
        PORTD = 0;  //setez liniile portului D ca iesiri

        while(1){
        //numarul 1
        PORTB = 0x08; PORTD = 0x00; Delay_ms(1);
        PORTB = 0x10; PORTD = 0xBF; Delay_ms(1);
        PORTB = 0x20; PORTD = 0xDF; Delay_ms(1);
        //numarul 2

}
}

Cum as putea afisa dupa numarul 1, numarul 2, mentionez ca sta incontinuu afisat? Am pus 

PORTB = 0x00; PORTD = 0xFF; Delay_ms(1000);

Dar nu apuc sa vizulizez deloc numarul 1, deoarece dispare imediat.

Va multumesc.

pic.png

Editat de Vizitator
Link spre comentariu
  • Răspunsuri 9
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Zile populare

Top autori în acest subiect

Imagini postate

Salut,

  Matricea este multiplexata prin urmare orice fel de delay o sa faca sa dispara numarul 1. Cea mai buna solutie este sa te folosesti de timer0 si sa faci acel delay cu ajutorul timer-ului in loc de delay care este blocanta. Daca imi zici la ce frecventa lucreaza PIC-ul sa pot calula valorile necesare pt timer0 o sa iti fac un mic exemplu.

Link spre comentariu

Ii sta aprins si 2 ul doar ca el vrea sa fie afisat 1 timp de 1s dupa care sa ii stea afisat 2 timp de 1s etc...  E o matrice simpla cu catod sau anod comun nu conteaza... Numarul 1 este afisat pe 3 coloane de acolo si cele 3 linii de cod cu cate 1ms delay intre.

 

 PORTB = 0x08; PORTD = 0x00; Delay_ms(1); // Afiseaza prima coloana 
 PORTB = 0x10; PORTD = 0xBF; Delay_ms(1); // Afiseaza a doua coloana
 PORTB = 0x20; PORTD = 0xDF; Delay_ms(1); // Afiseaza a treia coloana

Cum stim despre orice fel de display care este multiplexat fie matrice fie 7 segmente etc... intre segmente sau coloane trebuie sa fie un delay mai mic de 50Hz.. orice valoare mai mare de delay intre si o sa vezi efectul de flicker.  El daca puna delay de 1000ms sau 1 secunda normal ca ii dispare numarul 1 pentru ca timp de 1secunda din cele 3 coloane necesare afisarii o sa stea aprins unu-l singur..    Lui ii trebuie o functie care schimba coloana de afisare din cele 8 la intervale de 1ms iar orice alta temporizare trebuie facuta prin timer sa nu afecteze functia de afisare care trebuie sa ruleze continu. 

Editat de Bandi Szasz
Link spre comentariu

Da, n-am pierdut prea mult timp cu ganditul la functionarea matricei. Tu zici ca trebuie ceva de genul

while(1){
   //numarul 1
   for(int i = 0; i < 333; i++) { //timp de 1 secunda (333 * 3 ms) afiseaza 1
      PORTB = 0x08; PORTD = 0x00; Delay_ms(1);
      PORTB = 0x10; PORTD = 0xBF; Delay_ms(1);
      PORTB = 0x20; PORTD = 0xDF; Delay_ms(1);
   }
   
   //numarul 2
   for(int i = 0; i < 333; i++) { //timp de 1 secunda (333 * 3 ms) afiseaza 2
      // cod pentru 2
   }
                          

Codul e blocant, stiu, era numai pe post de "am inteles?".

Link spre comentariu

Exact, este si mai simplu doar ca in functie de cate coloane are trebuie sa recalculeze cate iteratii sa aiba "for" urile, de acea sugeram sa configuram timer0 la 1ms si la fiecare intrerupere sa incrementam o variabila "millis" si cand au trecut 1000ms sa incrementam o alta variabila care sa indice numarul dorit care sa fie verificat prin "if" uri (exact cum este si functia millis in arduino ). Urmatorul pas ar fi sa fie stocate valorile necesare pentru PORTB si PORTD intr-o lista si atunci nici de if-uri nu mai este nevoie.  

 

 

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări