Вот продукт. Я понимаю идею: эти 16 кнопок используют матрицу 4х4. 4 строки для строк, 4 строки для столбцов, и у нас есть 8 кабелей.
Но:
Как это может работать без мультиплексора?
Может ли это точно определять нажатия нескольких кнопок? Даже если кнопки используют ту же строку или тот же столбец? Пример: кнопки в положении (2,2) (2,3), (3,2) и (3,3) нажаты одновременно.
Как это работает?
Ответы:
Это не так. Клавиатура, кажется, имеет только переключатели, возможно, с некоторыми диодами, которые мы не видим. Тем не менее, левая плата выглядит так, как будто на ней установлен процессор. Почти наверняка мультиплексирование делается в прошивке.
Алгоритм мультиплексирования работает примерно так:
Вышеописанный процесс повторяется достаточно быстро, так что все кнопки проверяются в течение времени, которое все еще ощущается человеком-наблюдателем. Человеческий предел «мгновенного» в этом контексте составляет около 50 мс. Даже младший микроконтроллер может сканировать клавиатуру 4x4 за гораздо меньшее время.
Вероятно, да. Одним из способов является последовательное включение диода с каждой кнопкой. Они могут быть на нижней стороне доски, которую вы показываете. С диодами описанный выше алгоритм просто работает.
Другой способ заключается в последовательном соединении резисторов с линиями и измерении их аналогового напряжения. Даже если несколько кнопок закорачивают несколько строк строк / столбцов, вы можете в конечном итоге выяснить, какие кнопки были нажаты. Для этого требуются входы A / D в микро, а не только цифровые входы, как при использовании диодов.
источник
Без диодов ... вы получите фантомные прямоугольники.
Например, в вашем примере (2,2) (2,3), (3,2) и (3,3); Вы выбрали иронический пример, выбрав прямоугольник. Если вы на самом деле нажмите все четыре, он будет работать. Но если вы нажмете какие-либо три угла прямоугольника, четвертый угол также будет казаться нажатым, даже если это не так.
Эта клавиатура явно предназначена для ввода данных с клавиатуры, где пользовательское соглашение - одно нажатие клавиши за раз. Вы заметили, что на клавиатуре ввода кредитной карты автозаправочной станции нет клавиш «shift».
Однако, если вы сделали S1 клавишей Shift, а S3 клавишей Alt-Shift, чтобы пользователи могли разумно удерживать обе клавиши, одновременно нажимая S13, тогда S15 также будет выглядеть нажатой.
источник
Вот как это сделать без постоянного сканирования:
источник
Я сделал это с помощью языка ассемблера на голых микроконтроллерах Atmel AVR.
Для простоты: Строки клавиатуры: используйте контакты Arduino 4,5,6 и 7 (контакты AVR PD4, PD5, PD6 и PD7). Столбцы клавиатуры: используйте контакты Arduino 8, 9, 10 и 11 (контакты AVR PB0, PB1, PB2 и PB3. ) Сделайте входные выводы с включенными подтягиваниями. Сделать вывод столбцов и выводить на них нули. Разрешить прерывания смены контактов на всех выводах строк и столбцов. http://playground.arduino.cc/Main/PinChangeInterrupt Нажатие кнопки на клавиатуре приведёт к низкому значению строки. Процедура прерывания должна прочитать выводы строки и определить, какой вывод низкий. Старшие 4 бита должны быть три единицы и один ноль. Если вы используете 8-битную переменную uint8_t, вы можете разделить ее на 16 или (var >> 4), чтобы поместить 4 бита в младшие биты числа. Вы можете использовать побитовое ИЛИ | операция с 240, чтобы установить верхние 4 бита на 1 с, и побитовая операция НЕ ~, чтобы инвертировать все биты, чтобы у вас был установлен только один бит, представляющий строку, в которой было нажатие кнопки. Сохраните это число как 0, 1, 2 или 3.
Переключите конфигурацию контактов:
Сделайте входы столбцов с включенными подтягиваниями. Сделайте вывод рядных выводов и выведите на них нули. Прочитайте контакты столбца и найдите, какой из них низкий. Выполните аналогичные манипуляции с этим значением, за исключением того, что вам не нужно сдвигать число вправо. После var ^ 240 и ^ var у вас есть один бит для представления столбца, на котором была нажата клавиша. Не забудьте отключить прерывания перед перенастройкой портов, так как это, вероятно, вызовет нежелательные прерывания. Возможно, вам придется очистить флаги прерывания при выходе из процедуры прерывания, чтобы предотвратить дублирование обработки прерываний.
источник