Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Problem z klawiaturą matrycową

kamil232
-
-
Posty: 11
Rejestracja: 15 kwie 2008, o 17:57
Lokalizacja: Warszawa

Problem z klawiaturą matrycową

Postautor: kamil232 » 15 kwie 2008, o 18:40

Witam.Chcąc obsłużyć klawiaturę matrycową 4x4 napisałem taki program:

Kod: Zaznacz cały

$regfile = "m16def.dat" $crystal = 16000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0 'konfiguracja wyswietlacza Config Pinb.7 = Input 'konfiguracja portu Config Pinb.6 = Input Config Pinb.5 = Input Config Pinb.4 = Input Config Pinb.3 = Output Config Pinb.2 = Output Config Pinb.1 = Output Config Pinb.0 = Output W1 Alias Pinb.0 'przypisanie nazw wyjsciom portu W2 Alias Pinb.1 W3 Alias Pinb.2 W4 Alias Pinb.3 Kol1 Alias Pinb.4 Kol2 Alias Pinb.5 Kol3 Alias Pinb.6 Kol4 Alias Pinb.7 Dim Klawisz As Byte Do 'nieskończona pętla Cls Lcd Klawisz 'wyświetl numer klawisza na wyświetlaczu LCD Waitms 100 Loop 'koniec pętli Obsluga: 'Podprogram obsługi klawiatury Set W1 'Poziom wyski na wierszu pierwszym Reset W2 'zerój wiersz 2 Reset W3 'zerój wiersz 3 Reset W4 'zerój wiersz 4 If Kol1 = 1 Then Klawisz = 1 'Jeśli na kol1 stan wysoki to klawisz=1 If Kol2 = 1 Then Klawisz = 2 'Jeśli na kol2 stan wysoki to klawisz=2 If Kol3 = 1 Then Klawisz = 3 'Jeśli na kol3 stan wysoki to klawisz=3 If Kol4 = 1 Then Klawisz = 4 'Jeśli na kol4 stan wysoki to klawisz=4 Reset W1 Set W2 Reset W3 Reset W4 If Kol1 = 1 Then Klawisz = 5 If Kol2 = 1 Then Klawisz = 6 If Kol3 = 1 Then Klawisz = 7 If Kol4 = 1 Then Klawisz = 8 Reset W1 Reset W2 Set W3 Reset W4 If Kol1 = 1 Then Klawisz = 9 If Kol2 = 1 Then Klawisz = 10 If Kol3 = 1 Then Klawisz = 11 If Kol4 = 1 Then Klawisz = 12 Reset W1 Reset W2 Reset W3 Set W4 If Kol1 = 1 Then Klawisz = 13 If Kol2 = 1 Then Klawisz = 14 If Kol3 = 1 Then Klawisz = 15 If Kol4 = 1 Then Klawisz = 16 Return
Program ten ma wyświetlać wartość zmiennej klawisz na wyświetlaczu lcd.Jednak program nie działa.Może wiecie co należy poprawić lub dodać aby program dobrze działał.Instrukcja getkbd() nie wchodzi w grę(linie wierszy klawiatury będą skanowały jeszcze inne przełączniki).
Ostatnio zmieniony 16 kwie 2008, o 08:38 przez kamil232, łącznie zmieniany 1 raz.

MDz
-
-
Posty: 365
Rejestracja: 29 mar 2003, o 13:35
Lokalizacja: Warszawa
Kontaktowanie:

Postautor: MDz » 15 kwie 2008, o 21:15

Jeśli masz ochotę, to możesz przyjrzeć się prostemu a zarazem dosyć efektywnemu algorytmowi obsługi klawiatury, o którym swego czasu pisałem tu:
http://groups.google.pl/group/pl.misc.e ... aa582d0324
(Niestety nie Bascom a C'51, ale idea jest prosta więc nie powinieneś mieć kłopotów z analizą).

--
MDz

kamil232
-
-
Posty: 11
Rejestracja: 15 kwie 2008, o 17:57
Lokalizacja: Warszawa

Postautor: kamil232 » 16 kwie 2008, o 08:09

Trochę zrozumiałem z tego(przynajmniej początek),ale teraz jak to napisać.Za dużo póki co nie wiem jeszcze bo dopiero początkuję.Póki co wiem że w moim programie zabrakło w pętli głównej programu skoku do podprogramu.Poprawiłem to następująco:

Kod: Zaznacz cały

Do Cls Gosub Obsluga Lcd Klawisz 'wyświetl numer klawisza na wyświetlaczu LCD Waitms 100 Loop End
Wyświetlacz ciągle daje wynik 16 jakby był ciągle wciśnięty ostatni klawisz.Reaguje tylko ostatni klawisz klawiatury,który zmienia wartość na 15,a to on powinien dawać wartość 16,czyli jeszcze gdzieś tkwi błąd
Ostatnio zmieniony 16 kwie 2008, o 08:38 przez kamil232, łącznie zmieniany 1 raz.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 16 kwie 2008, o 12:18

Reaguje tylko ostatni klawisz klawiatury,który zmienia wartość na 15,a to on powinien dawać wartość 16,czyli jeszcze gdzieś tkwi błąd
Wybieraj wiersz niskim stanem a nie wysokim i obecność takiego stanu odczytuj w kolumnach. Upewnij się czy Bascom sam załącza wewnętrzne podciągniecie (pull-up) do +5V na wejściach, czy trzeba to zadeklarować. Obecny program wymaga do działania "ściągnięcia" wejść "kolumnowych" do masy zewnętrznymi rezystorami - masz takowe?

kamil232
-
-
Posty: 11
Rejestracja: 15 kwie 2008, o 17:57
Lokalizacja: Warszawa

Postautor: kamil232 » 16 kwie 2008, o 13:56

Rozumiem że chodziło o resetowanie danego wiersza a nie podciąganie.W związku z tym przerobiłem program na następujący:

Kod: Zaznacz cały

Set Portb.7 Set Portb.6 Set Portb.5 Set Portb.4 Set W1 Set W2 Set W3 Set W4 Dim Klawisz As Byte Do Cls Gosub Obsluga 'nieskończona pętla Lcd Klawisz 'wyświetl numer klawisza na wyświetlaczu LCD Waitms 100 Loop End 'koniec pętli Obsluga: 'Podprogram obsługi klawiatury Reset W1 'zerój wiersz pierwszy Set W2 'podciągnij wiersz 2 Set W3 'podciągnij wiersz 3 Set W4 'podciągnij wiersz 4 If Kol1 = 0 Then Klawisz = 1 'Jeśli na kol1 stan niski to klawisz=1 If Kol2 = 0 Then Klawisz = 2 'Jeśli na kol2 stan niski to klawisz=2 If Kol3 = 0 Then Klawisz = 3 'Jeśli na kol3 stan niski to klawisz=3 If Kol4 = 0 Then Klawisz = 4 'Jeśli na kol4 stan niski to klawisz=4 Set W1 Reset W2 Set W3 Set W4 If Kol1 = 0 Then Klawisz = 5 If Kol2 = 0 Then Klawisz = 6 If Kol3 = 0 Then Klawisz = 7 If Kol4 = 0 Then Klawisz = 8 Set W1 Set W2 Reset W3 Set W4 If Kol1 = 0 Then Klawisz = 9 If Kol2 = 0 Then Klawisz = 10 If Kol3 = 0 Then Klawisz = 11 If Kol4 = 0 Then Klawisz = 12 Set W1 Set W2 Set W3 Reset W4 If Kol1 = 1 Then Klawisz = 13 If Kol2 = 1 Then Klawisz = 14 If Kol3 = 1 Then Klawisz = 15 If Kol4 = 1 Then Klawisz = 16 Return
Oczywiście deklaracje portów i LCD są takie same jak poprzednio.Efekt jest taki sam jak wcześniej czyli nie działa

Edit Pajaczek: prosze uzywac

Kod: Zaznacz cały

[/color]
Ostatnio zmieniony 16 kwie 2008, o 15:01 przez kamil232, łącznie zmieniany 1 raz.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 16 kwie 2008, o 16:41

Kod: Zaznacz cały

W1 Alias Pinb.0 'przypisanie nazw wyjsciom portu W2 Alias Pinb.1 W3 Alias Pinb.2 W4 Alias Pinb.3
Do wyjść bardziej pasuje:

Kod: Zaznacz cały

W1 Alias Portb.0

Kod: Zaznacz cały

If Kol1 = 1 Then Klawisz = 13 If Kol2 = 1 Then Klawisz = 14 If Kol3 = 1 Then Klawisz = 15 If Kol4 = 1 Then Klawisz = 16
Wypadałoby wszystko poprawić...

kenaJ
-
-
Posty: 29
Rejestracja: 13 lis 2006, o 22:31
Lokalizacja: Kraków

Postautor: kenaJ » 1 paź 2008, o 08:44

W Twoim programie brakuje kilku rzeczy:

- co z drganiami styków klawiatury?
- musisz odczytywać wartość binarną portu obsługującego klawiaturę i pytać się o tą wartość (już w układzie dziesiętnym) a dalej wyświetlać numer klawisza na LCD.

M. Wiązania opisuje to w swojej książce (temat: sterowanie multipleksowe), przerabiałem problem i moja klawiatura telefoniczna ruszyła!!!

Pozdrawiam!

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 29 gości