Вот продукт. Идея мне понятна: эти 16 кнопок используют матрицу 4х4. 4 линии для строк, 4 линии для столбцов, и у нас есть 8 кабелей.
Но:
Как это может работать без мультиплексора?
Может ли это точно определять нажатия нескольких кнопок? Даже если кнопки используют одну и ту же строку или один и тот же столбец? Пример: кнопки в положении (2,2) (2,3), (3,2) и (3,3) нажаты одновременно.
Как это работает?
Как это может работать без мультиплексора?
Это не так. На плате клавиатуры, кажется, есть только переключатели, возможно, с некоторыми диодами, которые мы не видим. Однако левая плата выглядит так, как будто на ней есть процессор. Почти наверняка в прошивке делается мультиплексирование.
Алгоритм мультиплексирования работает примерно так:
Описанный выше процесс повторяется достаточно быстро, так что все кнопки проверяются за время, которое для человека-наблюдателя все еще кажется мгновенным. Человеческий предел «мгновенного» в этом контексте составляет около 50 мс. Даже самый дешевый микроконтроллер может просканировать клавиатуру 4x4 за гораздо меньшее время.
Может ли это точно определять нажатия нескольких кнопок?
Вероятно, да. Один из способов - поставить диод последовательно с каждой кнопкой. Они могут быть на нижней стороне доски, которую вы показываете. С диодами как раз работает описанный выше алгоритм.
Другой способ - последовательно подключить резисторы к линиям и измерить их аналоговое напряжение. Даже с несколькими кнопками, замыкающими несколько строк/столбцов вместе, вы можете в конечном итоге выяснить, какие кнопки нажаты. Для этого требуются аналогово-цифровые входы в микроконтроллере, а не только цифровые входы, как при использовании диодов.
Без диодов вы получите фантомные прямоугольники.
Например, в вашем примере (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 с, и побитовая операция NOT ~, чтобы инвертировать все биты, чтобы у вас был только один бит, представляющий строку, в которой было нажатие кнопки. Сохраните это число как 0, 1, 2 или 3.
Переключите конфигурацию контактов:
Сделайте входы штифтов столбца с включенными подтягиваниями. Make Row pins Output и выводите на них нули. Прочитайте контакты столбца и найдите, какой из них низкий. Проделайте аналогичные манипуляции с этим значением, за исключением того, что вам не нужно сдвигать число вправо. После var ^ 240 и ^var у вас есть один бит для представления столбца, в котором была нажата клавиша. Не забудьте отключить прерывания перед перенастройкой портов, так как это, скорее всего, вызовет нежелательные прерывания. Возможно, вам придется сбросить флаги прерывания при выходе из процедуры обработки прерывания, чтобы предотвратить повторную обработку прерывания.
ТониМ
Баш
Марсело Эспиноза Варгас
Баш
Марсело Эспиноза Варгас
ТониМ
Баш
ТониМ
Баш
MOV A,@0X11;disable WDT
, не особенно просто понять, как работает клавиатура с несколькими нажатиями кнопок...Габор
Мэтью Уайтд
Ник Т
слебетман
Крис Х
воливейраджр