Главная » Статьи » Как подключить

Подключение матричной клавиатуры 4х4 к микроконтроллеру
 На страницах этого сайта уже была представлена работа по созданию и использованию клавиатуры, но она была сенсорная. Те, кому нужен вариант попроще, чаще выбирают стандартные кнопочные клавиатуры, в которых кнопки соединены матрицей. Такое соединение кнопок позволяет сократить число выводов необходимых для подключения к микроконтроллеру.
 Чаще всего встречаются клавиатуры 3х4 и 4х4 с 12-ю и 16-ю кнопками, соответственно. У меня в руках оказалась клавиатура 4х4. Работу с ней сейчас и рассмотрим.

 У меня оказалась вот такая клавиатура с мембранными контактами. Хороша тем, что в толщину составляет всего 1 мм и легко может приклеиваться к нужным поверхностям.



 Потыкав по кнопкам, с помощью мультиметра установил как соединены кнопки внутри клавиатуры. 



 Для сканирования матричных клавиатур в Bascom-AVR существует специальная функция  Getkbd(). Эта команда заточена под использование клавиатур 4х4, поэтому она использует все 8 выводов одного порта микроконтроллера. И в случае использования клавиатур c меньшим числом кнопок стоит это учитывать.
 Конфигурирование команды заключается в назначении порта, к которому будет подключена клавиатура, время прохождения дребезга контактов и задержка после определения нажатия

к примеру, в следующей строке:

Config Kbd = Portd , Debounce = 20 , Delay = 100

сконфигурировано подключение клавиатуры к PortD, время дребезга установлено 20 мс, время задержки после нажатия 100 мс

 Эта команда берет на себя всю работу по сканированию строк клавиатуры и возвращает переменной номер нажатой клавиши от 0 до 15. Если нажатия на кнопку не зафиксировано, тогда функция вернет число 16. Дальше, в зависимости от того как соединены кнопки, может потребоваться узнать символ нажатой кнопки. 

 В приведенном ниже примере, сканирование клавиатуры происходит с частотой 10 Гц и находится в главном цикле программы. Результат нажатий выводится на ЖК дисплей.


$regfile = "m8def.dat"
$crystal = 1000000

'конфигурация дисплея
Config Lcdpin=Pin,Rs=Portc.0,E=Portc.1,Db4=Portc.2,Db5=Portc.3,Db6=Portc.4,Db7=Portc.5
Config Lcd = 20 * 4
Cursor Off
Cls

'конфигурация клавиатуры
Config Kbd = Portd , Debounce = 20 , Delay = 100


'переменные
Dim Key_char As Byte                          'номер нажатой клавиши
Dim Key_str As String * 1                     'символ нажатой клавиши на клавиатуре
Dim Result As String * 20                     'результат нажатий на клавиатуру

Result = ""

'Главный цикл программы
Do

Key_char = Getkbd()    'клавиша не нажата и функция возвращает переменной значение 16

If Key_char <> 16 Then    'если переменная не равна 16, значит была нажата кнопка
Key_str = Lookupstr(key_char , Keyboard_data)   'вытаскиваем символ нажатой клавиши
Result = Result + Key_str
End If

Locate 1 , 1

Lcd Result                                  'выводим на дисплей результат нажатий

Waitms 100

Loop

End

Keyboard_data:
Data "1" , "4" , "7" , "*" , "2" , "5" , "8" , "0"
Data "3" , "6" , "9" , "#" , "A" , "B" , "C" , "D"



А вот тестовая схемка, по которой подключаются дисплей и клавиатура:

 Еще в схему не мешало бы добавить токоограничительные резисторы на линию клавиатуры, номиналом 100-150 Ом. На всякий случай, но для пробы сойдет и так (главное не нажимать сразу несколько кнопок)

 Подключаем, прошиваем, тыкаем на кнопки и видим результат - на дисплей выводятся символы нажатых клавиш:





Позже добавлю демонстрационное видео, как только найду чем снять в приличном качестве.

А пока можно скачать архив в котором находится файл для симуляции в Proteus и прошивка.


Категория: Как подключить | Добавлено: 03.07.2012
Просмотров: 37463 | Комментарии: 23 | Рейтинг: 5.0/7
Всего комментариев: 23
23 Kasym   (01.12.2017 16:18) [Материал]
Нашел интересный косяк: если к переменной string*5 добавлять string*1 много раз, то портятся значения переменной, которая хранится в памяти рядом со string*5.
Таким образом операция Result = Result + Key_str приведёт к проблемам

0  
22 exersizze   (29.09.2016 07:30) [Материал]
Исходник прямо в тексте, перед схемой...

