4.01.4. Лабораторная работа №4.1.4.md


Матричная клавиатура

Тема работы

Мы научились работать с одной кнопкой, но что, если нам нужно подключить 16 кнопок, как на кодовом замке или калькуляторе? Использовать 16 пинов для этого — непозволительная роскошь. В этой лабораторной работе мы познакомимся с матричной клавиатурой 4x4 и изучим умный метод сканирования, который позволяет управлять 16 кнопками, используя всего 8 пинов.

Цель

  • Понять принцип устройства и работы матричной клавиатуры.
  • Освоить алгоритм матричного сканирования для опроса кнопок.
  • Написать программу, которая определяет, какая именно из 16 кнопок нажата, и выводит её символ в монитор порта.

Оборудование и материалы

  • Отладочная плата Рудирон.
  • 1 матричная клавиатура 4x4.
  • 8 соединительных проводов.
  • USB-кабель для подключения Рудирона.
  • Компьютер с настроенной средой Arduino IDE.

Ход работы

  1. Как устроена матричная клавиатура?

    Внутри клавиатуры 16 кнопок расположены на пересечении 4-х строк и 4-х столбцов. Это похоже на таблицу или поле для игры в «Морской бой». Каждая кнопка — это просто выключатель, который при нажатии соединяет одну конкретную строку с одним конкретным столбцом.

    Рис. 1. Внутреннее устройство матричной клавиатуры

    Выводы клавиатуры как раз и соответствуют этим строкам и столбцам. Наша задача — программно определить, на каком пересечении произошло замыкание.

  2. Алгоритм сканирования

    Чтобы найти нажатую кнопку, мы будем использовать метод сканирования: 1. Настраиваем все пины строк как выходы (OUTPUT), а пины столбцов — как входы (INPUT) с подтягивающими резисторами. 2. По очереди подаём низкий уровень (LOW) на одну строку, в то время как на всех остальных строках держим высокий уровень (HIGH). 3. В этот момент быстро считываем состояние всех столбцов. 4. Если на каком-то из столбцов мы считали LOW, это значит, что кнопка на пересечении активной строки и этого столбца нажата! 5. Повторяем этот процесс для каждой строки.

    Микроконтроллер делает это так быстро, что для нас реакция на нажатие кажется мгновенной.

  3. Сборка схемы

    • Подключите 8 выводов клавиатуры к цифровым пинам Рудирона. Важно не перепутать строки и столбцы. Обычно выводы идут по порядку: 4 для строк, 4 для столбцов.
      • Строки (Rows):
        • R1 → пин 8
        • R2 → пин 12
        • R3 → пин 14
        • R4 → пин 16
      • Столбцы (Columns):
        • C1 → пин 0
        • C2 → пин 2
        • C3 → пин 4
        • C4 → пин 6

    Рис. 2. Схема подключения клавиатуры 4x4

  4. Написание и загрузка кода

    • Установите перемычку PRG | RUN в положение PRG.
    • В Arduino IDE введите следующий код. Он реализует описанный выше алгоритм сканирования.

      // Массив, который хранит символы на кнопках
      char keys[4][4] = {
        {'1','2','3','A'},
        {'4','5','6','B'},
        {'7','8','9','C'},
        {'*','0','#','D'}
      };
      
      // Пины, к которым подключены строки и столбцы
      byte rowPins[4] = {8, 12, 14, 16}; 
      byte colPins[4] = {0, 2, 4, 6};
      
      void setup() {
        Serial.begin(9600);
      
        // Настраиваем пины строк на выход
        for (int i = 0; i < 4; i++) {
        pinMode(rowPins[i], OUTPUT);
        digitalWrite(rowPins[i], HIGH); // Подаём высокий уровень по умолчанию
        }
      
        // Настраиваем пины столбцов на вход с подтяжкой
        for (int i = 0; i < 4; i++) {
        pinMode(colPins[i], INPUT_PULLUP);
        }
      }
      
      void loop() {
        // Сканируем клавиатуру
        for (int r = 0; r < 4; r++) {
        // Подаём LOW на текущую строку
        digitalWrite(rowPins[r], LOW);
      
        // Проверяем все столбцы
        for (int c = 0; c < 4; c++) {
            // Если на столбце тоже LOW, кнопка нажата
            if (digitalRead(colPins[c]) == LOW) {
              // Выводим символ с этой кнопки
              Serial.print("Нажата кнопка: ");
              Serial.println(keys[r][c]);
              delay(200); // Задержка для защиты от дребезга
            }
        }
      
        // Возвращаем на строку HIGH перед переходом к следующей
        digitalWrite(rowPins[r], HIGH);
        }
      }
      
    • Нажмите кнопку «Upload», чтобы загрузить код на плату.
  5. Проверка работы

    • Откройте Монитор последовательного порта (скорость 9600 бод).
    • Нажимайте на разные кнопки клавиатуры. В мониторе порта вы должны видеть соответствующий символ, например: Нажата кнопка: 5 Нажата кнопка: # Нажата кнопка: B

Результаты

Вы успешно подключили матричную клавиатуру и написали программу, которая определяет каждое нажатие. Вы на практике освоили метод сканирования — один из самых распространённых приёмов в микроконтроллерной технике для работы с большим количеством кнопок.

Анализ результатов

  • Двумерный массив keys[4][4]. Позволяет удобно хранить символы в виде таблицы, соответствующей физическому расположению кнопок.
  • Вложенные циклы for. Внешний цикл перебирает строки, а внутренний — столбцы, реализуя сам алгоритм сканирования.
  • INPUT_PULLUP. Использование внутренних подтягивающих резисторов на столбцах упрощает схему и позволяет определять LOW при нажатии.

Выводы

В этой лабораторной работе вы научились работать с матричной клавиатурой и поняли, как с помощью хитрого программного подхода можно экономить пины микроконтроллера. Этот навык необходим для создания любых устройств, где требуется ввод данных: кодовых замков, калькуляторов, пультов управления.

Вопросы для самопроверки

  1. Почему матричное подключение кнопок выгоднее, чем индивидуальное?
  2. Объясните своими словами алгоритм сканирования клавиатуры.
  3. Зачем в коде используется INPUT_PULLUP для столбцов?
  4. Что произойдёт, если убрать строку digitalWrite(rowPins[r], HIGH); в конце внешнего цикла for?
  5. Как можно использовать полученные знания для управления чем-либо? Например, как зажечь светодиод L1 при нажатии кнопки «A»?

Вы научились работать с матричной клавиатурой!