Подключаем матричную клавиатуру 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); очень плохо.
Да я бы рад избавится, да моя дуина выплёвывает скетчи без делеев обратно как инородное... могу не успеть увернуться...