21 romaadereyko   (29.09.2016 01:31) [Материал]
хотелось бы увидеть исходники, очень хочу разобраться

20 Cerber   (26.07.2015 16:44) [Материал]
Юзал этот код. Вот снова к нему вернулся. Хороший сайт, хорошие примеры, молодцы!

19 exersizze   (23.10.2013 20:07) [Материал]
Да точно также, только функцию опроса клавиатуры придется писать свою: выставляем на первой ножке высокий уровень, сканируем столбец на нажатие, затем выставляем высокий уровень на второй ножке и сканируем второй столбец, ну и так далее..

18 vovan303   (22.10.2013 17:25) [Материал]
А как можно подключить не 16 кнопок, а 36, 6х6 то есть. Как это можно реализовать?

17 exersizze   (01.05.2013 22:38) [Материал]
terabit85, хорошая идея, спасибо!

+2   Спам
16 terabit85   (01.05.2013 00:04) [Материал]
Спасибо за статью. Хочу внести одно дополнение: приведенный код (точнее команда) не использует прерывания, что при большом объеме кода вызывает затруднения при вводе. При удержании клавиши начинаются повторы символов.
Если добавить в конец первого в примере If следующие строки:

1:
Key_char = Getkbd()
If Key_char <> 16 Then
Goto 1
End If

то мы избегаем повторения символов при удержании клавиши. Можем хоть минуту давить на кнопку, а символ будет один.

15 exersizze   (11.09.2012 21:11) [Материал]
Вроде ничего особенного, функция никаких особых ресурсов микроконтроллера не требует. Возможно протеус криво поломанный, вот и вылетает.

14 4ester   (11.09.2012 20:39) [Материал]
программа вылетает даже с вашим примером, не знаю как приклеить файл протеуса.

13 4ester   (11.09.2012 20:38) [Материал]
есть какие то особенности работы этой функции? пишу программу для кодового замка, для проверки идеи написал под 8 мегу, все в протеусе работает как надо, переделываю исходник под тину 2313, запускаю в протеусе, и вылетает куча ошибок, не пойму в чем дело. Программа запинается при сканировании, функция возвращает вообще непонятное число, и при сравнении If Key_char <> 16 Then вылетает программа.

12 exersizze   (09.09.2012 14:10) [Материал]
к сожалению никак, с командой Getkbd() нельзя нажимать одновременно больше одной клавиши, иначе будет кз на одной из линий.

11 4ester   (09.09.2012 12:19) [Материал]
с предыдущим вопросом вроде бы разобрался,появился другой, как с помощью этой функции отследить что нажаты одновременно 2 кнопки к примеру * и # ??

10 4ester   (09.09.2012 11:35) [Материал]
Объясните пожалуйста как работают эти 2 строчки
Key_str = Lookupstr(key_char , Keyboard_data)
Result = Result + Key_str

9 amv2000   (06.07.2012 19:35) [Материал]
Ну на выходе ЦАП меньше шума чем на ШИМ, а на ebay как в Греции всё есть.

8 exersizze   (06.07.2012 08:59) [Материал]
Быстрее то он быстрее, согласен. Но думаю что разницы особо не будет что ШИМом что ЦАПом регулировать напряжение в ЛБП
ebay наше все) клаву брал там
http://www.ebay.com/sch/i.html?_sacat=0&_nkw=4+x+4+keyboard+membrane

7 amv2000   (05.07.2012 19:27) [Материал]
В какой области? да лабораторный источник питания.
Кстати exersizze а где Вы приобрели клавиатуру узнать можно?

6 pchela5   (05.07.2012 14:28) [Материал]
>вот вместо ШИМ было бы интересно попробовать.
В какой области?

5 amv2000   (05.07.2012 08:09) [Материал]
Да нет синус как бы тоже пока не нужен, а вот вместо ШИМ было бы интересно попробовать. Потому как бытует мнение, что ШИМ медленнее работает в отличие от ЦАП.

4 exersizze   (04.07.2012 20:25) [Материал]
В планах подобного небыло, может когда-нибудь и появится такая необходимость.
А что с ними делать, синус генерировать? smile

3 amv2000   (04.07.2012 19:39) [Материал]
Спасибо как раз недавно читал про директиву Getkbd(), а про подключение внешнего ЦАП можно будет увидеть статью ?

2 tenevikus   (04.07.2012 18:21) [Материал]
good
спасибо

1 niko-lay   (04.07.2012 11:48) [Материал]
Да резисторы лучше поставить, а то при одновременном нажатии на кнопки одного столбца может погореть порт.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация