Матричные клавиатуры до сих пор еще применяются в качестве устройств ввода информации в проектах на микроконтроллерах. Обычный способ подключения такой клавиатуры к микроконтроллеру заключается в использовании нескольких портов ввода/вывода. В свою очередь, микроконтроллер выполняет алгоритм сканирования, чтобы определить, какая кнопка была нажата пользователем. Недостаток такого способа – необходимость использования достаточно большого количества портов микроконтроллера для обслуживания клавиатуры. Например, для подключения клавиатуры 4×3 потребуется семь свободных линий ввода/вывода. Это становится проблемой, когда в проекте планируется использование микроконтроллера с малым количеством выводов, или когда микроконтроллер не имеет свободных портов.
Для решения этой проблемы можно использовать специализированные микросхемы расширителей портов или цепочки резисторов для подачи определенного напряжения на каждую кнопку совместно с АЦП микроконтроллера для определения нажатия конкретной кнопки. Каждое решение имеет свои недостатки.
Многие расширители портов для обмена данными требуют коммуникации по специальным протоколам (например, I2C или SPI), потому в этом случае микроконтроллер должен иметь встроенные коммуникационные интерфейсы, или пользователь должен реализовать их программно, что повысит нагрузку на ядро. С другой стороны, назначение каждой кнопке определенного напряжения с помощью резисторов может быть затруднительным при большом количестве кнопок и приводит к сужению диапазона напряжений для каждой кнопки. Кроме того, сопротивление резисторов может изменяться с температурой, что совместно с узким диапазоном напряжений приведет к неправильному определению нажатий. Другой существенный недостаток этого способа – обязательное наличие в микроконтроллере аналогового входа (АЦП).
В статье мы рассмотрим способ подключения клавиатуры, который эффективно решает все вышеуказанные проблемы и имеет несколько преимуществ: требуются только две линии ввода/вывода независимо от числа используемых кнопок, не используются специальные коммуникационные протоколы, не нужен АЦП. Идея заключается в использовании двух доступных микросхем CD4017 (десятичный счетчик-делитель).
На Рисунке 1 изображена схема модуля матричной клавиатуры 4×3. Резисторы R1, R4, R5 и R6 используются для ограничения тока; резистор R7, диоды D4, D5 и D6 образуют логический элемент ИЛИ.
Далее мы рассмотрим, как реализовать этот метод для сканирования кнопок матричной клавиатуры 4×3. Одна микросхема счетчика CD4017 используется для контроля строк (IC2), другая – для контроля столбцов клавиатуры (IC1).
Микроконтроллер генерирует тактовый сигнал и подает его на вход CLK счетчика, контролирующего столбцы. Первоначально выходы Q0 двух счетчиков находятся в состоянии лог. 1 и значение счетчика IC1 инкрементируется на 1 с каждым тактовым импульсом. На четвертый импульс счетчик IC1 сбрасывается и одновременно инкрементирует значение счетчика IC2, управляющего строками клавиатуры. Счетчик IC2 сбросится через пять импульсов, поступающих от счетчика IC1, обслуживающего столбцы. При генерировании одного тактового импульса микроконтроллер должен инкрементировать значение переменной COUNT (Рисунок 2) и сбрасывать ее в 1 на пятом тактовом импульсе для счетчика IC2.
Выход матричной клавиатуры через логический элемент ИЛИ подключается в выводу внешнего прерывания микроконтроллера.
Программный счетчик тактовых импульсов инкрементируется после генерирования микроконтроллером тактового импульса; значение счетчика соответствует номеру нажатой кнопки на данный момент.
Сигнал прерывания вырабатывается только в том случае, когда нажатой кнопке соответствует лог. 1 одновременно в строке и столбце. В обработчике прерывания микроконтроллер считывает значение переменной в момент, соответствующий нажатию кнопки.
Счетчик тактовых импульсов, реализованный в микроконтроллере, инкрементируется в моменты их генерирования. Значение в этом счетчике соответствует номеру нажатой кнопки на клавиатуре. Блок-схема программы микроконтроллера на Рисунке 2 наглядно демонстрирует этот алгоритм.
Обратите внимание, несмотря на то, что в примере мы рассматриваем клавиатуру 4×3, при данном способе можно управлять клавиатурой 10×10, задействовав оставшиеся выходы обеих микросхем CD4017. Кроме того, применив каскадное включение счетчиков, количество кнопок можно увеличить, если в этом есть необходимость.