О подключении матричной клавиатуры, чаще всего 4х4, к микроконтроллерам AVR написано немеряно постов. Кто-то в своих разработках пользуется готовыми библиотеками, кто-то пишет свои. Я отношусь к последним, хотя перед написанием любой программы внимательно изучаю уже готовые по тематике. При написании библиотек для себя я стараюсь делать их максимально простыми и универсальными. В представленном здесь примере обработки матричной клавиатуры использован следующий принцип.
В микроконтроллере для обслуживания столбцов матрицы разряды портов используются как входы с pull-up резисторами, а для обслуживания строк — как выходы с лог. «1». Поочерёдно на каждую строку подаётся лог. «0», при этом проверяется состояние столбцов. Зная номер строки с «нулём» — a, находим столбец с «нулём» — b; из этого делается вывод, что нажата клавиша Sa-b. Как видите ничего сложного.
Примеры программной реализации вышеописанного алгоритма я неоднократно встречал в интернете. Но в них всегда была привязка к конкретным портам, по крайней мере строк или столбцов. У меня в проекте, в заголовочном файле, для управления столбцами и строками можно назначить любые свободные разряды любых портов. Т.е. нет привязки к конкретным портам — это очень удобно! Для того, чтобы собрать схему на макете или использовать в своём устройстве, в файлах kk.h и lcd.h распределите разряды портов для обслуживания клавиатуры и управления ЖК? и будет вам счастье! Пример чисто демонстрационный: выводит на ЖК? символ нажатой клавиши (я использовал телефонную тастатуру 3×4). Столбцы и строки распихал по контроллеру в случайном порядке.
Функции файла kk.c — это заготовки. Поэтому к их применению в своих проектах подходите творчески. Проще всего вызывать функцию опроса клавиатуры с определённой периодичностью по таймеру (раз в 50 ms) — таким образом решится заодно и проблема дребезга контактов.
Также не составит труда изменить/дополнить функции при другом количестве строк или/и столбцов.
В архиве папка с проектом.
Успехов, уважаемые коллеги!
Доброго времени суток!
Сразу скажу, что программист я начинающий, так что сразу не ругайте сильно. Публикация,а именно «Матричная клавиатура», опубликованная 05.10.2011 автором s_black, мне понравилась, познал для себя много нового в плане методики построения самой программы и ньюансов по обработке матричной клавиатуры с пом. МК AVR. Спасибо, все толково и доходчиво! Единственный вопрос — в конце файла lcd.c имеются две функции, одна из них — функция вывода строки из FLASH на LCD по адресу, а другая — функция вывода строки из ROM на LCD по адресу. Если можно проясните пож. как эти функции работают в данном конкретном коде. Если они приведены в тексте кода на дальнейшее домысливание, то как их можно применить. Заранее благодарен, с уважением, Kazemir.
Спасибо!
Насчёт Вашего вопроса… В общем-то Вы на него сами и ответили. Одна функция выводит строку на заданное знакоместо ЖК? из флеша, а вторая — из ОЗУ. ?спользовать их очень просто. Разместите соответствующую строку в памяти (или флеш или ОЗУ). В программе вызывайте функцию, задавая знакоместо на ЖК? (adress) и адрес строки через указатель (*string). Следите за длиной строки (чтобы поместилась на ЖК?).
Нехорошая идея использовать активные выходы с 1 и 0. Настанет время, будут нажаты несколько кнопок — и Ваша активная 1 встретится с вашим активным 0.
Все должно быть на pull-up.
Да… Вы абсолютно правы ((( Правильнее строки тоже оставить входами с подключенным резистором. ?, сканируя, переключать их на выход с нулём. Завтра исправлю и проверю. Спасибо.
Привет s_black я новичок на этом сайте и хотел бы спросить почему у меня символы выводятся сами по себе когда я подвожу руку к клаве и стоит один символ не меняясь когда рука не прикасается к ней? Программирую я в CVAVR и клава 4 на 4.
Клаву подключил к порту D контроллера Atmega16, задал направления отдельных битов, присвоил строкам лог 1 а столбцы не стал трогать, они на выход. В общем последовательно в цикле while присваивал лог 0 каждой строке и проверял на 0 столбцы.
столбцы на вход и все линии подключил через резисторы по 2 КОМ, строки на выход.
Трудно сказать не видя монтажа… Скопируйте и проверьте мой код — он стопроцентно рабочий.
Я не использую готовый код а только идею обработки нажатий клавиш. Код не использую. Вот структура клавы http://s018.radikal.ru/i516/1305/1c/f64642cb6453.png
и сам проект DDS-генератора
http://s41.radikal.ru/i094/1305/ba/ef7ec2452ee6.jpg
http://s017.radikal.ru/i400/1305/e3/8a6fbaa19eb0.jpg
http://i080.radikal.ru/1305/cf/37a28616d6ff.jpg
Биты порта D 3,2,1 и 0 установил как выходы, а 4,5,6 и 7 как входы. Поочерёдно присваиваю строкам лог. 0, а столбцы неактивны. Создал переменную и верчу её в цикле «for» от 0 до 3 и проверяю нажатие в операторе «if». Вот код:
Другие инициализации портов я опустил.