Вы здесь

Матричная клавиатура с использованием прерываний в Arduino

Подключение матричной клавиатуры к Arduino

В большом проекте очень часто возникает проблема с организацией считывания элементов управления, потому что люди используют большое количество функций и кода, который непрерывно выполняется. Для приёма сигнала с кнопок можно использовать внешнее прерывание Arduino. Все это означает, что можно сделать и матричную клавиатуру используя прерывания. Для этого нам понадобится Arduino, матричная клавиатура, 4 диода и 4 резистора.

Подключаем по схеме:

Arduino Uno имеет 2 внешних прерывания 0 и 1 на выводах 2 и 3 соответственно.

В нашей программе мы будем прерывать функцию мигания стандартным светодиодом (на 13 ноге Arduino) и считывать номер нажатой кнопки.

 

int PinOut[4] {5, 4, 3, 2}; // пины выходы

int PinIn[4] {9, 8, 7, 6}; // пины входа

const char value[4][4]


{ {'1', '4', '7', '*'},
  {'2', '5', '8', '0' },
  {'3', '6', '9', '#'},
  {'A', 'B', 'C', 'D'}
};
// двойной массив, обозначающий кнопку

int b = 0; // переменная, куда кладется число из массива(номер кнопки)

void setup()
{
  pinMode (2, OUTPUT); // инициализируем порты на выход (подают нули на столбцы)
  pinMode (3, OUTPUT);
  pinMode (4, OUTPUT);
  pinMode (5, OUTPUT);

  pinMode (6, INPUT); // инициализируем порты на вход с подтяжкой к плюсу (принимают нули на строках)
  digitalWrite(6, HIGH);
  pinMode (7, INPUT);
  digitalWrite(7, HIGH);
  pinMode (8, INPUT);
  digitalWrite(8, HIGH);
  pinMode (9, INPUT);
  digitalWrite(9, HIGH);
  attachInterrupt(0, matrix, RISING); // подключаем 0 прерывание(2 пин) на функцию проверки матричной клавиатуры
  Serial.begin(9600); // открываем Serial порт
}

void matrix () // создаем функцию для чтения кнопок
{
  for (int i = 1; i <= 4; i++) // цикл, передающий 0 по всем столбцам
  {
    digitalWrite(PinOut[i - 1], LOW); // если i меньше 4 , то отправляем 0 на ножку
    for (int j = 1; j <= 4; j++) // цикл, принимающих 0 по строкам
    {
      if (digitalRead(PinIn[j - 1]) == LOW) // если один из указанных портов входа равен 0, то..
      {
        Serial.println( value[i - 1][j - 1]); // то b равно значению из двойного массива
        delay(175);
      }
    }
    digitalWrite(PinOut[i - 1], HIGH); // подаём обратно высокий уровень
  }
}

void Led() // создаем показательную функцию мигания светодиодом, чтобы потом ее прервать прерыванием от клавиатуры
{
  digitalWrite(13, HIGH); // зажигаем светодиод
  delay(1000); // ждем секунду
  digitalWrite(13, LOW); // тушим светодиод
  delay(1000);
}
void loop()
{
  Led(); // включаем функцию, для проверки нашего прерывания
}

 

Для вызова внешнего прерывания используем:

attachInterrupt(interrupt, function, mode);

interrupt – номер прерывания, в нашем случае 0

function – функция которая включается при срабатывании прерывания

mode – определяет ситуацию, при которой срабатывает прерывание

Может быть равно:

LOW – когда поступает низкий уровень на порт

CHANGE – прерывание срабатывает при изменение уровня на входе

RISING – прерывание включается при изменении уровня с 0 на 1

FALLING - прерывание включается при изменении уровня с 1 на 0