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

obsługa klawiatury matrycowej

wojtektorr 17 Gru 2012 16:28 2343 16
  • #1 17 Gru 2012 16:28
    wojtektorr
    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

    1 16
  • #2 17 Gru 2012 16:40
    BlueDraco
    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.

    0
  • #3 17 Gru 2012 18:27
    eleproject

    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.

    0
    Załączniki:
  • #4 17 Gru 2012 18:39
    wojtektorr
    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?

    0
  • #5 17 Gru 2012 18:46
    eleproject

    Poziom 17  

    Zawsze możesz z funkcji przerwania od timera wywoływać funkcję check_kbr.

    0
  • #6 17 Gru 2012 19:10
    BlueDraco
    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.

    0
  • #7 17 Gru 2012 20:15
    tmf
    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.

    0
  • #8 18 Gru 2012 17:35
    wojtektorr
    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

    0
  • #9 18 Gru 2012 18:14
    BlueDraco
    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.

    0
  • #10 18 Gru 2012 18:24
    wojtektorr
    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

    0
  • #11 18 Gru 2012 19:16
    BlueDraco
    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).

    0
  • #12 18 Gru 2012 19:21
    wojtektorr
    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ć.

    0
  • #13 18 Gru 2012 19:55
    BlueDraco
    Specjalista - Mikrokontrolery

    Powtórzę pytanie: Jak często jest zgłaszane przerwanie od tego timera?

    0
  • #14 18 Gru 2012 20:01
    wojtektorr
    Poziom 14  

    Przerwanie występuje ok 240 razy na sekunde

    0
  • #15 18 Gru 2012 21:48
    BlueDraco
    Specjalista - Mikrokontrolery

    240 Hz na dwie cyfry na wyświetlaczu powinno być ok. ;)

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #16 20 Gru 2012 17:29
    eleproject

    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.

    0
    Załączniki:
  • #17 20 Gru 2012 20:07
    wojtektorr
    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

    0