Skocz do zawartości

Funkcja bitRead() i multipleksowanie wyświetlacza. Czy to takie trudne?


Silver_1

Pomocna odpowiedź

Hejka 🙂 na podstawie jednej książki zbudowałem układ multipleksowania wyświetlacza segmentowego, i on działa. Rozumiem mniej więcej o co chodzi w funkcji bitRead() ( zwraca 1 lub 0 ), ale w danym przykładzie w ogóle nie potrafię rozpracować co autor miał na myśli.. W książce jest to opisane bardzo po łebkach.

Oto kod:

 
    const int digitPins[]={2, 3, 4, 5};
    const int segPins[] = {6, 7, 8, 9, 10, 11, 12, 13};


//                     abcdefgD
    const int num[] { 0b11111100,   //0 abcdef
                       0b00001100,  //1 ef
                       0b11011010,  //2 ab de g
                       0b10011110,  //3 a defg
                       0b00101110,  //4 c efg
                       0b10110110,  //5 a cd fg
                       0b11110110,  //6 abcd fg
                       0b00011100,  //7 def
                       0b11111110,  //8 abcdefg
                       0b10111110}; //9 a cdefg

    int digits[] = {1, 2, 3, 4};
    void setup() {
           for(int i=0;i<4;i++){
            pinMode(digitPins[i], OUTPUT);// Ustaw wszystko jako wyjscie
           }
           for(int i=0;i<8;i++){
            pinMode(segPins[i], OUTPUT);// Ustaw wszystko jako wyjscie
            }
    
           
          
           for(int i=0;i<5;i++){  //ustaw LOW na sterujacych cyframi
            digitalWrite(digitPins[i], LOW);
           }
    }
    void loop(){refreshDisplay();}
  
    void refreshDisplay(){
    
     for(int d=0;d<4;d++){
      for(int seg=0;seg<8;seg++){
          digitalWrite(segPins[seg], LOW);
        }
          digitalWrite(digitPins[d], HIGH);
          for(int seg=0;seg<8;seg++){
          digitalWrite(segPins[seg], bitRead(num[digits[d]], 7-seg));
         }
          delay(1);
          digitalWrite(digitPins[d], LOW);
     }
   }

Tutaj jest wszystko zrozumiałe, jeśli chodzi o ustawianie wyjść czy tablice. Chodzi mi o tę linijkę:

digitalWrite(segPins[seg], bitRead(num[digits[d]], 7-seg));

jakby, nie rozumiem kiedy ta funkcja zwraca 1 a kiedy 0 w tym przykładzie, i dlaczego od 7 odejmuje się seg?  po co jest 7 wstawione w tym miejscu w ogóle.

Link do komentarza
Share on other sites

Dnia 6.02.2023 o 21:19, Silver_1 napisał:

i dlaczego od 7 odejmuje się seg?  po co jest 7 wstawione w tym miejscu w ogóle.

Żeby odwrócić kolejność odczytywania bitów. Dlatego magiczne funkcje psuja cała zabawę 🙂

bitRead rozwija się do czegoś w tym stylu:

(num[digits[d]] >> (7 - seg)) & 1

A co do kiedy zwraca 0 a kiedy 1, no wtedy kiedy bit (7 - seg) w num[digits[d]] jest ustawiony (1) lub nie (0).

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.