- Защо се нуждаем от 4x4 клавиатура:
- Как работи 4x4 матричната клавиатура:
- Необходим материал:
- Електрическа схема:
- Обяснение на програмирането:
Клавиатурите са широко използвани входни устройства, използвани в различни електроника и вградени проекти. Те се използват, за да вземат входове под формата на цифри и азбуки и да ги подават в системата за по-нататъшна обработка. В този урок ще свържем матрична клавиатура 4x4 с PIC16F877A.
Преди да влезем в логиката на детайлите и да научим как да използваме клавиатурата, ще трябва да знаем няколко неща.
Защо се нуждаем от 4x4 клавиатура:
Обикновено използваме единичен I / O щифт на микроконтролер за четене на цифровия сигнал, като превключващ вход. В няколко приложения, където за въвеждане са необходими 9, 12, 16 ключа, ако добавим всеки ключ в порт за микроконтролер, ще получим 16 I / O порта. Тези 16 I / O порта не са само за четене на I / O сигнали, но могат да се използват и като периферни връзки, като ADC поддържа, I2C, SPI връзките също се поддържат от тези I / O щифтове. Тъй като тези щифтове са свързани с превключвателите / клавишите, не можем да ги използваме, а само като I / O портове. Това изобщо няма смисъл. И така, как да намалим броя на щифтовете? Отговорът е, като се използва шестнадесетична клавиатура или матрична клавиатура; можем да намалим броя на щифтовете, които свързват 4x4 матрични ключове. Той ще използва 8 пина, от които 4 свързани в редове и 4 свързани в колони, като по този начин спестява 8 щифта на микроконтролера.
Как работи 4x4 матричната клавиатура:
На горното изображение вляво е показан матричен модул на клавиатурата. Вдясно е показана вътрешната връзка, както и връзка с портове. Ако видим порта има 8 пина, първите 4 отляво надясно са X1, X2, X3 и X4 са редовете, а последните 4 отляво надясно са Y1, Y2, Y3, Y4 са четири колони. Ако направим 4 реда или страна X като изход и ги направим логически ниски или 0, и направим 4 колони като вход и прочетем клавишите, ще прочетем натискането на превключвателя, когато кореспондентът Y получи 0.
Същото нещо ще се случи в матрицата nxn, където n е числото. Това може да бъде 3x3, 6x6 и т.н.
Сега просто помислете, че 1 е натиснат. Тогава 1 се намира в X1 ред и Y1 колона. Ако X1 е 0, тогава Y1 ще бъде 0. По същия начин можем да усетим всеки ключ в реда X1, като засечем колона Y1, Y2, Y3 и Y4. Това нещо се случва за всеки превключвател и ние ще прочетем положението на превключвателите в матрицата.
Всеки зелен кръг е превключвателят и двамата са свързани помежду си по един и същи начин.
В този урок ще свържем клавиатурата със следните спецификации -
- Ще използваме вътрешно изтегляне
- Ще добавим опция за отхвърляне на ключ
Но когато превключвателите не са натиснати, трябва да направим Y1, Y2, Y3 и Y4 като високи или 1. В противен случай не можем да открием логическите промени при натискане на превключвателя. Но не успяхме да го направим чрез кодове или програми, тъй като тези щифтове се използват като вход, а не като изход. Така че, ние ще използваме вътрешен регистър на операциите в микроконтролера и ще работим с тези щифтове като слаб режим на активиране. Чрез използването на това ще има режим с висока разрешена логика, когато е в състояние по подразбиране.
Също така, когато натиснем клавиша, има пикове или се генерира шум от контактите на превключвателя и поради това многократно натискане на превключвател се случва, което не се очаква И така, първо ще открием натискането на превключвателя, изчакайте няколко милисекунди, отново проверете дали превключвателят все още е натиснат или не и ако превключвателят все още е натиснат, ще приемем натискането на превключвателя, в противен случай не. Това се нарича отскачане на превключвателите.
Ще приложим всичко това в нашия код и ще направим връзката на макет.
Също така проверете как да свържете 4x4 клавиатурата с други микроконтролери:
- Взаимодействие на клавиатурата с Arduino Uno
- 4x4 матрична клавиатурна връзка с 8051 микроконтролер
- Интерфейс на клавиатурата 4x4 с микроконтролер ATmega32
- Заключване на цифров код на Raspberry Pi на макет
Необходим материал:
- Макет
- Pic-kit 3 и среда за разработка във вашия компютър, т.е. MPLABX
- Проводи и съединители
- Символен LCD 16x2
- 20Mhz кристал
- 2 бр. 33pF керамична капачка за диск.
- 4.7k резистор
- 10k предварително зададена (променлив резистор)
- 4х4 матрична клавиатура
- Адаптер 5 V
Електрическа схема:
Ще свържем кристалите и резистора в свързаните щифтове. Също така ще свържем LCD в 4-битов режим през PORTD. Свързахме шестнадесетичната клавиатура или матричната клавиатура през порта RB4.
Ако сте нов в PIC, започнете с Първи стъпки с PIC Microcontroller: Въведение в PIC и MPLABX
Обяснение на програмирането:
В края е даден пълен код за свързване на матрична клавиатура с PIC микроконтролер. Кодът е лесен и разбираем. Библиотеката на клавиатурата е единственото нещо, което трябва да се разбира в кода. Тук използвахме keypad.h и lcd.h Library за интерфейс между клавиатурата и 16x2 LCD. Така че нека видим какво се случва вътре в това.
Вътре в keypad.h ще видим, че сме използвали xc.h хедър, който е библиотека на регистрите по подразбиране, честотата на кристалите е дефинирана за използване при използването на забавяне, използвано във файла kepad.c Дефинирахме портовете на клавиатурата в регистър PORTRB и дефинирахме отделни щифтове като ред (X) и колони (Y).
Също така използвахме две функции - една за инициализация на клавиатурата, която ще пренасочи порта като изход и вход, и сканиране с натискане на превключвател, което ще върне състоянието на натискането на превключвателя при извикване.
#include
В keypad.c ще видим, че функцията по-долу ще върне натискането на клавиша, когато функцията за скенер на клавиатурата не върне 'n'.
char switch_press_scan (void) // Вземи ключ от потребител { char key = 'n'; // Приемаме, че не е натиснат клавиш докато (key == 'n') // Изчакайте, докато не бъде натиснат бутон key = keypad_scanner (); // Сканиране на клавишите отново и отново клавиш за връщане; // при натискане на клавиша се връща стойността му }
По-долу е функцията за четене на клавиатурата. Във всяка стъпка ще направим реда X1, X2, X3 и X4 като 0 и ще отчитаме състоянието Y1, Y2, Y3 и Y4. Закъснението се използва за ефекта на отпадане, когато превключвателят все още е натиснат, ще върнем свързаната с него стойност. Когато не се натисне превключвател, ще върнем 'n'.
char клавиатура_сканер (void) { X_1 = 0; X_2 = 1; X_3 = 1; X_4 = 1; ако (Y_1 == 0) {__delay_ms (100); докато (Y_1 == 0); връщане '1'; } if (Y_2 == 0) {__delay_ms (100); докато (Y_2 == 0); връщане '2'; } if (Y_3 == 0) {__delay_ms (100); докато (Y_3 == 0); връщане '3'; } if (Y_4 == 0) {__delay_ms (100); докато (Y_4 == 0); връщане 'A'; } X_1 = 1; X_2 = 0; X_3 = 1; X_4 = 1; ако (Y_1 == 0) {__delay_ms (100); докато (Y_1 == 0); връщане '4'; } if (Y_2 == 0) {__delay_ms (100); докато (Y_2 == 0); връщане '5'; } if (Y_3 == 0) {__delay_ms (100); докато (Y_3 == 0); връщане '6'; } if (Y_4 == 0) {__delay_ms (100); докато (Y_4 == 0); връщане 'B'; } X_1 = 1; X_2 = 1; X_3 = 0; X_4 = 1; ако (Y_1 == 0) {__delay_ms (100); докато (Y_1 == 0); връщане '7'; } if (Y_2 == 0) {__delay_ms (100); докато (Y_2 == 0); връщане '8'; } if (Y_3 == 0) {__delay_ms (100); докато (Y_3 == 0); връщане '9'; } if (Y_4 == 0) {__delay_ms (100); докато (Y_4 == 0); връщане 'C'; } X_1 = 1; X_2 = 1; X_3 = 1; X_4 = 0; ако (Y_1 == 0) {__delay_ms (100); докато (Y_1 == 0); връщане '*'; } if (Y_2 == 0) {__delay_ms (100); докато (Y_2 == 0); връщане '0'; } if (Y_3 == 0) {__delay_ms (100); докато (Y_3 == 0); връщане '#'; } if (Y_4 == 0) {__delay_ms (100); докато (Y_4 == 0); връщане 'D'; } връщане 'n'; }
Също така ще настроим слабото изтегляне на последните четири бита, а също така ще зададем посоката на портовете като последните 4 входа и първите 4 като изхода. В OPTION_REG & = 0x7f; се използва за задаване на режим на слабо изтегляне на последните пинове.
void InitKeypad (void) { Keypad_PORT = 0x00; // Задаване на нулеви стойности на ПИН на порта на клавиатурата Keypad_PORT_Direction = 0xF0; // Последни 4 пина вход, Първи 4 пина изход OPTION_REG & = 0x7F; }
В основната програма PIC (дадена по-долу) първо зададохме конфигурационните битове и включихме няколко необходими библиотеки. След това във void функциите system_init инициализираме клавиатурата и LCD дисплея. И накрая в в основната функция, ние прегледахме клавиатурата като се обадите на switch_press_scan () функцията и връщане на стойността на LCD.
Изтеглете пълния код със заглавни файлове от тук и проверете демонстрационното видео по-долу.