4.01.4. Лабораторная работа №4.1.4.md
Матричная клавиатура
Тема работы
Мы научились работать с одной кнопкой, но что, если нам нужно подключить 16 кнопок, как на кодовом замке или калькуляторе? Использовать 16 пинов для этого — непозволительная роскошь. В этой лабораторной работе мы познакомимся с матричной клавиатурой 4x4 и изучим умный метод сканирования, который позволяет управлять 16 кнопками, используя всего 8 пинов.
Цель
- Понять принцип устройства и работы матричной клавиатуры.
- Освоить алгоритм матричного сканирования для опроса кнопок.
- Написать программу, которая определяет, какая именно из 16 кнопок нажата, и выводит её символ в монитор порта.
Оборудование и материалы
- Отладочная плата
Рудирон. - 1 матричная клавиатура 4x4.
- 8 соединительных проводов.
- USB-кабель для подключения
Рудирона. - Компьютер с настроенной средой
Arduino IDE.
Ход работы
-
Как устроена матричная клавиатура?
Внутри клавиатуры 16 кнопок расположены на пересечении 4-х строк и 4-х столбцов. Это похоже на таблицу или поле для игры в «Морской бой». Каждая кнопка — это просто выключатель, который при нажатии соединяет одну конкретную строку с одним конкретным столбцом.

Выводы клавиатуры как раз и соответствуют этим строкам и столбцам. Наша задача — программно определить, на каком пересечении произошло замыкание.
-
Алгоритм сканирования
Чтобы найти нажатую кнопку, мы будем использовать метод сканирования: 1. Настраиваем все пины строк как выходы (
OUTPUT), а пины столбцов — как входы (INPUT) с подтягивающими резисторами. 2. По очереди подаём низкий уровень (LOW) на одну строку, в то время как на всех остальных строках держим высокий уровень (HIGH). 3. В этот момент быстро считываем состояние всех столбцов. 4. Если на каком-то из столбцов мы считалиLOW, это значит, что кнопка на пересечении активной строки и этого столбца нажата! 5. Повторяем этот процесс для каждой строки.Микроконтроллер делает это так быстро, что для нас реакция на нажатие кажется мгновенной.
-
Сборка схемы
- Подключите 8 выводов клавиатуры к цифровым пинам
Рудирона. Важно не перепутать строки и столбцы. Обычно выводы идут по порядку: 4 для строк, 4 для столбцов.- Строки (Rows):
- R1 → пин 8
- R2 → пин 12
- R3 → пин 14
- R4 → пин 16
- Столбцы (Columns):
- C1 → пин 0
- C2 → пин 2
- C3 → пин 4
- C4 → пин 6
- Строки (Rows):

- Подключите 8 выводов клавиатуры к цифровым пинам
-
Написание и загрузка кода
- Установите перемычку
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», чтобы загрузить код на плату.
- Установите перемычку
-
Проверка работы
- Откройте Монитор последовательного порта (скорость 9600 бод).
- Нажимайте на разные кнопки клавиатуры. В мониторе порта вы должны видеть соответствующий символ, например:
Нажата кнопка: 5Нажата кнопка: #Нажата кнопка: B
Результаты
Вы успешно подключили матричную клавиатуру и написали программу, которая определяет каждое нажатие. Вы на практике освоили метод сканирования — один из самых распространённых приёмов в микроконтроллерной технике для работы с большим количеством кнопок.
Анализ результатов
- Двумерный массив
keys[4][4]. Позволяет удобно хранить символы в виде таблицы, соответствующей физическому расположению кнопок. - Вложенные циклы
for. Внешний цикл перебирает строки, а внутренний — столбцы, реализуя сам алгоритм сканирования. INPUT_PULLUP. Использование внутренних подтягивающих резисторов на столбцах упрощает схему и позволяет определятьLOWпри нажатии.
Выводы
В этой лабораторной работе вы научились работать с матричной клавиатурой и поняли, как с помощью хитрого программного подхода можно экономить пины микроконтроллера. Этот навык необходим для создания любых устройств, где требуется ввод данных: кодовых замков, калькуляторов, пультов управления.
Вопросы для самопроверки
- Почему матричное подключение кнопок выгоднее, чем индивидуальное?
- Объясните своими словами алгоритм сканирования клавиатуры.
- Зачем в коде используется
INPUT_PULLUPдля столбцов? - Что произойдёт, если убрать строку
digitalWrite(rowPins[r], HIGH);в конце внешнего циклаfor? - Как можно использовать полученные знания для управления чем-либо? Например, как зажечь светодиод
L1при нажатии кнопки «A»?
Вы научились работать с матричной клавиатурой!
- Страницы
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home
-
imgs
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home