Подключаем матричную клавиатуру 4х4
- Войдите на сайт для отправки комментариев
Пнд, 06/11/2017 - 11:37
Вариант подключения матричной клавы 4х4 к микроконтроллеру (Ардуино).
Нужно выделить один порт МК.
Вывод "1" на картинке подключаем на D0, вывод "8" - на D7, остальные соответственно D1-D6.
Без резисторов, диодов и прочего.
Скетч:
//код нажатой клавиши слева-направо, сверху-вниз #define BUTT_1 B01110111//B11100111 #define BUTT_2 B01111011//B11010111 #define BUTT_3 B01111101//B10110111 #define BUTT_A B01111110//B01110111 #define BUTT_4 B10110111//B11101011 #define BUTT_5 B10111011//B11011011 #define BUTT_6 B10111101//B10111011 #define BUTT_B B10111110//B01111011 #define BUTT_7 B11010111//B11101101 #define BUTT_8 B11011011//B11011101 #define BUTT_9 B11011101//B10111101 #define BUTT_C B11011110//B01111101 #define BUTT_Z B11100111//B11101110 // "*" - звёздочка #define BUTT_0 B11101011//B11011110 #define BUTT_H B11101101//B10111110 //HASH, "#"- решётка #define BUTT_D B11101110//B01111110 #include <SoftwareSerial.h> SoftwareSerial mySerial(8, 9); // RX, TX word carrMillis, prevMillis, interval = 50; byte key = 20; bool wasPressKey = 0; void setup(){ mySerial.begin(9600); pinMode (13, OUTPUT); //устанавливаем порт в исходное состояние DDRD = B11110000;//0-3 вход, 4-7 выход PORTD = B00001111;//0-3 верхняя подтяжка, 4-7 "0" } void loop(){ carrMillis = millis(); if(carrMillis - prevMillis >= interval){ prevMillis = carrMillis; key = readKey(key); if(wasPressKey){ mySerial.println(key); //processClickKey(); wasPressKey = 0; } } } //======================================= byte readKey(byte prvKey){ //матричная 4х4 byte numKey = PIND;//читаем порт D if(numKey != B00001111){ //нажато что то PORTD = 0;//откл.подтяжку DDRD = B00001111;//меняем входы на выходы PORTD = B11110000;//вкл.подтяжку на входах delayMicroseconds(12);//зарядка емкостей клавы через подтяжку МК. numKey |= PIND;//код нажатой клавиши //устанавливаем порт в исходное состояние PORTD = 0;//откл.подтяжку DDRD = B11110000; PORTD = B00001111; byte arrButt[16] = {//цифры(0-9)-буквы(A-D)-знаки(*,#) BUTT_0, BUTT_1, BUTT_2, BUTT_3, BUTT_4, BUTT_5, BUTT_6, BUTT_7, BUTT_8, BUTT_9, BUTT_A, BUTT_B, BUTT_C, BUTT_D, BUTT_Z, BUTT_H }; for(byte i=0; i<16; i++){ if(numKey == arrButt[i]){ if(prvKey == 20){//была отпущена wasPressKey = 1;//только что нажата } return i; //0-15 нажато } } }//else numKey == 255 = В11111111 = 0хFF wasPressKey = 0; return 20;//не нажато } //============================================== void processClickKey(){ //обработка нажатой кнопки for(byte i = 0; i < key; i++){ digitalWrite(13, HIGH); delay(20); digitalWrite(13, LOW); delay(380); } }
это delay(380); очень плохо.
это delay(380); очень плохо.
Да я бы рад избавится, да моя дуина выплёвывает скетчи без делеев обратно как инородное... могу не успеть увернуться...