Подключение клавишной панели (клавиатуры) к микроконтроллеру AVR ATmega32

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

Подключение клавишной панели к ATmega32: внешний вид

Необходимые компоненты

Аппаратное обеспечение

  1. Микроконтроллер ATmega32 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. JHD_162ALCD (ЖК дисплей 16×2) (купить на AliExpress).
  4. Клавишная панель (клавиатура) 4х4 (купить на AliExpress).
  5. Конденсатор 100 мкФ (купить на AliExpress).
  6. Конденсатор 100 нФ (купить на AliExpress).
  7. Резистор 10 кОм (8 шт.) (купить на AliExpress).
  8. Источник питания с напряжением 5 Вольт.

Программное обеспечение

  1. Atmel Studio версии 6.1 (или выше).
  2. Progisp или flash magic (необязательно).

Работа схемы

Схема устройства приведена на следующем рисунке.

В представленной схеме PORTB микроконтроллера ATmega32 соединен с портом данным жидкокристаллического (ЖК) дисплея. При этом следует помнить о том, что необходимо деактивировать JTAG интерфейс микроконтроллера на порту PORTC при помощи изменения фьюзов (fuse bytes) если мы хотим использовать PORTC как обычный порт ввода/вывода. В ЖК дисплее (если мы не хотим использовать черный цвет) можно задействовать только 14 его контактов: 8 контактов для передачи данных (7-14 или D0-D7), 2 контакта для подачи питания (1&2 или VSS&VDD или gnd&+5v), 3-й контакт для управления контарстностью, 3 контакта для управления (RS&RW&E).

В представленной схеме мы использовали только 2 контакта управления ЖК дисплея для лучшего понимания работы схемы. Бит контраста и READ/WRITE используются нечасто, поэтому они могут быть замкнуты на землю. Это обеспечивает ЖК дисплею максимальную контрастность и переводит его в режим чтения. Теперь нам всего лишь нужно контролировать контакты ENABLE и RS чтобы передавать на ЖК дисплей символы и данные. Также на нашем сайте вы можете прочитать более подробную статью о подключении ЖК дисплея к микроконтроллеру ATmega32.

В схеме необходимо сделать следующие соединения с ЖК дисплеем:
PIN1 или VSS — земля
PIN2 или VDD или VCC — +5v питание
PIN3 или VEE — земля (обеспечивает максимальный контраст ЖК дисплею)
PIN4 или RS (Register Selection) – контакт PD6 микроконтроллера
PIN5 или RW (Read/Write) — земля (переводит ЖК дисплей в режим чтения что упрощает взаимодействие с ним для начинающих)
PIN6 или E (Enable) — контакт PD5 микроконтроллера
PIN7 или D0 — контакт PB0 микроконтроллера
PIN8 или D1 — контакт PB1 микроконтроллера
PIN9 или D2 — контакт PB2 микроконтроллера
PIN10 или D3 — контакт PB3 микроконтроллера
PIN11 или D4 — контакт PB4 микроконтроллера
PIN12 или D5 — контакт PB5 микроконтроллера
PIN13 или D6 — контакт PB6 микроконтроллера
PIN14 или D7 — контакт PB7 микроконтроллера

В схеме мы использовали 8-битную связь (D0-D7) ЖК дисплея с микроконтроллером, хотя можно было ограничиться и 4-битной – но в этом случае код программы стал бы немного сложнее. Таким образом, мы использовали 10 контактов ЖК дисплея, 8 из которых будут использоваться для передачи данных и 2 для управления.

Принципы работы клавишной панели

Клавишная панель, по сути, представляет собой мультиплексор («уплотнитель») клавиш. Кнопки на ней соединены в мультиплексированной форме чтобы уменьшить количество используемых контактов.

Если рассматривать случай без мультиплексирования (уплотнения), то для работы клавишной панели 4х4 (16 кнопок) нам бы понадобилось 16 контактов, но это не очень хорошо с точки зрения управления подобной системой. Уменьшение числа используемых контактов достигается соединением кнопок клавишной панели в мультиплексированной (объединенной) форме.

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

Объединим эти кнопки по столбцам как показано на следующем рисунке.

Как показано на рисунке, немаркированные концы всех четырех кнопок в столбце объединены в одно соединение, таким образом для 16 кнопок мы имеем 4 столбца.

Вместо объединения по столбцам можно использовать и объединение по строкам как показано на следующем рисунке.

Если мы используем объединение одновременно и по строкам, и по столбцам, то мы получим схему, представленную на следующем рисунке.

Здесь мы имеем 16 кнопок в мультиплексированной форме чтобы уменьшить количество контактов клавишной панели. Если бы мы использовали вариант без мультиплексирования, то нам бы понадобилось для соединения с 16 кнопками использовать 16 контактов микроконтроллера, здесь же нам будет достаточно всего лишь 8 контактов.

Внешний вид подобной клавишной панели со шлейфом показан на следующем рисунке.

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

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

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

Теперь мы на выводе R1 имеем высокое напряжение.
Таким образом, мы имеем высокое напряжение на C1 в первом случае и высокое напряжение на R1 во втором случае, поэтому мы можем однозначно идентифицировать позицию в рассматриваемой нами матрице соединений и определить что была нажата кнопка 1.

Если будет нажата кнопка 2, то мы будем иметь сигнал высокого уровня на выходе C1 в первом случае и сигнал высокого уровня на выходе R2 во втором случае. Сопоставляя эти факта (то есть наличие сигнала высокого уровня на C1 и R2), мы однозначно можем определить что была нажата кнопка 2.

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

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

Исходный код программы на языке C (Си) с пояснениями

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке C (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

Видео, демонстрирующее работу схемы


Примечание: к этой записи прикреплена форма для оценки. Чтобы оценить её, зайдите на сайт.

6 ответов к “Подключение клавишной панели (клавиатуры) к микроконтроллеру AVR ATmega32”

Во всех условиях где if (keypressed== 0bxxxxxxxx) нужно поменять нули на единицы, а единицы на нули. При моделировании Proteus видно что потенциалы снижаются при нажатии. И при реальной прошивке МК код приведённый выше не работает.

Да, 16 раз.
А ещё функции непонятно откуда взятые:
void send_a_command(unsigned char command);
void send_a_character(unsigned char character);
void send_a_string(char *string_of_characters);

Да и на клавиатуру можно питание не тащить, она и без него отрабатывает.

Добрый день!
Попробовал сделать данную схему. Залил прошивку (скопировал ваш код), но в протеус при нажатии на кнопки ничего не происходит. На экране не выводится даже надпись «PRESS A KEY». Использовал LM016L. Скажите, пожалуйста, что необходимо добавить или поменять, чтобы все заработало?

Добрый вечер. К сожалению я сталкивался с моделированием в протеусе только схем обычной электроники, без использования микроконтроллеров, поэтому я не знаю как заставить в протеусе исполняться программе на микроконтроллере. Могу здесь только посоветовать отладку программы по частям. Например, удалите из программы все кроме вывода приветственного сообщения на экран дисплея. Если это заработает, тогда пробуйте добавлять в программу другие элементы из представленного в данной статье кода. По сути, программа достаточно проста и прямолинейна. Не вижу причин чтобы она не работала. Ну если только опечатка в нее маленькая где-нибудь закралась

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *