const int P[] = {11, 10, 9, 8}; // выводы строк строк (выходы)
const int M[] = {7, 6, 5, 4}; // выводы столбцов (входы)
const char k4x4 [4][4] = { // коды символов на клавиатуре
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
void setup()
{
for (int i = 0; i <= 3; i++) // настройка выходов и входов
{
pinMode(P[i], OUTPUT);
pinMode(M[i], INPUT_PULLUP); //входы с внутренней подтяжкой
digitalWrite(P[i], HIGH);
}
Serial.begin(9600);
Serial.println("begin");
}
void loop() {
char a = GetKey4x4(); // опрос клавиатуры
if (a != 0)// при нажатии - вывод кнопки в порт
{
Serial.print(a);
}
}
/*Функция опроса клавиатуры*/
char GetKey4x4()
{
static unsigned long timer; // для подавления дребезга
static char olda; //старый код нажатой клавиши
char a = 0; //код нажатой клавиши
if ((timer + 50) > millis()) return 0; // пауза для подавления дребезга
for (byte p = 0; p <= 3; p++) // последовательно выставляем по одной строке в LOW
{
digitalWrite(P[p], LOW);
for (byte m = 0; m <= 3; m++) // и считываем столбцы, анализируя, где LOW происходит
{
if (!digitalRead(M[m]))
{
a = k4x4[p][m]; // считываем соотвествующий символ для комбинации столбца и строки
}
}
digitalWrite(P[p], HIGH); // возвращем строку в HIGH и крутим дальше
}
timer = millis();
if (a == olda) return 0; //маскируем удержание
olda = a;
return a;
}