Подключаем матричную клавиатуру 4х4

Pyotr
Offline
Зарегистрирован: 12.03.2014

Вариант подключения матричной клавы 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);
  } 
}

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

это delay(380); очень плохо.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Клапауций 112 пишет:

это delay(380); очень плохо.

Да я бы рад избавится, да моя дуина выплёвывает скетчи без делеев обратно как инородное... могу не успеть увернуться...