logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Klawiatura matrycowa 4x4 na Atmega 16 - eliminacja powtarzających się znaków

karols 28 Kwi 2007 20:41 2688 6
REKLAMA
  • #1 3830142
    karols
    Poziom 10  
    Posty: 44
    Ocena: 2
    Mam problem z klawiaturą matrycową i instrukcją getkbd w Bascom Avr (Atmega 16)
    Klawiatura matrycowa 4x4 jest podłączona do portu D. Odczytywanie pojedyńczych znaków i konwersja działa.
    Chciałbym wprowadzać z tej klawiatury kody wielocyfrowe, napisałem odpowiednia procedurę opartą o zapis kolejnych cyfr do tablicy - ogólnie wszystko jest OK. (przy szybkim naciskaniu klawiszy) , ale jak dłużej przytrzymam klawisz do tablicy jako kilka znaków zapisywana jest ta sama wartość. Jak się tego pozbyć ?
  • REKLAMA
  • #2 3830351
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    karols napisał:
    ...Chciałbym wprowadzać z tej klawiatury kody wielocyfrowe, napisałem odpowiednia procedurę opartą o zapis kolejnych cyfr do tablicy - ogólnie wszystko jest OK. (przy szybkim naciskaniu klawiszy) , ale jak dłużej przytrzymam klawisz do tablicy jako kilka znaków zapisywana jest ta sama wartość. Jak się tego pozbyć ?

    CONFIG KBD = PORTx , DEBOUNCE = value [, DELAY = value] ,
    lub własnoręcznie napisana procedura pobierania kodu klawisza.
    Możesz sam zdecydować , czy klawiatura będzie REPEAT , czy też nie.
    Wszystko zależy od inwencji i umiejętności programującego :D

    Piotrek
  • REKLAMA
  • #3 3830714
    karols
    Poziom 10  
    Posty: 44
    Ocena: 2
    Eksperymentowałem z ustawieniami config kbd jest lepiej ale to jeszcze nie to co bym chciał aby było.
  • REKLAMA
  • Pomocny post
    #4 3831552
    JollyRoger
    Poziom 21  
    Posty: 538
    Pomógł: 21
    Ocena: 30
    Procedura getkbd zwraca 0 gdy nie naciśniesz zadnego klawisza (albo jakas inna wartosc). Musisz zrobić tak, aby po naciśnieciu dowolnego klawisza program czekal na wartosc 0 a dopiero pozniej jezeli odbierze jakas wartosc to niech zapisuje to do tablicy.

    Np:
    
    dim x as byte
    dim i as bit
    
    do
    x=getkbd
    if x= 0 then i=0 
    end if
    
    if x<>0 and i =0 then
    tablica=x 'tutaj zapis kolejnej cyfry do tablicy
    i=1
    end if
    loop
    

    (dawno nie pisalem w bascomie, ale idea jest chyba jasna. oczywiscie musisz jescze wyeliminowac drgania stykow)
  • REKLAMA
  • #5 3881938
    karols
    Poziom 10  
    Posty: 44
    Ocena: 2
    Zwalczyłem temat, dzięki za podpowiedzi.
  • #6 11565174
    Konto nie istnieje
    Poziom 1  
  • #7 11698658
    Sinisther
    Poziom 10  
    Posty: 14
    Ocena: 2
    Powiem Ci tak. Nie wiem po kiego jest taki wielki ten kod i nie rozumiem czemu ludzie męczą się z bascomem i avr ja mam 1/3 tego co tu i mi działa klawiatura z wyjątkiem jednej rzeczy której nie umiem zmienić.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    kompletnie nie rozumiem tego kodu hexowego. Ciężko się połapać w tym co w ogóle tam pisze i trzeba się na tym skupić (pomijając jakichś wyjadaczy). Mój kod jest jasny i zrozumiały, a jak zrobię w końcu schemat to w ogóle będzie pięknie :D
    P.S. a kody wielocyfrowe polecam zrobić na tablicach. Bynajmniej we wcześniejszym projekcie na 4 switchach miałem na tablicach i bardzo ładnie działało.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu eliminacji powtarzających się znaków podczas dłuższego przytrzymania klawisza na klawiaturze matrycowej 4x4 podłączonej do mikrokontrolera Atmega16 i obsługiwanej w Bascom AVR za pomocą procedury getkbd. Problem polega na tym, że przytrzymanie klawisza powoduje wielokrotne zapisywanie tej samej wartości do tablicy. Rozwiązaniem jest implementacja mechanizmu wykrywania stanu klawisza, który wymaga oczekiwania na zwolnienie klawisza (wartość 0 zwracana przez getkbd) przed ponownym zapisem kolejnego znaku. Dodatkowo sugerowano stosowanie konfiguracji CONFIG KBD z parametrem DEBOUNCE oraz własnoręczne procedury odczytu klawiszy, co pozwala kontrolować funkcję powtarzania znaków (repeat). W dyskusji pojawiły się także przykłady kodów w Bascom AVR i Arduino, gdzie stosuje się flagę stanu klawisza, aby zapobiec wielokrotnemu rejestrowaniu tego samego naciśnięcia. Poruszono również kwestie eliminacji drgań styków (debounce) jako istotny element poprawnego odczytu. W dalszej części dyskusji pojawiły się fragmenty kodu w C dla Atmega16 z wykorzystaniem portów i konfiguracji pinów do obsługi klawiatury matrycowej oraz przykłady implementacji w Arduino, podkreślając różnice w podejściu do obsługi klawiatury i debouncingu.
Wygenerowane przez model językowy.
REKLAMA