logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Mega16] [C] Graficzny, modułowy wyświetlacz LED

Pilqrim 10 Lis 2010 18:12 1032 0
REKLAMA
  • #1 8726498
    Pilqrim
    Poziom 11  
    Witam.
    Złożyłem sobie wyświetlacz modułowy jak w linku niżej:
    http://cyfronika.com.pl/kityavt2010/avt5226.pdf
    Składa się on z 5 modułów wyposażonych w procesory ATMEGA8, które maja pracować jako urządzenia slave. Sterownikiem master miałby być procesor ATMEGA16.
    Niestety jestem kiepski w programowaniu i nie potrafię sobie poradzić z programem do sterownika.
    Zarys programu wygląda tak:
    
    /***********************************
    Zapisanie 8 bajtów do modułu wyświetlacza
    o adresie zawartym w argumencie adr.
    ***********************************/
    void WriteLed(char addr){
    char i=0;
    i2c_start();
    i2c_write(addr);//adres slave R/W=0
    i2c_write(BufPom[i++]);
    i2c_write(BufPom[i++]);
    i2c_write(BufPom[i++]);
    i2c_write(BufPom[i++]);
    i2c_write(BufPom[i++]);
    i2c_write(BufPom[i++]);
    i2c_write(BufPom[i++]);
    i2c_write(BufPom[i++]);
    i2c_stop();
    }
    
    /***********************************
    Zamiana bitów miejscami
    ***********************************/
    unsigned char ConvData(unsigned char data){
    char i,zn;
    zn=0;
    for(i=0;i<8;i++){
    if((data&0x80)==0x80)
    zn|=0x80;
    data<<=1;
    zn>>=1;}
    return(zn);
    }
    
    /***********************************
    Zapisywanie pamięci wyświetlacza wzorcami znaków
    ***********************************/
    void DispChar(char code){
    int code_point;
    code_point=((int)code*6);//wyliczenie początku defi nicji znaku
    w tablicy
    BufPom[0]=ConvData(rom_gen[code_point++]);
    BufPom[1]=ConvData(rom_gen[code_point++]);
    BufPom[2]=ConvData(rom_gen[code_point++]);
    BufPom[3]=ConvData(rom_gen[code_point++]);
    BufPom[4]=ConvData(rom_gen[code_point++]);
    BufPom[5]=ConvData(rom_gen[code_point]);
    }
    
    /***********************************
    Pobranie wzorca znaków z tablicy generatora
    ***********************************/
    void DispLed(const char *s){
    char i,j;
    j=0;
    for(i=0;i<MAXBUF;i++)//czyszczenie bufora
    BufString[i]=0;
    while(*s){
    DispChar(*s++);
    for(i=0;i<6;i++)
    BufString[j++]=BufPom[i];
    }
    }
    
    
    /***********************************
    Zapisanie bufora do 5 segmentów wyświetlacza
    ***********************************/
    void SendDisp(char st){
    char i,k;
    char pom[8];
    for(i=0;i<5;i++)
    {
    for(k=0;k<8;k++)
    {BufPom[k]=BufString[st++];
    if(st==MAXBUF)
    st=0;
    }
    WriteLed(i*0x10+0x10);
    }
    }


    Z tego co udało mi się wywnioskować nie jest to pełny program. Jak się domyślam muszę zdefiniować zmienne oraz stworzyć coś na wzór tablicy, w której będą zapisane znaki. Procedura "Zamiana bitów miejscami", jak sądzę, była użyta przez autora dlatego, że miał odwrotnie zdefiniowaną tablicę znaków, niż ta potrzebna do zaświecenia na matrycy. Pozostaje również kwestia wysłania na sterownik tego co chciałbym aby zostało wyświetlone.

    Czy ktoś z Was robił coś podobnego i potrafiłby mi pomoc napisać taki program?
    Pozdrawiam i z góry dziękuje za odpowiedzi.
  • REKLAMA
REKLAMA