Радиолюбители знают, что это такое, для не знающих кратко - любая кнопка по факту при нажатии вначале выдаёт серию очень коротких импульсов, а затем уже окончательно замыкает цепь. Аналогичное поведение и при отпускании. Причина - упругость контактов и отсутствие абсолютно твёрдых материалов.
Есть самодельная схема, где ничего особо оригинального нет - AtMega328P, 7-сегментный светодиодный индикатор (пока что 4 секции, думаю расширить до 6-8), 4 кнопки и куча датчиков (пока только климатические - на них удобно отладку делать, потом будут и иные).
Основная задача - подавление дребезга контактов при нажатии. Есть два момента, делающие задачу проще:
1. Нажатия двух и более кнопок одновременно не предвидится вообще. То есть, это отслеживать не надо, хотя реализация схемы и позволит. Кнопки подключены через диоды на выходы, управляющие разрядами дисплея, и заведены на общий вход. Диоды - чтобы не было замыкания на управляющих выходах.
2. Повтор нажатий при удержании не нужен, как минимум, на текущем этапе. То есть, схема такая: "нажал - отработала - ждём отпускания".
Идея алгоритма такова:
В схеме реализовано прерывание по таймеру 50 раз в секунду (интервал 20 миллисекунд) для обновления дисплея. Это более чем достаточно для подавления дребезга и вполне устраивает меня по быстродействию.
Допустим, изначально состояние "все кнопки отпущены", назовём его начальным. Плюс имеется флаг "кнопка сработала", установлен в ноль. Если нажато несколько кнопок - сразу возврат в это состояние.
При нажатии одной кнопки (на несколько не реагируем, см. предыдущий абзац) записываем её состояние. Если не совпадает с предыдущим (была отпущена, а теперь нажата), ждём следующий опрос. Если совпадает - смотрим на флаг срабатывания: если ноль - выполняем действие и устанавливаем в единицу, если уже единица - просто ждём отпускания.
При отпускании всех кнопок сбрасываем флаг срабатывания в ноль и переходим в начальное состояние.
Просьба указать, если в логике работы есть ошибки.
Asus Prime B460M-K, i5-10500, Intel 630 UHD + NVIDIA GeForce RTX3060, DDR4 32 GB, SSD 1TB + HDD 2TB | Linux Mint 22.3 Cinnamon + Windows 11


.