- Зачем нужна клавиатура 4х4:
- Как работает матричная клавиатура 4x4:
- Требуемый материал:
- Принципиальная электрическая схема:
- Объяснение программирования:
Клавиатуры - широко используемые устройства ввода, используемые в различных проектах электроники и встраиваемых систем. Они используются для ввода данных в виде цифр и алфавитов и передачи их в систему для дальнейшей обработки. В этом уроке мы собираемся связать матричную клавиатуру 4x4 с PIC16F877A.
Прежде чем вдаваться в подробности логики и научиться пользоваться клавиатурой, нам нужно кое-что узнать.
Зачем нужна клавиатура 4х4:
Обычно мы используем один вывод ввода-вывода микроконтроллера для считывания цифрового сигнала, как вход переключателя. В нескольких приложениях, где для ввода требуются 9, 12, 16 ключей, если мы добавим каждый ключ в порт микроконтроллера, мы получим 16 портов ввода / вывода. Эти 16 портов ввода / вывода предназначены не только для чтения сигналов ввода / вывода, но их также можно использовать в качестве периферийных соединений, например, поддерживает ADC, I2C, соединения SPI также поддерживаются этими выводами ввода / вывода. Поскольку эти контакты связаны с переключателями / клавишами, мы не можем использовать их, но только как порты ввода-вывода. В этом нет никакого смысла. Итак, как уменьшить количество выводов? Ответ - использование шестнадцатеричной клавиатуры или матричной клавиатуры; мы можем уменьшить количество булавок, которые связывают матричные ключи 4x4. Он будет использовать 8 контактов, из которых 4 соединены в ряды и 4 соединены в столбцы, что позволит сэкономить 8 контактов микроконтроллера.
Как работает матричная клавиатура 4x4:
На верхнем изображении слева показан модуль матричной клавиатуры. Справа показано внутреннее соединение, а также соединение с портом. Если мы видим, что порт имеет 8 контактов, первые 4 слева направо - это X1, X2, X3 и X4 - это строки, а последние 4 слева направо - это Y1, Y2, Y3, Y4 - четыре столбца. Если мы сделаем 4 строки или сторону X в качестве вывода и сделаем им низкий логический уровень или 0, а также сделаем 4 столбца в качестве входных и прочитаем ключи, мы прочитаем нажатие переключателя, когда соответствующий Y получит 0.
То же самое произойдет в матрице nxn, где n - число. Это может быть 3x3, 6x6 и т. Д.
А теперь подумайте, что нажата 1. Тогда 1 находится в строке X1 и столбце Y1. Если X1 равен 0, то Y1 будет 0. Таким же образом мы можем определить каждую клавишу в строке X1, определив столбцы Y1, Y2, Y3 и Y4. Это происходит с каждым переключателем, и мы будем считывать положение переключателей в матрице.
Каждый зеленый кружок - это переключатель, и оба они соединены вместе одинаковым образом.
В этом руководстве мы будем сопоставлять клавиатуру со следующими характеристиками:
- Мы будем использовать внутреннее подтягивание
- Мы добавим опцию устранения отказов ключа
Но когда переключатели не нажаты, нам нужно установить Y1, Y2, Y3 и Y4 на высокий уровень или 1. В противном случае мы не сможем обнаружить изменения логики при нажатии переключателя. Но мы не могли сделать это с помощью кодов или программ, потому что эти контакты используются как вход, а не выход. Итак, мы будем использовать внутренний регистр операций в микроконтроллере и работать с этими выводами в режиме включения слабого подтягивания. При использовании этого режима будет активирован высокий логический уровень, когда он находится в состоянии по умолчанию.
Кроме того, когда мы нажимаем кнопку, возникают всплески или шум от контактов переключателя, и из-за этого происходит многократное нажатие переключателя, чего не ожидается. Итак, мы сначала обнаружим нажатие переключателя, подождем несколько миллисекунд, снова проверим, нажат ли переключатель по-прежнему или нет, и если переключатель все еще нажат, мы наконец примем нажатие переключателя, иначе нет. Это называется устранением дребезга переключателей.
Мы реализуем все это в нашем коде и сделаем соединение на макете.
Также проверьте, как взаимодействовать клавиатуру 4x4 с другими микроконтроллерами:
- Интерфейс клавиатуры с Arduino Uno
- Матричная клавиатура 4x4, взаимодействующая с микроконтроллером 8051
- Интерфейс клавиатуры 4x4 с микроконтроллером ATmega32
- Цифровой кодовый замок Raspberry Pi на макетной плате
Требуемый материал:
- Макетная плата
- Pic-kit 3 и среда разработки на вашем ПК, то есть MPLABX
- Провода и разъемы
- Символьный LCD 16x2
- Кристалл 20 МГц
- 2 керамических колпачка для дисков 33pF.
- Резистор 4,7 кОм
- Предустановка 10k (переменный резистор)
- Матричная клавиатура 4x4
- Адаптер на 5 В
Принципиальная электрическая схема:
Мы подключим кристаллы и резистор в соответствующие контакты. Также мы подключим ЖК-дисплей в 4-битном режиме через порт PORTD. Мы подключили шестнадцатеричную клавиатуру или матричную клавиатуру через порт RB4.
Если вы новичок в PIC, начните с раздела «Начало работы с микроконтроллером PIC: Введение в PIC и MPLABX».
Объяснение программирования:
Полный код для взаимодействия матричной клавиатуры с микроконтроллером PIC приведен в конце. Код прост и не требует пояснений. Библиотека клавиатуры - единственное, что нужно понимать в коде. Здесь мы использовали keypad.h и lcd.h Library для взаимодействия с клавиатурой и ЖК-дисплеем 16x2 . Итак, давайте посмотрим, что происходит внутри этого.
Внутри keypad.h мы увидим, что мы использовали заголовок xc.h, который является библиотекой регистров по умолчанию, частота кристалла определяется для использования задержки, используемой в файле kepad.c. Мы определили порты клавиатуры в регистре PORTRB и определили отдельные контакты как строку (X) и столбцы (Y).
Мы также использовали две функции: одну для инициализации клавиатуры, которая перенаправляет порт как выход и вход, и сканирование нажатия переключателя, которое возвращает состояние нажатия переключателя при вызове.
#включают
В keypad.c мы увидим, что функция ниже вернет нажатие клавиши, когда функция сканера клавиатуры не вернет 'n'.
char switch_press_scan (void) // Получить ключ от пользователя { char key = 'n'; // Предположим, что никакая клавиша не нажата while (key == 'n') // Подождать, пока не будет нажата клавиша key = keypad_scanner (); // Сканируем ключи снова и снова return key; // при нажатии клавиши возвращается ее значение }
Ниже представлена функция чтения с клавиатуры. На каждом шаге мы сделаем строки X1, X2, X3 и X4 равными 0 и прочитаем статус Y1, Y2, Y3 и Y4. Задержка используется для эффекта дребезга, когда переключатель все еще нажат, мы вернем значение, связанное с ним. Если ни один переключатель не нажат, мы вернем «n».
char keypad_scanner (недействительно) { X_1 = 0; X_2 = 1; X_3 = 1; X_4 = 1; если (Y_1 == 0) {__delay_ms (100); в то время как (Y_1 == 0); вернуть "1"; } если (Y_2 == 0) {__delay_ms (100); пока (Y_2 == 0); вернуть "2"; } если (Y_3 == 0) {__delay_ms (100); while (Y_3 == 0); вернуть "3"; } если (Y_4 == 0) {__delay_ms (100); while (Y_4 == 0); вернуть 'A'; } X_1 = 1; X_2 = 0; X_3 = 1; X_4 = 1; если (Y_1 == 0) {__delay_ms (100); в то время как (Y_1 == 0); вернуть «4»; } если (Y_2 == 0) {__delay_ms (100); пока (Y_2 == 0); вернуть "5"; } если (Y_3 == 0) {__delay_ms (100); while (Y_3 == 0); вернуть "6"; } если (Y_4 == 0) {__delay_ms (100); пока (Y_4 == 0); вернуть 'B'; } X_1 = 1; X_2 = 1; X_3 = 0; X_4 = 1; если (Y_1 == 0) {__delay_ms (100); пока (Y_1 == 0); вернуть «7»; } если (Y_2 == 0) {__delay_ms (100); пока (Y_2 == 0); вернуть '8'; } если (Y_3 == 0) {__delay_ms (100); while (Y_3 == 0); вернуть «9»; } если (Y_4 == 0) {__delay_ms (100); while (Y_4 == 0); вернуть 'C'; } X_1 = 1; X_2 = 1; X_3 = 1; X_4 = 0; если (Y_1 == 0) {__delay_ms (100); пока (Y_1 == 0); возвращение '*'; } если (Y_2 == 0) {__delay_ms (100); пока (Y_2 == 0); вернуть '0'; } если (Y_3 == 0) {__delay_ms (100); while (Y_3 == 0); возвращение '#'; } если (Y_4 == 0) {__delay_ms (100); пока (Y_4 == 0); вернуть 'D'; } return 'n'; }
Мы также установим слабую подтяжку на последних четырех битах, а также установим направление портов как последние 4 входа и первые 4 как выходные. OPTION_REG & = 0x7F; используется для установки режима слабого подтягивания на последних контактах.
недействительным InitKeypad (недействительным) { Keypad_PORT = 0x00; // Установить нулевые значения контактов порта клавиатуры Keypad_PORT_Direction = 0xF0; // Последние 4 контакта на входе, Первые 4 контакта на выходе OPTION_REG & = 0x7F; }
В основной программе PIC (приведенной ниже) мы сначала установили биты конфигурации и включили несколько необходимых библиотек. Затем в функциях void system_init инициализируем клавиатуру и ЖК-дисплей. И, наконец, в в главной функции мы прочитали клавиатуру, вызвав switch_press_scan () функцию и возвращает значение для ЖК.
Загрузите полный код с файлами заголовков отсюда и посмотрите демонстрационное видео ниже.