Dlaczego zapisujemy: PORTA = ~bajt; ?
Ano dlatego, że jeśli zapisalibyśmy PORTA = bajt; to na port A (PORTA) wystawimy (przypiszemy) wartość zmiennej bajt, prawda?
Czyli jeśli bajt = 0b00001111; to na porcie A cztery najstarsze bity przyjmą wartość 0, a cztery najmłodsze wartość 1.
Teraz jeśli diody LED podłączone są anodami do mikrokontrolera, a katodami (oczywiście poprzez rezystory ograniczające prąd) do masy to cztery diody podłączone do PA7, PA6, PA5 i PA4 nie będą się świeciły, za to diody podłączone do PA3, PA2, PA1 i PA0 zaświecą się.
Inaczej jest gdy diody podłączone są odwrotnie, czyli katodami do mikrokontrolera, a anodami (również poprzez rezystory ograniczające prąd) tym razem do Vcc. Teraz diody od PA7 do PA4 będą się świeciły, a cztery pozostałe nie będą.
Dlatego używamy operatora negacji "~" i zapisujemy PORTA = ~bajt;, by diody świeciły się zgodnie z założeniem, że "1" oznacza świecenie, a "0" oznacza nieświecenie.
Dla potwierdzenia zamiast PORTA = ~bajt; napisz PORTA = bajt;, skompiluj i wgraj program do procka. Zobacz co się będzie działo.
Mam nadzieję, że jest to dla ciebie jasne.
Dlaczego zapisujemy PORTA = ~bajt; raz na górze (przesunięcie w lewo) a raz na dole (przesunięcie w prawo)?
A jakie jest założenie programu (programisty)? No przecież to ty sam wymyśliłeś, by diody przesuwały się (zaświecały się po kolei) od prawej strony do lewej przy czym gdy wszystkie osiem diod będą się już świeciły, to w kolejnym kroku mają wszystkie zgasnąć. Z kolei w następnym kroku znowu zaświeci się pierwsza dioda LED itd., prawda?
Przygotowałem dwie tabelki (pierwsza dla przesunięcia w prawo, druga dla przesunięcie w lewo). Zapomnij na razie w jednym i drugim przypadku o kolumnie zawierającej właśnie PORT = ~bajt; i sprawdź czy wszystko się zgadza. Teraz przypomnij sobie jaki chcesz osiągnąć rezultat (jak te biedne diody LED mają się zachowywać).
W którym miejscu umieściłbyś teraz tą linijkę kodu, tak aby diody świeciły i gasły prawidłowo?
Za pomocą "metody wojskowej" chciałem ci pokazać, że wykorzystując mechanizm przesunięć bitowych można osiągnąć w tym przypadku to samo co za pomocą metody tablicowej.
Różnica jest taka, że zamiast tablicy zawierającej 9 zmiennych uint8_t, definiujemy tylko jedną zmienną np. uint8_t bajt i właśnie na niej dokonujemy wszystkie "operacje", czyli przesunięcie bitowe w lewo lub w prawo, bądź inkrementację tej zmiennej.
Proponuję dla odmiany teraz taki kodzik (od prawej do lewej):
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Też działa prawidłowo, chociaż wygląda prościej, prawda?
Przeanalizuj go sobie. Zauważ, że zasada działania tego programu, jego algorytm jest bardzo podobny do tego z wykorzystaniem "metody wojskowej" od prawej do lewej. Tylko tutaj trzeba było zadbać o gaszenie diod LED za pomocą dodatkowego warunku if.
A co zrobić, by na podstawie tego kodu powyżej, teraz diody przesuwały się od lewej do prawej?
@Daro69
Damy radę.
