Как подключить к Arduino матричную клавиатуру

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

Самый простой вариант подключения приведён на схеме:

Схема подключения к Arduino матричной клавиатуры

Матричная клавиатура имеет 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-ми.