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

Линейка микроконтроллеров STM32 представляет собой достаточно интересный объект для изучения. Часто можно услышать мнение, что работа с ним сложна для начинающего и лучше браться за что – нибудь более простое. В этой статье мы постараемся показать, что микроконтроллеры STM32 не так страшны.

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

При работе, описанной в данной статье, использовалась отладочная плата STM32F4Discovery и матричная клавиатура, в нашем случае, имеющая 7 выводов. Среда разработки CoIDE 1.7.6.

Для того, чтобы разобраться в программе, реализующей данную операцию, необходимо иметь минимальные знания и навыки работы с портами ввода/вывода и системными таймерами. С существующими методами подключения клавиатуры можно познакомиться по ссылке [1].

Перед тем, как приступать к написанию программы, определимся с условными обозначениями:

  • Выводы, к которым подключается клавиатура, разделены на две группы: сканирующие и питающие (рисунок 1). Сканирующие выводы работают на вход. Все питающие выводы по умолчанию установлены в нулевое состояние, но после первого сброса таймера TIM2 на выводе PA3 будет установлено напряжение логической «1», поэтому с некоторым приближением можно сказать, что на питающих выводах в момент времени, близкий к начальному, выставлена комбинация «1-0-0-0».
  • По тексту программы обозначения выводов будут соответствовать рисунку 1, т.е. значения выводов PA0, PA1, PA2  при их опросе записываются в переменные a, b, c соответственно, для дальнейших операций с ними.
  • Питающие выводы PA3 – РА4 имеют обозначения от 1 до 4, именно под такими номерами они упоминаются в тексте программы.

  • Рисунок 1 – Подключение клавиатуры

    Перейдем к описанию алгоритма действия программы. После включения питания запускаются два таймера (TIM2 и TIM3), которые работают циклически, т.е. при завершении счета выполняются некоторые действия (эти действия прописаны в функциях обработчиках прерываний от таймеров TIM2 и TIM3) и отсчет начинается заново. По окончании первого отсчета таймера TIM2 на выводе РА3 появляется уровень логической «1», который каждый раз, при окончании счета этого таймера, смещается на одну позицию вниз. При этом микроконтроллер всегда «знает», на каком выводе в данный момент находится уровень напряжения логической «1», эта информация хранится в переменной out_state. Операцию по «сдвигу» логической «1» выполняет функция TIM2_IRQHandler (обработчик прерывания от таймера 2).

    Таймер TIM3 при окончании каждого цикла сканирует состояние выводов РА0-РА2, записывая полученные результаты в переменные a, b и c. Затем, микроконтроллер сравнивает на каком из питающих выводов находится напряжение логической «1» (переменная out_state) и какой из выводов РА0 – РА2 имеет высокий логический уровень (переменные a, b, c). Эти действия выполняет функция TIM3_IRQHandler (обработчик прерывания от таймера 3).

     При нажатии, например, кнопки «3», высокий логический уровень должен быть установлен на выводе РА3 и зарегистрирован на выводе PA0. При выполнении данного логического выражения микроконтроллер «поймет», что была нажата клавиша «3» и при нажатии этой кнопки выполнит предписанное ему действие, в нашем случае погасит все светодиоды, а далее зажжет зеленый светодиод. 

    Используемая процедура сравнения позволяет различать между собой одновременное нажатие одной, 2-х, 3-х и более клавиш (при доработке функции TIM3_IRQHandler) и присвоение такому событию определенного действия.

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

    Очень важно разобраться, какие выводы на клавиатуре соответствуют нажатым клавишам. Необходимо выделить строки и столбцы (деление на строки и столбцы в данном случае весьма условно, потому что это зависит от формы и положения клавиатуры. Примем по умолчанию, что столбцы – это линия «3-6-9-#» и т.д., а строки – «3-2-1» и т.д.), т.к. столбцы соединяются со сканирующими выводами, строки – с выводами питания. Для правильного определения выводов на матричной клавиатуре необходимо подключить один из щупов мультиметра, находящегося в режиме прозвонки, к любому крайнему контакту, а второй щуп подключать к остальным контактам, одновременно нажимая на клавиши, расположенные в одном столбце. Если при нажатии на любую клавишу два вывода не прозваниваются – это значит, что они оба принадлежат к одной группе (строчных или столбиковых выводов). После того, как все выводы будут разбиты на две группы, можно переходить к определению порядка их размещения внутри групп. При этом, при фиксированном подключении к одному столбиковому выводу, необходимо менять контакты из второй группы нажимая одновременно с этим лишь клавиши, принадлежащие к одному столбцу.

    Поясним выше сказанное на примере. Подключаем щуп мультиметра к крайнему столбчатому выводу, а второй к любому строчному и проверяем последовательно каждую клавишу из столбика, соответствующего выбранному столбиковому выводу, на прозвонку. При появлении контакта смотрим на номер нажатой клавиши и каким выводам из рисунка 1 соответствует это событие. Далее мы переносим соответственно значение для столбикового контакта и строчного.

    Теперь поговорим об инициализации используемой периферии. В этом проекте используются порты A и D, как порты ввода-вывода, а так же таймеры TIM2 и TIM3. Листинг программы снабжен подробными комментариями по пунктам настройки периферии.

    Использование системных таймеров позволяет избежать «регистрации» дребезга контактов, а так же освобождает достаточно большое количество машинного времени, потому что в программе полностью исключены функции задержек.

    К сожалению, данная программа лишена простой возможности настройки кода под себя, но, если разобрать код построчно, то Вы сможете реализовать подключение клавиатур различного размера и функционала, как цифровых, так и символьных. Кроме этого изменяя код обработчика таймера TIM2, можно привязывать к клавишам определенные функции или вывод символов на экран (данный проект находится в разработке).

    Статья подготовлена с использованием методических указаний [2].

    Библиографический список

  • http://easyelectronics.ru/matrichnaya-klaviatura.html
  • Лабораторный практикум по изучению микроконтроллеров STM32 на базе отладочного модуля STM32F3 Discovery и STM32F4 Discovery / Бугаев В.И., Мусиенко М.П., Крайнык Я.М. – Москва-Николаев: МФТИ-ЧГУ, 2014. – 26 с.

  • Прикрепленные файлы:

    Добавить комментарий

    Ваш адрес email не будет опубликован.