Матричную клавиатуру подключить к Arduino с одной стороны и не сложно, с другой стороны отводить под это целых 8 выводов из 17-ти свободных - это как-то слишком много.
Схема подключения:
Матричная клавиатура имеет 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-ми.