- Dlaczego potrzebujemy klawiatury 4x4:
- Jak działa klawiatura 4x4 Matrix:
- Wymagany materiał:
- Schemat obwodu:
- Objaśnienie programowania:
Klawiatury są szeroko stosowanymi urządzeniami wejściowymi używanymi w różnych projektach elektronicznych i wbudowanych. Są używane do pobierania danych wejściowych w postaci liczb i alfabetów i wprowadzają je do systemu w celu dalszego przetwarzania. W tym samouczku będziemy łączyć klawiaturę matrycową 4x4 z PIC16F877A.
Zanim przejdziemy do logiki szczegółów i nauczymy się obsługi klawiatury, musimy wiedzieć kilka rzeczy.
Dlaczego potrzebujemy klawiatury 4x4:
Zwykle używamy pojedynczego pinu I / O jednostki mikrokontrolera do odczytu sygnału cyfrowego, jak wejście przełącznika. W kilku aplikacjach, w których do celów wejściowych potrzeba 9, 12, 16 kluczy, jeśli dodamy każdy klucz do portu mikrokontrolera, skończymy na 16 portach I / O. Te 16 portów I / O służy nie tylko do odczytu sygnałów I / O, ale mogą być również używane jako połączenia peryferyjne, takie jak obsługa ADC, połączenia I2C, SPI są również obsługiwane przez te piny I / O. Ponieważ te piny są połączone z przełącznikami / kluczami, nie możemy ich używać, ale tylko jako portów I / O. To w ogóle nie ma sensu. Jak więc zmniejszyć liczbę pinów? Odpowiedź brzmi: używając klawiatury szesnastkowej lub klawiatury matrycowej; możemy zmniejszyć liczbę pinów, które kojarzą klucze macierzy 4x4. Wykorzysta 8 pinów, z czego 4 połączone w rzędy i 4 połączone w kolumny, oszczędzając w ten sposób 8 pinów mikrokontrolera.
Jak działa klawiatura 4x4 Matrix:
Na górnym obrazku po lewej pokazano moduł klawiatury matrycowej. Po prawej stronie pokazane jest połączenie wewnętrzne oraz połączenie portu. Jeśli widzimy port jest 8 pinów, pierwsze 4 od lewej do prawej to X1, X2, X3 i X4 to rzędy, a ostatnie 4 od lewej do prawej to Y1, Y2, Y3, Y4 to cztery kolumny. Jeśli zrobimy 4 wiersze lub stronę X jako wyjście i ustawimy je na logiczne niskie lub 0, i uczynimy 4 kolumny jako dane wejściowe i odczytamy klawisze, odczytamy naciśnięcie przełącznika, gdy odpowiadający Y otrzyma 0.
To samo stanie się w macierzy nxn, gdzie n jest liczbą. Może to być 3x3, 6x6 itd.
Teraz pomyśl tylko, że wciśnięty jest 1. Następnie 1 znajduje się w wierszu X1 i kolumnie Y1. Jeśli X1 wynosi 0, to Y1 będzie równe 0. W ten sam sposób możemy wyczuć każdy klucz w wierszu X1, wyczuwając kolumny Y1, Y2, Y3 i Y4. Dzieje się to dla każdego przełącznika i odczytujemy położenie przełączników w matrycy.
Każde zielone kółko to przełącznik i oba są połączone ze sobą w ten sam sposób.
W tym samouczku połączymy klawiaturę z następującymi specyfikacjami:
- Użyjemy wewnętrznego podciągania
- Dodamy opcję odbijania kluczy
Ale kiedy przełączniki nie są wciśnięte, musimy ustawić Y1, Y2, Y3 i Y4 jako wysokie lub 1. W przeciwnym razie nie możemy wykryć zmian logicznych, gdy przełącznik jest wciśnięty. Ale nie mogliśmy tego zrobić za pomocą kodów lub programu, ponieważ te piny są używane jako wejście, a nie wyjście. Więc użyjemy wewnętrznego rejestru operacji w mikrokontrolerze i będziemy obsługiwać te piny jako słaby tryb włączonego podciągania. Używając tego, pojawi się tryb wysokiego włączenia logiki, gdy jest w stanie domyślnym.
Ponadto, gdy naciskamy klawisz, pojawiają się skoki lub hałas są generowane przez styki przełącznika, a z powodu tego wielokrotnego naciśnięcia przełącznika dzieje się, co nie jest oczekiwane. Tak więc najpierw wykryjemy naciśnięcie przełącznika, odczekamy kilka milisekund, ponownie sprawdzimy, czy przełącznik jest nadal wciśnięty, czy nie, a jeśli przełącznik jest nadal wciśnięty, ostatecznie zaakceptujemy naciśnięcie przełącznika, w przeciwnym razie nie. Nazywa się to odskoczeniem przełączników.
Zaimplementujemy to wszystko w naszym kodzie i utworzymy połączenie na płytce prototypowej.
Sprawdź również, jak połączyć klawiaturę 4x4 z innymi mikrokontrolerami:
- Interfejs klawiatury z Arduino Uno
- Interfejs klawiatury 4x4 Matrix z mikrokontrolerem 8051
- Interfejs klawiatury 4x4 z mikrokontrolerem ATmega32
- Cyfrowy zamek szyfrowy Raspberry Pi na płycie prototypowej
Wymagany materiał:
- Płytka prototypowa
- Pic-kit 3 i środowisko programistyczne na Twoim komputerze, czyli MPLABX
- Przewody i złącza
- Wyświetlacz znaków LCD 16x2
- Kryształ 20 Mhz
- 2 szt. Ceramiczna nasadka dysku 33pF.
- Rezystor 4,7 k
- 10k preset (zmienny rezystor)
- Klawiatura 4x4 Matrix
- Adapter 5 V.
Schemat obwodu:
Połączymy kryształy i rezystor w odpowiednich pinach. Ponadto podłączymy wyświetlacz LCD w trybie 4-bitowym przez PORTD. Podłączyliśmy klawiaturę szesnastkową lub klawiaturę matrycową przez port RB4.
Jeśli jesteś nowy w PIC, zacznij od Wprowadzenie do mikrokontrolera PIC: Wprowadzenie do PIC i MPLABX
Objaśnienie programowania:
Kompletny kod do połączenia klawiatury Matrix z mikrokontrolerem PIC podano na końcu. Kod jest łatwy i zrozumiały. Biblioteka klawiatury jest jedyną rzeczą, którą należy rozumieć w kodzie. Tutaj użyliśmy biblioteki keypad.h i lcd.h do połączenia klawiatury i wyświetlacza LCD 16x2. Zobaczmy więc, co się w nim dzieje.
Wewnątrz pliku keypad.h zobaczymy, że użyliśmy nagłówka xc.h, który jest domyślną biblioteką rejestrów, częstotliwość kryształu jest zdefiniowana w celu użycia opóźnienia używanego w pliku kepad.c. Zdefiniowaliśmy porty klawiatury w rejestrze PORTRB i zdefiniowaliśmy poszczególne piny jako wiersz (X) i kolumny (Y).
Użyliśmy również dwóch funkcji, jednej do inicjalizacji klawiatury, która przekieruje port jako wyjście i wejście, oraz funkcji skanowania naciśnięcia przełącznika, która po wywołaniu zwróci stan naciśnięcia przełącznika.
#zawierać
W pliku keypad.c zobaczymy, że poniższa funkcja zwróci naciśnięcie klawisza, gdy funkcja skanera klawiatury nie zwróci „n”.
char switch_press_scan (void) // Pobierz klucz od użytkownika { char key = 'n'; // Zakładaj, że żaden klawisz nie został naciśnięty podczas (key == 'n') // Poczekaj do naciśnięcia klawisza key = keypad_scanner (); // Skanuj klucze raz po raz return key; // po naciśnięciu klawisza zwraca jego wartość }
Poniżej znajduje się funkcja odczytu klawiatury. W każdym kroku ustawimy wiersz X1, X2, X3 i X4 na 0 i odczytamy stan Y1, Y2, Y3 i Y4. Opóźnienie jest używane do efektu odbicia, gdy przełącznik jest nadal wciśnięty, zwrócimy skojarzoną z nim wartość. Gdy żaden przełącznik nie zostanie naciśnięty, zwrócimy „n”.
char keypad_scanner (void) { X_1 = 0; X_2 = 1; X_3 = 1; X_4 = 1; if (Y_1 == 0) {__delay_ms (100); podczas gdy (Y_1 == 0); return '1'; } if (Y_2 == 0) {__delay_ms (100); podczas gdy (Y_2 == 0); return '2'; } if (Y_3 == 0) {__delay_ms (100); podczas gdy (Y_3 == 0); return '3'; } if (Y_4 == 0) {__delay_ms (100); podczas gdy (Y_4 == 0); return „A”; } X_1 = 1; X_2 = 0; X_3 = 1; X_4 = 1; if (Y_1 == 0) {__delay_ms (100); podczas gdy (Y_1 == 0); return '4'; } if (Y_2 == 0) {__delay_ms (100); podczas gdy (Y_2 == 0); return '5'; } if (Y_3 == 0) {__delay_ms (100); podczas gdy (Y_3 == 0); return '6'; } if (Y_4 == 0) {__delay_ms (100); podczas gdy (Y_4 == 0); return „B”; } X_1 = 1; X_2 = 1; X_3 = 0; X_4 = 1; if (Y_1 == 0) {__delay_ms (100); podczas gdy (Y_1 == 0); return '7'; } if (Y_2 == 0) {__delay_ms (100); podczas gdy (Y_2 == 0); return '8'; } if (Y_3 == 0) {__delay_ms (100); podczas gdy (Y_3 == 0); return '9'; } if (Y_4 == 0) {__delay_ms (100); podczas gdy (Y_4 == 0); return 'C'; } X_1 = 1; X_2 = 1; X_3 = 1; X_4 = 0; if (Y_1 == 0) {__delay_ms (100); podczas gdy (Y_1 == 0); powrót '*'; } if (Y_2 == 0) {__delay_ms (100); podczas gdy (Y_2 == 0); return '0'; } if (Y_3 == 0) {__delay_ms (100); podczas gdy (Y_3 == 0); powrót '#'; } if (Y_4 == 0) {__delay_ms (100); podczas gdy (Y_4 == 0); return „D”; } return 'n'; }
Ustawimy również słabe podciąganie na ostatnich czterech bitach, a także ustawimy kierunek portów jako ostatnie 4 wejścia i pierwsze 4 jako wyjście. OPTION_REG & = 0x7F; służy do ustawienia słabego trybu podciągania na ostatnich kołkach.
void InitKeypad (void) { Keypad_PORT = 0x00; // Ustaw wartości pinów portu klawiatury na zero Keypad_PORT_Direction = 0xF0; // Ostatnie 4 piny wejście, pierwsze 4 piny wyjście OPTION_REG & = 0x7F; }
W głównym programie PIC (podanym poniżej) najpierw ustawiliśmy bity konfiguracyjne i zawarliśmy kilka potrzebnych bibliotek. Następnie w funkcji void system_init inicjalizujemy manipulator i wyświetlacz LCD. I wreszcie w głównej funkcji czytaliśmy klawiaturę wywołując switch_press_scan () funkcji i powrót do wartości lcd.
Pobierz pełny kod z plikami nagłówkowymi stąd i obejrzyj poniższy film demonstracyjny.