Всегда делал так:
Опрос кнопок (соответствующий бит равен нулю), как только её состояние изменилось - процедура обработки нажатия клавиши, а также увеличение счётчика на единицу. Следующий опрос - не ранее чем через 100 мс. Если нажата - то счётчик опять увеличивается на 1, но процедура обработки не вызывается до тех пор, пока счётчик не станет равным 20 (2 сек). А вот уж тут опять вызов процедуры. Причём если через 100 мс кнопка опять нажата, то и вызов процедуры произойдёт через 100 мс. Если же кнопка отпущена - то сброс счётчика.
Этим я добиваюсь такого эффекта:
Первое нажатие - реакция мгновенная. Если кнопка удерживается менее 2 сек - то считается, что это одно нажатие (удобно для увеличения/уменьшения какого-нибудь параметра на единицу). Если нажата более 2 сек, то автоматически 10 раз в сек. вызывается обработка нажатия. То есть, ускоренное увеличение нужного параметра после продолжительного нажатия.
Физически нажимать кнопку быстрее 50-70 мс затруднительно. Так что задержка 100 мс - вполне оптимальная. И если надо быстро нажать, скажем, 5 раз, то проблем, как правило, не возникает.
|