люблю я теоретизирование

я одно время был озабочен какой-то стандартизацией обработок кнопки в своих проектах, и даже 5-6 проектов сделал по этому "стандарту"... а потом как-то снова скатился в ... в разнообразие скатился.
сделал я два уровня абстракции: нижний, где определена единственная функция get_scancode(), возвращающая код нажатой кнопки, и верхний, где реализована функция get_key(), реализующая нужный протокол обработки.
get_scancode() делает минимум: собирает битовые состояния всех кнопок в один единственный байт, таким образом этот байт соответствует сканкоду, если говорить в терминах больших компов. откуда этот сканкод берется - дело программиста: можно опрашивать по битику разные порты, можно сразу один порт, если все кнопки на нем висят, можно ждать, пока какая-то переменная будет обновлена в прерывании (например, при совмещении линий кнопок с другими функциями, обычно с дисплеем). можно эту функцию даже макросом заменить, только тогда модульность нарушится...
get_key() делает больше: обращается к get_scancode() и затем борется с дребезгом, сравнивая предыдущий сканкод с новым, а затем отсчитывает задержки для автоповтора. алгоритм работы этой функции не зависит от способа получения сканкода. get_key() в основном реализует следующий алгоритм: если кнопка нажата и удерживается, то отсчитывается интервал до первого автоповтора, после чего возвращается сканкод. любое последующее обращение к get_key() обрабатывается иначе: если кнопка все еще удерживается нажатой, то выдача сканкода происходит после задержки автоповтора. если обнаруживается, что состояние кнопок изменилось, например, когда нажали вторую, не отпустив первую, то один раз возвращается NO_KEY (нет нажатых кнопок), после чего происходит обработка, как будто было первое нажатие, т.е. сначала задержка перед автоповтором, а потом автоповтор.
задержка перед автоповтором у меня обычно от 1 до 3 секунд, в зависимости от проекта. а задержка автоповтора обычно 0,5-0,3 сек. такие задержки позволяют четко отличить ДОЛГОЕ УДЕРЖАНИЕ кнопки от кратковременного нажатия, и при этом позволяет производить достаточно быстрое изменение параметра при удержании, но не требует особой реакции от пользователя.
как-то так...