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

[C] [WinAvr] tablica funkcji

tsare 06 Cze 2010 13:44 1471 4
REKLAMA
  • #1 8161018
    tsare
    Poziom 13  
    Piszę sterownik pod matrycę LED. Napisałem sobie funkcje rysujące litery od lewej do prawej(przykład na końcu), kolejna litera rysowana od miejsca przesun.
    Wywołanie w main() wygląda przykładowo:
    {
    for(i=10;i>-20;i--)
    A(i,t[15]); //litera A na starcie w miejscu 10
    B(i+5,t[15]); // litera B na starcie w miejscu 15
    C(i+10,t[15]); // litera C ... 20
    ...
    }


    Zmienne i powoduje, że litery 'wędrują' po matrycy od prawej do lewej. t[15] jest tablicą adresów dla portu: { 0x00, 0x01, ... , 0x0A }
    Wszystko działa jak sobie zażyczyłem, ALE chcę stworzyć obsługę wpisywania liter poprzez mikroswitche bez późniejszej ingerencji w kod programu i przydała by mi się tablica funkcji, już piszę co mam na myśli

    char litery[30]={A(i,t[15]) , B (i,t[15]), C(i,t[15]), D(i+5,t[15]), ... }

    wtedy wybór litery polegał by głównie na inkrementacji jakiejś zmiennej przy użyciu µswitcha np. wywołanie litery[2]; litery[1]; litery[0]; powodowało by wyświetlenie napisu 'CBA'
    ... czego niestety w C zrobić nie można, tu moja prośba o podsunięcie pomysłu rozwiązania tego problemu w inny sposób, bo nie mam pomysłu ;/

    void A(char przesun, char t[])
    {
    if(przesun>15 || przesun <=0){PORTD=0xFF;PORTC=0x00;}
    else{
         PORTD=0X01;
         PORTC=t[1+przesun];
          _delay_us(750);
         PORTD=0xFA;
         PORTC=t[2+przesun];
          _delay_us(750);
         PORTD=0xFA;
         PORTC=t[3+przesun];
          _delay_us(750);
         PORTD=0x01;
         PORTC=t[4+przesun];
          _delay_us(750);
     }
    }
    
    void B(char przesun, char t[])
    {
    if(przesun>15 || przesun <=0){PORTD=0xFF;PORTC=0x00;}
    else{
         PORTD=0X00;
         PORTC=t[1+przesun];
          _delay_us(750);
         PORTD=0x0A;
         PORTC=t[2+przesun];
          _delay_us(750);
         PORTD=0x0A;
         PORTC=t[3+przesun];
          _delay_us(750);
         PORTD=0xF5;
         PORTC=t[4+przesun];
          _delay_us(750);
     }
    }
    
  • REKLAMA
  • #2 8161228
    tadzik85
    Poziom 38  
    Ciężko zrozumieć o co ci chodzi. Ale tablicę funkcji można zrobić w bardzo proty sposób. Poprzez wskaźniki wywoływane.
    Tablica zawiera adresu funkcji.
    Wskaźnikowi funkcji nadajesz odpowiednia wartość z tablicy.

    Wywołujesz funkcję.

    Poczytasz o wskaźnikach do funkcji i zrozumiesz.
  • REKLAMA
  • #3 8161267
    markosik20
    Poziom 33  
    I dla każdej litery masz osobną funkcję? 8-O .
    Nie lepiej jest zrobić jedną funkcję z parametrami (znak oraz jego pozycja)?
    Bo teraz musiałbyś operować na wskaźnikach (inkrementować lub dekrementować) do odpowiednich funkcji (liter), a wskaźniki to samych funkcji musiałyby znajdować się w tablicy.
  • REKLAMA
  • #4 8169662
    Freddie Chopin
    Specjalista - Mikrokontrolery
    OMG, ale wymysły... osobna funkcja dla każdego znaku... N/C [;

    Problem z gatunku wtórnych - problem ze sterowaniem switchami zrodził się dlatego, że wymyśliłeś najbardziej absurdalny sposób wyświetlania znaków na tej planecie...

    4\/3!!
  • #5 8171023
    rpal
    Poziom 27  
    A nie prościej jest zdefiniować odpowienio duzy bufor danych do wyświetlania a potem tylko zmieniać adres startu dla procedury wyświetlania matrycy LED ? Po co przepisywać dane pozorując ruch liter, szybciej jest zmieniać poczatkowy adres ich wyświetlania.
REKLAMA