Рубрики
Схемы на PIC

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

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

Ранее на нашем сайте мы рассматривали подключение матричной клавиатуры к другим микроконтроллерам (платам):

Принципы работы матричной клавиатуры 4×4

В большинстве электронных проектов встраиваемой электроники используются клавиатуры с 9, 12 или 16 клавишами. Но если мы подключим 16-клавишную клавиатуру к микроконтроллеру обычным способом, то ее подключение займет 16 контактов ввода/вывода микроконтроллера и эти задействованные контакты уже не смогут выполнять каких либо других функций. 16 контактов для подключения клавиатуры – это очень много для микроконтроллеров, не обладающих большим числом доступных контактов.

Каким образом можно уменьшить это число контактов? Для этой цели можно использовать матричную или, как ее еще называют, шестнадцатеричную клавиатуру. К примеру, подобная клавиатура 4×4 задействует всего 8 контактов, 4 из которых подключены к ее строкам, а 4 – к столбцам. Поэтому ее подключение задействует всего 8 контактов микроконтроллера.

Как работает подобная клавиатура

Внешний вид и распиновка матричной клавиатуры 4×4 представлены на следующем рисунке.

Как видно из представленного рисунка, контакты X1, X2, X3 и X4 обозначают строки клавиатуры, а контакты Y1, Y2, Y3, Y4 – столбцы. Если мы подадим на контакты X логический 0 (low), а контакты столбцов сконфигурируем в режим ввода данных, то мы сможем считывать нажатия клавиш, при нажатии клавиши на соответствующем Y контакте будет логический 0.

Аналогичные процессы происходят и в других матричных клавиатурах размером nxn, например, 3×3, 6×6.

Допустим, в используемой нами матричной клавиатуре нажата клавиша 1 – ей соответствует строка X1 и столбец Y1. Если на X1 логический 0, то и на Y1 будет логический 0. Этим же самым образом мы сможем определить нажатие любой клавиши в строке X1, соответствующей столбцам Y1, Y2, Y3 и Y4. Аналогичным образом мы можем определить нажатия и других клавиш клавиатуры.

На представленном рисунке соответствующие пересечения строк и столбцов, соответствующие определенным клавишам, обозначены кругами зеленого цвета.

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

  • мы будем использовать внутренние подтягивающие резисторы микроконтроллера;
  • мы будем использовать опцию устранения дребезга контактов у кнопок.

Когда клавиши клавиатуры не нажаты, нам необходимо подавать на контакты Y1, Y2, Y3 и Y4 уровень high. Иначе мы не сможем обнаружить изменения логических уровней при нажатии клавиш. Но мы не можем сделать это поскольку данные контакты у нас используются в режиме ввода, а не вывода. Поэтому мы будем использовать внутренние подтягивающие регистры микроконтроллера и использовать эти контакты в слабом «подтягивающем» режиме. В данном режиме на контактах будет логический уровень high когда они будут в состоянии по умолчанию (default state).

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

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

  1. Микроконтроллер PIC16F877A (купить на AliExpress).
  2. Матричная клавиатура 4×4 (купить на AliExpress).
  3. Программатор PICkit 3 (купить на AliExpress).
  4. ЖК дисплей 16х2 (купить на AliExpress).
  5. Кварцевый генератор 20 МГц (купить на AliExpress).
  6. Конденсаторы 33 пФ (2 шт.) (купить на AliExpress).
  7. Резистор 4,7 кОм (купить на AliExpress).
  8. Потенциометр 10 кОм (купить на AliExpress).
  9. Адаптер питания на 5 V.
  10. Макетная плата.
  11. Соединительные провода.

Схема проекта

Схема подключения матричной клавиатуры 4×4 к микроконтроллеру PIC представлена на следующем рисунке.

В представленной схеме ЖК дисплей подключен к PORTD микроконтроллера PIC в 4-битном режиме. Матричная клавиатура подключена к контактам с RB0 по RB7 микроконтроллера.

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

Объяснение программы для микроконтроллера PIC

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Код программы достаточно простой, необходимо всего лишь понять принцип работы библиотеки для взаимодействия с матричной клавиатурой. В нашем проекте мы будем использовать библиотеки keypad.h и lcd.h.

Внутри библиотеки keypad.h мы будем подключать заголовочный файл xc.h. Клавиатура у нас подключена к порту PORTRB, индивидуальные контакты данного порта мы обозначим как строки (X) и столбцы (Y).

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

Код функции switch_press_scan(void), используемый для определения нажатой клавиши, приведен в файле keypad.c. Данная функция будет возвращать нажатую клавишу.

Далее представлен код функции keypad_scanner(void), используемой для считывания клавиши. На каждом шаге в этой функции мы будем подавать на строки X1, X2, X3 и X4 логический 0 и считывать состояние контактов Y1, Y2, Y3 и Y4. Для устранения эффекта дребезга контактов нажатых клавиш используется задержка. Функция будет возвращать нажатую клавишу. Когда никакая клавиша не нажата функция будет возвращать символ ‘n‘.

В функции инициализации клавиатуры мы подключим внутренние подтягивающие резисторы на контактах микроконтроллера, к которым подключена клавиатура и установим режимы работы контактов: первые 4 контакта – на вывод данных, а последние 4 контакта – на ввод данных.

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

Все необходимые файлы проекта можно скачать по этой ссылке.

Исходный код основной программы

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

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

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