Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

obsługa klawiatury matrycowej

17 Gru 2012 16:28 2625 16
  • Poziom 14  
    Poniżej mam taki oto kawałek programu, czy może mi ktoś wyjaśnić krok po kroku jak działa to skanowanie klawiatury od poczatku while do funkcji switch. Co to jest to upperNibble, jakaś maska czy coś takiego? Dziękuje bardzo
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Specjalista - Mikrokontrolery
    1. Aktywacja wiersza klawiatury.
    2. Odczyt stanu kolumn dla tego wiersza.

    Resztą bym się nie przejmował, bo to w zasadzie nie działa. Klawiatury nie skanuje się w pętli, tylko na przerwaniach. Tak, jak to jest zrobione, jakakolwiek reakcja na klawisz następuje po zwolnieniu go, co jest strasznie wkurzające dla użytkownika.

    Kod jest ciekawy dydaktycznie, bo prezentuje m.in.:
    - jak nie należy skanować klawiatury
    - jak nie eliminować drgań przycisków
    - jak wkurzyć użytkownika tym, że program nie reaguje na naciśnięcie przycisku
    - do czego nie należy używać instrukcji switch.

  • Poziom 17  
    Kiedy zaczynałem historię z programowaniem napisałem sobie taką mikro biblioteczkę do obsługi klawiatury 4x4 dla AVRów jak w załączniku.
    Wystarczy podpisać trzy makra _KBY. Np. dla portu D:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Raz wywołujemy funkcję init_4x4_kbr.
    A potem wywołujemy kiedy chcemy funkcję check_kbr, która jeśli wybrano któryś klawisz zwraca wartość od 1 do 16 a jeśli nie wybrano, zwraca 0.
    Załączniki:
  • Poziom 14  
    Czy takie rozwiązanie jak wyżej podał eleproject jest ok a jeśli nie to jak zrobić obsługę klawiatury przy użyciu przerwania?
  • Specjalista - Mikrokontrolery
    Gorzej, że jak się jej nie wywoła z przerwania timera, to działanie całości zależy od czasu potrzebnego na reakcję na klawisz, bo brakuje eliminacji drgań.
    Ja bym to puszczał w przerwaniu timera co 10..20 ms i uznawał klawisz za wciśnięty po dwóch takich samych odczytach. To by było w miarę prosto i jakoś by działało.
  • Moderator Mikrokontrolery Projektowanie
    wojtektorr napisał:
    Czy takie rozwiązanie jak wyżej podał eleproject jest ok a jeśli nie to jak zrobić obsługę klawiatury przy użyciu przerwania?


    Ściągnij przykłądy z mojej stopki, tam masz obsługę takiej klawiatury. Niemniej najpierw wartoby pogooglać za artykułami poświęconymi klawiaturze matrycowej. Albo odwrotnie - zobacz na czym polega np. multipleksowe sterowanie wyświetlaczem, obsługa klawiatury w 75% jest taka sama, te 25% to zmiana pewnychpinów z out na in.
  • Poziom 14  
    Natknąłem sie na jeszcze jeden problem a mianowicie, nie mogę zmienić połączeń w układzie miedzy procesorem a klawiaturą a mam wy z klawiatury nie po koleii (np. pin2, pin4,pin5 na klawiaturze to wiersze) dlatego nie mogę zastosować petli for jak w pierwszym przykładzie na samej górze? Jak rozwiazac tu ta inkrementacje?

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Specjalista - Mikrokontrolery
    możesz zastosować pętlę, np tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Na AVR wypadałoby w deklaracji tablicy użyć jeszcze zaklęcia PROGMEM, a przy dostępie do niej pseudofunkcji dostępu do pamięci programu. Szczęśliwie już zapomniałem, jak to się robi, bo dawno przesiadłem się na tańsze i łatwiejsze w programowaniu 32-bitowce.
  • Poziom 14  
    Hmm nie bardzo rozumiem, może podam konkretny przykład obsługi klawiatury i na tym przykładzie napiszesz jak to ma wyglądać?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie wypisuje mi 1,2,6,9,* i 0
  • Specjalista - Mikrokontrolery
    Konkretnie, to jest to źle. Jak często jest zgłaszane przerwanie od tego timera? W jednym przerwaniu powinieneś sprawdzić jeden wiersz klawiatury, w następnym następny itd. W tablicy rowsel trzymasz maski zawierające po jednym bicie o wartości 0, np. 0b11111110, 0b11111011, 0b11101111, 0b10111111, gdyby wiersze klawiatury były na liniach portu o numerach 0, 2, 4 i 6.
    W obsłudze przerwania nie powinno być już żadnych opóźnień programowych (delay).
  • Poziom 14  
    skanowanie klawiatury ustawiłem pod przerwanie do wyświetlacza segmentowego tj.:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czy mogę prosić o konkretny przykład obsługi takiej klawiatury w przerwaniu? Na etapie mojej edukacji mogę sobie sam nie poradzić.
  • Specjalista - Mikrokontrolery
    Powtórzę pytanie: Jak często jest zgłaszane przerwanie od tego timera?
  • Poziom 14  
    Przerwanie występuje ok 240 razy na sekunde
  • Specjalista - Mikrokontrolery
    240 Hz na dwie cyfry na wyświetlaczu powinno być ok. ;)

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Pomocny post

    Poziom 17  
    Jednocześnie z biblioteczką, którą zamieściłem wcześniej, stworzyłem kiedyś, biblioteczkę do obsługi klawiatury 4x4 w której wszystkie kolumny i wiersze mogą być podłączone do dowolnych nóżek procesora AVR. Nie musi to być jeden port i nie musi być zachowana żadna kolejność.
    W załączniku zamieszczam omawiany kod źródłowy.
    Wystarczy tylko wypełnić makra _Kx i Kx (dla kolumn) oraz _Wx i Wx (dla wierszy). Np. dla wiersza 1 podłączonego do pinu 4 portu D:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a np. dla kolumny 4 podłączonej do pinu 3 portu C:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Teraz, podobnie jak ostatnio - raz tylko na początku wywołujemy funkcję init_4x4_kbr.
    Następnie wywołujemy kiedy chcemy funkcję check_kbr, która jeśli wybrano któryś klawisz zwraca wartość od 1 do 16 a jeśli nie wybrano, zwraca 0.
    Biblioteka pozwala na pełną dowolność w podłączeniu klawiatury do procesora.
    Załączniki:
  • Poziom 14  
    Dzieki wielkie za pomoc a w swoim programie zastosowałem takie oto rozwiązanie, funkcje te wywołuje w przerwaniu:

    Kod: c
    Zaloguj się, aby zobaczyć kod