Код скетча
// Матричная клавиатура: шестнадцать кнопок на восьми выводах.
//
// Кнопки стоят на пересечениях четырёх строк и четырёх столбцов.
// Отдельного провода у кнопки нет — есть провод строки и провод
// столбца, и нажатие их соединяет.
//
// Отсюда способ опроса. Строки — выходы, и по очереди одна из них
// прижимается к земле. Столбцы — входы с подтяжкой, и тот из них, что
// стал LOW, пересекается с прижатой строкой ровно в одной точке. Это и
// есть нажатая кнопка.
//
// Восемь выводов вместо шестнадцати — ради этого всё и затевалось.
const int ROWS[4] = { 2, 3, 4, 5 };
const int COLS[4] = { 6, 7, 8, 9 };
const char KEYS[4][4] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' },
};
void setup() {
Serial.begin(9600);
for (int i = 0; i < 4; i++) {
pinMode(ROWS[i], OUTPUT);
digitalWrite(ROWS[i], HIGH);
pinMode(COLS[i], INPUT_PULLUP);
}
Serial.println("нажимайте клавиши на схеме");
}
char scan() {
for (int r = 0; r < 4; r++) {
digitalWrite(ROWS[r], LOW);
for (int c = 0; c < 4; c++) {
if (digitalRead(COLS[c]) == LOW) {
digitalWrite(ROWS[r], HIGH);
return KEYS[r][c];
}
}
digitalWrite(ROWS[r], HIGH);
}
return 0;
}
void loop() {
char key = scan();
if (key) {
Serial.print("нажато: ");
Serial.println(key);
delay(200);
}
}