Термин «12‑9‑15 ключ в матрице» часто встречается в обсуждениях клавиатурных матриц, схем сканирования и оптимизации количества выводов микроконтроллера. В этой статье мы разберём, что означают эти цифры, как они влияют на построение матрицы, какие схемы позволяют минимизировать количество I/O‑пинов, и как реализовать сканирование в реальном проекте.
Содержание
- Что такое клавиатурная матрица?
- Разбор чисел 12‑9‑15
- Сколько выводов нужно?
- Использование декодеров (3‑to‑8, 4‑to‑16)
- Алгоритм сканирования
- Практический пример: микроконтроллер ATmega328P
- Полезные советы и типичные ошибки
Что такое клавиатурная матрица?
Клавиатурная матрица – это способ подключения большого количества кнопок (ключей) к ограниченному числу выводов микроконтроллера. Кнопки размещаются в виде строк и столбцов. При замыкании клавиши соединяется соответствующая строка и столбец, и микроконтроллер может определить, какая именно клавиша нажата, последовательно сканируя строки и проверяя состояние столбцов (или наоборот).
Преимущества матричного подключения:
- Экономия выводов: вместо N × M выводов достаточно N + M.
- Упрощённое разводка печатной платы.
- Возможность масштабировать клавиатуру без изменения микроконтроллера.
Разбор чисел 12‑9‑15
Три числа в названии «12‑9‑15» обычно обозначают:
- 12 – общее количество клавиш (ключей) в матрице.
- 9 – количество строк (или столбцов) в «основной» конфигурации.
- 15 – количество выводов микроконтроллера, задействованных после оптимизации (например, с использованием декодеров).
Почему именно такие цифры? Рассмотрим несколько типовых вариантов построения:
Прямая матрица 3 × 4 (12 клавиш)
Для 12 клавиш достаточно 3 строки + 4 столбца = 7 выводов. Однако в реальных проектах часто требуется добавить дополнительные функции (подсветка, защита от дребезга, тестовые точки), что может увеличить количество используемых выводов.
Расширенная матрица 9 × ? (9 строк)
Оптимизация до 15 выводов
В проектах, где микроконтроллер имеет ограниченное количество свободных портов, используют декодеры (3‑to‑8, 4‑to‑16) или мультиплексоры. Это позволяет «увеличить» количество логических линий, используя лишь несколько физических выводов. В итоге получаем 15 выводов (например, 12 для матрицы + 3 для управления декодером).
Сколько выводов нужно?
Общая формула для прямой матрицы без вспомогательных микросхем:
IO = R + C где R – количество строк, C – количество столбцов.
Для 12‑ключевой матрицы оптимальные варианты:
| Конфигурация | R | C | IO (без декодера) | IO (с декодером) |
|---|---|---|---|---|
| 3 × 4 | 3 | 4 | 7 | 7 (декодер не нужен) |
| 4 × 3 | 4 | 3 | 7 | 7 |
| 6 × 2 | 6 | 2 | 8 | 8 |
| 9 × 2 | 9 | 2 | 11 | 11 |
| 15 × 8 (с 3‑to‑8 декодером) | 15 | 8 | 23 | 18 (15 строки + 3 управляющих) |
Как видим, самая «экономичная» конфигурация – 3 × 4, но если требуется разместить клавиши в определённом физическом виде (например, 9‑строчный набор), то придётся использовать больше выводов либо добавить декодер.
Использование декодеров (3‑to‑8, 4‑to‑16)
Декодер – это микросхема, которая преобразует несколько входных сигналов в один из нескольких взаимно исключающих выходов. Наиболее популярные:
- 74HC138 – 3‑to‑8 декодер.
- 74HC154 – 4‑to‑16 декодер.
Пример применения 3‑to‑8 декодера для матрицы 15 × 8:
- Подключаем 3 управляющих вывода микроконтроллера к входам A0‑A2 декодера.
- Выходы Y0‑Y7 декодера соединяем с 8 столбцами.
- 15 строк напрямую подключаем к 15 выводам микроконтроллера.
В результате для 120 потенциальных соединений (15 × 8) требуется только 15 + 3 = 18 выводов микроконтроллера.
Плюсы использования декодера
- Сокращение количества I/O‑пинов.
- Упрощённое программное сканирование (один цикл – одна строка).
- Низкая стоимость (декодер стоит от $0,10).
Минусы
- Дополнительные задержки из‑за логических уровней.
- Необходимо учитывать уровень логики (TTL vs CMOS).
- Увеличивается сложность схемы питания (нужен отдельный VCC/GND для декодера).
Алгоритм сканирования
Сканирование матрицы обычно реализуется в виде простого цикла:
for each row R: set R to LOW (или HIGH – в зависимости от схемы) read all columns C if any column reads LOW (или HIGH) → клавиша нажата set R back to HIGH (или LOW)
Ниже – пример кода на Arduino (C++) для матрицы 3 × 4 (12 клавиш) без декодера:
const uint8_t rows[3] = {2, 3, 4}; // выводы строк
const uint8_t cols[4] = {5, 6, 7, 8}; // выводы столбцов
void setup {
// Настраиваем строки как выходы, столбцы – как входы с подтяжкой
for (uint8_t i = 0; i < 3; ++i) pinMode(rows[i], OUTPUT);
for (uint8_t i = 0; i < 4; ++i) pinMode(cols[i], INPUT_PULLUP);
Serial.begin(9600);
}
void loop {
for (uint8_t r = 0; r < 3; ++r) {
// Активируем текущую строку
digitalWrite(rows[r], LOW);
// Считываем столбцы
for (uint8_t c = 0; c < 4; ++c) {
if (digitalRead(cols[c]) == LOW) {
Serial.print("Key pressed: row ");
Serial.print(r);
Serial.print(", col ");
Serial.println(c);
}
} // Деактивируем строку
digitalWrite(rows[r], HIGH);
}
delay(10); // антидребезг
}
Для схемы с 3‑to‑8 декодером алгоритм почти не меняется, только управление «строками» заменяется записью в три управляющих вывода декодера.
Практический пример: микроконтроллер ATmega328P
Допустим, нам нужен 12‑ключевой блок, но у микроконтроллера уже заняты 8 выводов (UART, SPI, датчики). Мы решаем использовать 3‑to‑8 декодер, чтобы сократить количество новых выводов до 4 (3 управляющих + 1 для чтения столбцов).
Схема подключения
- Выходы Y0‑Y7 декодера → 8 столбцов (поскольку нам нужно только 4, используем Y0‑Y3).
Код Arduino (управление декодером)
// Управление 74HC138
const uint8_t decA = 2; // PD0
const uint8_t decB = 3; // PD1
const uint8_t decC = 4; // PD2
const uint8_t rowPins[15] = {5,6,7,8,9,10,11,12,13, A0, A1, A2, A3, A4, A5};
const uint8_t colPin = A6; // общий столбец (читаем LOW/ HIGH)
// Функция вывода нужного адреса в декодер (0‑7)
void selectColumn(uint8_t col) {
digitalWrite(decA, col & 0x01);
digitalWrite(decB, (col >> 1) & 0x01);
digitalWrite(decC, (col >> 2) & 0x01);
}
void setup {
pinMode(decA, OUTPUT);
pinMode(decB, OUTPUT);
pinMode(decC, OUTPUT);
pinMode(colPin, INPUT_PULLUP);
for (uint8_t i = 0; i < 15; ++i) pinMode(rowPins[i], OUTPUT);
Serial.begin(9600);
}
void loop {
for (uint8_t col = 0; col < 4; ++col) { // сканируем только 4 столбца
selectColumn(col);
for (uint8_t r = 0; r < 15; ++r) {
digitalWrite(rowPins[r], LOW); // активируем строку
if (digitalRead(colPin) == LOW) {
Serial.print("Key ");
Serial.print(r*4 + col); // уникальный номер клавиши 0‑59
Serial.println(" pressed");
}
digitalWrite(rowPins[r], HIGH); // деактивируем строку
}
}
delay(5);
}
Этот код демонстрирует, как с помощью трёх управляющих выводов можно «переключать» до 8 столбцов, а строки сканировать последовательно.
Полезные советы и типичные ошибки
- Дребезг контактов. Даже при использовании аппаратного подтягивания рекомендуется добавить программный антидребезг (5‑10 мс) или применять специальные библиотеки (Bounce2).
- Обратная связь. При подключении светодиодных индикаторов к тем же линиям, что и кнопки, необходимо использовать транзисторы или драйверы (ULN2803), иначе произойдёт «залипание».
- Ток нагрузки. Декодер 74HC138 может выдержать лишь несколько миллиампер на каждый выход. Не подключайте напрямую светодиоды без резисторов.
- Питание. Убедитесь, что VCC и GND декодера надёжно соединены с питанием микроконтроллера, иначе уровни логики могут смещаться.
- Тестирование. Сначала проверьте каждую строку и столбец отдельно (мультиметром), чтобы убедиться в отсутствии коротких замыканий.
- Оптимизация кода. При работе с большим количеством строк (15+), используйте битовые маски и порты (например,
PORTB,PINB) вместо функцииdigitalWrite– это ускорит сканирование в десятки раз.
Термин «12‑9‑15 ключ в матрице» отражает типичную задачу по построению клавиатурной матрицы из 12 кнопок, размещённых в 9 строках (или столбцах) с ограниченным количеством доступных выводов микроконтроллера. При правильном подборе конфигурации (например, 3 × 4 или 9 × 2) и использовании дешевых декодеров можно сократить количество используемых I/O‑пинов до 15 или даже меньше, не теряя надёжности сканирования.
Ключевые выводы:
- Определите оптимальное соотношение строк × столбцов в зависимости от физического расположения клавиш.
- Если выводов не хватает – применяйте декодеры (3‑to‑8, 4‑to‑16) или мультиплексоры.
- Реализуйте сканирование с учётом антидребезга и, при необходимости, ускорьте код через прямой доступ к портам.
- Тщательно проверяйте схему на короткие замыкания и согласованность уровней логики.
Следуя этим рекомендациям, вы сможете построить надёжную клавиатурную матрицу «12‑9‑15», которая будет работать стабильно даже в условиях ограниченного количества выводов микроконтроллера.
Дата публикации: