На страницах этого сайта уже была представлена работа по созданию и использованию клавиатуры, но она была
сенсорная. Те, кому нужен вариант попроще, чаще выбирают стандартные кнопочные
клавиатуры, в которых кнопки соединены матрицей. Такое соединение кнопок
позволяет сократить число выводов необходимых для подключения к
микроконтроллеру.
Чаще всего встречаются клавиатуры 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 и прошивка.