Klawiatura jest pierwszym urządzeniem, które pozwoliło na wprowadzenie danych do komputera. Dzisiejsze klawiatury potrafią mieć nawet po 200 przycisków, jednak dzisiaj nie skupimy się nad takimi klawiaturami lecz „nieco” mniejszą- klawiaturą matrycową 4×4, posiadającą 4 kolumny i 4 rzędy przycisków. Zapraszam do zapoznania się z jej obsługą.
Aby przeprowadzić dzisiejszy poradnik będziemy potrzebować:
- Mikrokontroler Atmega32 (ćwiczenie nie będzie działać z mikrokontrolerami z rodziny Attiny)
- Klawiaturę matrycową 4×4 (wersja THT : wersja SMD)
- przewody połączeniowe
- 4x diody LED wraz z rezystorami
- przejściówkę UART -> COM albo UART -> USB
Jak działa klawiatura matrycowa ?
![]() |
| Zasada działania klawiatury matrycowej |
Jak popatrzymy na powyższe zdjęcie to możemy zauważyć że tego typu klawiatura ma połączone przyciski w rzędy i kolumny, w taki sposób że przyciśnięcie jednego przycisku spowoduje zwarcie dwóch linii- pionowej (kolumny) i poziomowej (rzędy). Od razu narzuca nam się wada takiej klawiatury- nie można wcisnąć w jednym momencie więcej niż jednego przycisku ponieważ program nie rozpozna które dokładnie zostały wciśnięte.
Każdy przycisk ma swój unikalny numer. Dla klawiatury 4×4 ich zakres mieści się w 0-15. Oznacza to że jak wciśniemy np. górny lewy przycisk, to wtedy zostają zwarte linie pierwszej kolumny i pierwszego rzędu przez co mikrokontroler otrzymuje wartość zwrotną równą 15, jeżeli nie zostanie wciśnięty żaden przycisk to mikrokontroler interpretuje to jako 16. Skoro teorię mamy już za sobą to teraz możemy przejść do praktyki ;)
![]() |
| Mapowanie przycisków klawiatury |
Programowanie klawiatury
Na samym początku łączymy części jak to jest przedstawione na schemacie niżej:
![]() |
| Schemat blokowy połączenia |
Jak już mamy wszystko połączone to włączamy Bascoma i określamy na samym początku nasz mikrokontroler:
|
1 2 |
$regfile = "m32def.dat" $crystal = 8000000 |
Następnie ustawiamy prędkość transmisji danych wyrażonych w bodach, która będzie potrzebna do transmisji danych UART:
|
1 |
$baud = 1200 'predkosc transmisji wynosi 1200 bodow |
teraz przyszedł moment na zdefiniowanie klawiatury:
|
1 |
Config Kbd = Portc , Debounce = 10 , Delay = 10 |
Config Kbd = Portc oznacza do którego portu klawiatura została podłączona
Debounce = 10 oznacza czas pomiędzy odczytami stanu klawiszy, wyrażony w milisekundach
Delay = 10 oznacza czas opóźnienia, który zostanie wprowadzony w momencie wykrycia przycisku, wyrażony w milisekundach
Nie możemy również zapomnieć o zdefiniowaniu portu, do którego podłączone są diody LED:
|
1 |
Config Porta = Output |
Teraz musimy kierować otrzymane informację z klawiatury na zmienną, w naszym przypadku jest to zmienna K:
|
1 |
Dim K As Byte |
W tym momencie nasz poradnik rozbije się na parę części:
1.1 Sprawdzenie klawiatury po UART:
Wgrywamy ten program:
|
1 2 3 4 5 6 7 |
Do K = Getkbd() Waitms 100 Print K Loop |
Funkcja Getkbd() pobiera wartość klawiatury, aby nie powtarzać cały czas tej funkcji to przyrównujemy jej zmienną K. Następnie każemy czekać 100ms programowi, po czym ma wysłać tą zmienną K.
W Bacomie wywołujemy Terminal Emulator (Ctrl + T) i wchodzimy w Settings i zakładkę Communication, tam ustawiamy port COM, w moim wypadku jest to COM3 i baudrate na 1200 i zamykamy. Teraz powinny nam się terminalu wyświetlać same liczby 16, co oznacza że nie został wciśnięty żaden klawisz. Natomiast jak wciśniemy jakiś przycisk to pojawi się jego liczba.
![]() |
| Żaden przycisk nie został wciśnięty |
Teraz możemy lekko zmodyfikować program usuwając Print K i dopisując warunek:
|
1 2 3 4 5 6 7 8 9 10 |
Do K = Getkbd() Waitms 100 If K = 16 Then Print "Nie wcisnieto przycisku!" End If Loop |
Jeżeli zmienna K = 16 to wyślij Nie wcisnieto przycisku. Program powinien dać nam taki efekt:
![]() |
| Nie wciśnięto przycisku |
Teraz jak wiemy jak już w praktyce działa taka klawiatura to możemy pójść o krok dalej i przypisać jakiemuś klawiszowi funkcję do spełnienia.
1.2 Klawiatura matrycowa w zastosowaniu:
Na potrzeby tego poradnika, przyciski rzędu 3. będą odpowiadać za zapalanie diod LED. Przedstawię teraz program odpowiadający za te funkcję. Program ten jak widzimy jest zbudowany z warunków, główny warunek to jeżeli zmienna K=16 to mikrokontroler ma wysłać: Nie wcisnieto przycisku!. Następnie dochodzą „podwarunki” że jeżeli zmienna K =13 (1. przycisk 3. rzędu) zostanie wywołana to ma na 0,5 sekundy zaświecić diodę LED podpiętą do portu Porta.3 i takie same funkcje przypisane są dla wszystkich klawiszy 3. rzędu z tym, że dla każdego przycisku zapalana jest inna dioda LED.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Do K = Getkbd() If K = 16 Then Print "Nie wcisnieto przycisku!" Elseif K = 13 Then Porta.3 = 1 Print K Waitms 500 Porta.3 = 0 Elseif K = 9 Then Porta.2 = 1 Print K Waitms 500 Porta.2 = 0 Elseif K = 5 Then Porta.1 = 1 Print K Waitms 500 Porta.1 = 0 Elseif K = 1 Then Porta.0 = 1 Print K Waitms 500 Porta.0 = 0 End If Loop <img class="size-large wp-image-1105 aligncenter" src="http://feriar-lab.pl/wp-content/uploads/2015/04/DSCN0374-1024x751.jpg" alt="DSCN0374" width="665" height="488" /> |
Jeżeli chcesz być informowany na bieżąco o nowych częściach kursu to kliknij „Lubię to!” bądź subskrybuj naszą stronę, aby otrzymywać na adres e-mail nowości ze strony. Jeżeli masz jakieś pytania to śmiało zadawaj je na forum ; )




