В некоторых простых методах контроля нажатия кнопок используется минимальное количество входов. Для этого используются RC-цепочки, в которых измеряется время срабатывания для идентификации нажатой кнопки, или используется вход АЦП с резисторным делителем для каждой нажимаемой кнопки.
В данном небольшом проекте используется всего лишь один вывод микроконтроллера для контроля нажатия до 15 кнопок. Используемый микроконтроллер должен иметь на борту встроенный компаратор с выбираемыми значениями для внутреннего источника опорного напряжения VREF. Большинство 8-битных PIC микроконтроллеров среднего семейства имеют один или два внутренних компаратора, что вполне подходит для выполнения нашего проекта.
Алгоритм работы следующий:
1. Состояние простоя, Vref = (1 / 24).Vdd. Vcin- = 0 < Vref — Cout = 1
2. Нажата любая кнопка — Vcin->Vref — Cout = 0 — Вызов прерывания
3. Внутри прерывания, увеличивается Vref = (i / 24).Vdd, где i = от 2 до 15, пока Vref > Vсin- — Cout = 1 далее — была нажата кнопка Btn(i-1).
(если Vref остается < Vсin-, тогда i = 16 — была нажата кнопка Btn15)
4. Четыре светодиода будут отображать двоичный код нажатой кнопки.
Рис. 1. Схема контроля нажатия 15 кнопок
На Рисунке 1 показан 8-битный микроконтроллер PIC12F683, контролирующий 4-битный светодиодный дисплей, который отображает какая из кнопок была нажата. Программа обработки прерывания от компаратора мгновенно реагирует на любую нажатую кнопку. Подпрограмма проверяет по кругу значения VREF, пока на выходе компаратора COUT не появляется высокий потенциал, который будет означать, что одна из кнопок была нажата.
Полностью завершенный программный код на ассемблере с комментариями имеет всего лишь 100 слов. Он не слишком оптимизирован, поэтому вы сможете с легкостью его адаптировать для любого другого микроконтроллера.