Матричную клавиатуру подключить к Arduino с одной стороны и не сложно, с другой стороны отводить под это целых 8 выводов из 17-ти свободных - это как-то слишком много.

Схема подключения:

arduino matrix kbd1

Матричная клавиатура имеет 4 вывода горизонтальных линий контактов и 4 вывода вертикальных линий контактов. Соответственно при подключении матричной клавиатуры к микроконтроллеру одна группа подключается к выходных выводам, а другая группа подключается к входным выводам (на приведённой схеме это выводы Analog In). Опрос состояния кнопок при этом производится либо построчно, либо по столбцам, по очереди -- на каждой итерации опрашивается одна строка кнопок либо один столбец. На соответствующий вывод при этом подаётся напряжение установкой состояния пина в логическую 1. Входные выводы микроконтроллера следует при этом подтянуть резисторами к земле, чтобы при отсутствии напряжения (когда кнопка не нажата) на соответствующем входе был ноль. При нажатии на кнопку на соответствующем выводе будет напряжение с выхода, то есть логическая 1.

Скетч опроса клавиатуры (скачать):

#define LED  13           // Вывод светодиода
 
#define MATRIX_OUT0 8    /// Выводы матричной клавиатуры
#define MATRIX_OUT1 9
#define MATRIX_OUT2 10
#define MATRIX_OUT3 11
 
#define MATRIX_IN0  A0    // Входы матричной клавиатуры
#define MATRIX_IN1  A1
#define MATRIX_IN2  A2
#define MATRIX_IN3  A3
 
// Пара вспомогательных массивов
const unsigned char matrixOutPins[4] = {
  MATRIX_OUT0, MATRIX_OUT1,
  MATRIX_OUT2, MATRIX_OUT3
  };
const unsigned char matrixInPins[4] = {
  MATRIX_IN0, MATRIX_IN1,
  MATRIX_IN2, MATRIX_IN3
  };
 
// Массив состояния кнопок
bool keyState[4][4] = {
    { false, false, false, false },
    { false, false, false, false },
    { false, false, false, false },
    { false, false, false, false }
  };
 
void setup() {
  // Инициализация выводов матричной клавиатуры
  for (char n = 0; n < 3; ++n) {
    pinMode(matrixInPins[n], INPUT);
    pinMode(matrixOutPins[n], OUTPUT);
    digitalWrite(matrixOutPins[n], LOW);
  }
  // Инициализация вывода светодиода
  pinMode(LED, OUTPUT);
}
 
void loop() {
  updateKeyState();  // Обновить состояние клавиатуры
  delay(62);         // с частотой 16 Гц, чтобы избежать дребезга контактов
}
 
void updateKeyState() {
  for (char n = 0; n < 3; ++n) {
    // Опрос линии кнопок
    digitalWrite(matrixOutPins[n], HIGH);
    for (char nn = 0; nn < 3; ++nn) {
      // Опрос кнопки в линии
      bool curState = digitalRead(matrixInPins[n]);
      if (keyState[n][nn] != curState) {
        // Если состояние кнопки изменилось,
        // вызвать функцию-обработчик события
        keyState[n][nn] = curState;
        // Скан-код кнопки = (номер линии * 4) + номер кнопки
        char scanCode = (n << 2) | nn;
        if (curState)
          keyPress(scanCode);
        else
          keyRelease(scanCode);
      }
    }
  }
}
 
// Обработка события Кнопка Нажата
void keyPress(char scanCode) {
   digitalWrite(LED, HIGH); // Вкл. светодиод
}
 
// Обработка события Кнопка Отпущена
void keyRelease(char scanCode) {
   digitalWrite(LED, LOW);  // Выкл. светодиод
}

Более сложный вариант подключения - использовать для коммутирования линий кнопок микросхему счётчика-делителя 74LS90 (К155ИЕ2). В этом случае можно будет обойтись 5-ю выводами вместо 8-ми.

Добавить комментарий


Защитный код
Обновить