Witam
Doszedłem do rozdziału w książce traktującego o obsłudze klawiszy typu micro-switch. No i nie mogę zrozumieć jednej rzeczy w funkcji sprawdzania, czy klawisz został wciśnięty, czy nie został wciśnięty (chodzi o listing ze strony 179).
Dla ułatwienia podam może cały kod:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wszystko dotyczy makrodefinicji o następującej składni:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Mój tok rozumowania jest następujący:
Makro ma sprawdzać, czy występuje jedna z dwóch możliwości:
1. przycisk wciśnięty, a więc na pinie PC6 występuje stan niski
2. przycisk NIE wciśnięty, a więc na pinie PC6 występuje stan wysoki
Ponieważ chyba nigdzie wcześniej nie wystąpił opis dotyczący "zwrotu" PINC, sprawdziłem w nocie ATmegi 32, że o ile dobrze odczytałem angielski opis, jest to jedno-bajtowy rejestr tylko do odczytu zwracający wartość jaką przyjmuje PORT C.
Tak więc idąc tym tropem rozpisałem dwie możliwości, jakie może przyjąć powyższa makrodefinicja:
1. Dla wciśniętego przycisku wartości poszczególnych bajtów wynoszą:PINC 0b 0000 0000
(1<<PC6) 0b 0100 0000 następnie wykonywany jest bitowy iloczyn logiczny
AND 0b 0000 0000 wynik iloczynu, po czym jego negacja
! 0b 1111 1111
Czyli wartość całego wyrażenia wynosi 0b1111 1111.
2. Dla NIE wciśniętego przycisku wartości poszczególnych bajtów wynoszą:PINC 0b 0100 0000
(1<<PC6) 0b 0100 0000 następnie wykonywany jest bitowy iloczyn logiczny
AND 0b 0100 0000 wynik iloczynu, po czym jego negacja
! 0b 1011 1111
Czyli wartość całego wyrażenia wynosi 0b1011 1111.
No i teraz prawdopodobnie gdzieś robię błąd w logice moich rozważań, gdyż w dalszej części programu występuje pętla główna, a w niej warunek:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
I tego nie mogę zrozumieć:Warunek przyjmuje albo argument 1, czyli PRAWDA, albo argument 0, czyli FAŁSZ. Ale jeśli wartość wyrażenia, które wcześniej wyliczyliśmy ma wartość całego bajtu, to w takim razie warunek zawsze jest prawdziwy, bo wartość tego bajtu jest w każdym przypadku większa od 0.
Z tego wynika, że w tym przypadku warunek ten zawsze ma być prawdziwy, czy tak?
Czy ktoś może mi to łopatologicznie wyłożyć? Z góry dziękuję.