Witam,
Korzystam z klawiatury matrycowej (membranowej) 4x4. Niestety nie mogę zamieścić linku, ale łatwo ją znaleźć, np. na botlandzie pod hasłem klawiatura numeryczna membranowa - 16 klawiszy. Postanowiłem, że napiszę prosty kod do obsługi tej klawiatury, jednak po drodze napotkałem na błąd. Zakomentowana instrukcja switch(PINB) w funkcji pobierz_klawisz() działa poprawnie jednak jest dość długa i chciałem ją skrócić. Powstała instrukcja switch(PINB & 0x0F), która jednak nie działa poprawnie. Otóż wciskając na klawiaturze przycisk oznaczony numerem 1, funkcja pobierz_klawisz() powinna zwrócić wartość 1, a zwraca 2, wciskając 2 jest 3, wciskając 3 jest 4, a wciskając A jest 1. Taka sytuacja z przesunięciem pierwszej kolumny na koniec jest w każdym wierszu. Wciskając przycisk od góry powinno być:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
a jest:
2 3 4 1
6 7 8 5
10 11 12 9
14 15 16 13
Wiersze klawiatury podłączone są do PB0, PB1, PB2 i PB3 (wejścia), a kolumny do PB4, PB5, PB6 i PB7 (wyjścia). Sprawdzałem kilka razy połączenie czy aby na pewno jest dobrze, ale z zakomentowaną instrukcją switch działało poprawnie więc to chyba nie tu trzeba szukać winnego. Nie wiem czemu tak się dzieje. Uczę się dopiero programować, dlatego proszę o wyrozumiałość bo mój kod może być daleki od idealnego. Korzystam ze środowiska AtmelStudio 7 i bibliotek Procyon AVRlib (choć to w tym przypadku raczej mało istotne). Będę wdzięczny jeśli ktoś byłby mi w stanie wyjaśnić co źle robię albo czemu tak się dzieje.
Korzystam z klawiatury matrycowej (membranowej) 4x4. Niestety nie mogę zamieścić linku, ale łatwo ją znaleźć, np. na botlandzie pod hasłem klawiatura numeryczna membranowa - 16 klawiszy. Postanowiłem, że napiszę prosty kod do obsługi tej klawiatury, jednak po drodze napotkałem na błąd. Zakomentowana instrukcja switch(PINB) w funkcji pobierz_klawisz() działa poprawnie jednak jest dość długa i chciałem ją skrócić. Powstała instrukcja switch(PINB & 0x0F), która jednak nie działa poprawnie. Otóż wciskając na klawiaturze przycisk oznaczony numerem 1, funkcja pobierz_klawisz() powinna zwrócić wartość 1, a zwraca 2, wciskając 2 jest 3, wciskając 3 jest 4, a wciskając A jest 1. Taka sytuacja z przesunięciem pierwszej kolumny na koniec jest w każdym wierszu. Wciskając przycisk od góry powinno być:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
a jest:
2 3 4 1
6 7 8 5
10 11 12 9
14 15 16 13
Wiersze klawiatury podłączone są do PB0, PB1, PB2 i PB3 (wejścia), a kolumny do PB4, PB5, PB6 i PB7 (wyjścia). Sprawdzałem kilka razy połączenie czy aby na pewno jest dobrze, ale z zakomentowaną instrukcją switch działało poprawnie więc to chyba nie tu trzeba szukać winnego. Nie wiem czemu tak się dzieje. Uczę się dopiero programować, dlatego proszę o wyrozumiałość bo mój kod może być daleki od idealnego. Korzystam ze środowiska AtmelStudio 7 i bibliotek Procyon AVRlib (choć to w tym przypadku raczej mało istotne). Będę wdzięczny jeśli ktoś byłby mi w stanie wyjaśnić co źle robię albo czemu tak się dzieje.
Kod: C / C++