Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
Guest

MATRICE LED 8X8

Recommended Posts

Guest

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

Edited by Guest

Share this post


Link to post
Share on other sites

Ai incercat sa pui

Delay_ms(1000);

dupa ce "scrii" 1 si inainte sa "stergi ecranul"/sa scrii 2?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Eu as zice sa posteze tot programul, ca daca 1 nu sta aprins cu nici un delay, nu vad de ce ar sta 2 aprins.

 

LE Sau foaia de catalog a matricei.

Edited by Liviu M

Share this post


Link to post
Share on other sites

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. 

Edited by Bandi Szasz

Share this post


Link to post
Share on other sites

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?".

Share this post


Link to post
Share on other sites

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.  

 

 

Share this post


Link to post
Share on other sites
Guest

Am reusit sa rezolv problema. Multumesc pentru ajutor.

Share this post


Link to post
Share on other sites

Pai posteaza si solutia. Urmatorul care va avea aceeasi problema si va cauta pe forum va gasi solutia fara sa mai intrebe.

Share this post


Link to post
Share on other sites

N-o sa vedeti solutia. Sa ceri ajutor e foarte usor dar sa postezi ceva functional/rezolvat e mai greu.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.