Дребезг появляется в момент нажатия / размыкания кнопки, в момент удержания - он маловероятен, если же конечно Вы не используете отечественные силовые кнопки с огромным усилием нажатия. Первое нажатие клавиши фиксируется по внешнему прерыванию, возникает дребезг от замыкания пластины с контактами внутри клавиши, мы входим в прерывание и запрещаем его, запускаем таймер (на дребезг нам делается все равно, а за 250 мс он угомонится) и продолжаем опрос по таймеру через 250 мс, для определения вторичного нажатия (если имеет место быть удержание клавиши). Как определили что клаву мацать закончили (при очередном прерывании нет повтора нажатой кнопки), то опять разрешаем внешнее прерывание. И все по новому циклу, ждем внешнее прерывание. Для устранения эффекта притормаживания устройства при быстром наборе, в каждом прерывании по таймеру надо смотреть на нажатие новой клавиши, те новый прочитаный код совпал с прошлым кодом или нет. Если нет, то определяется нажатие другой кнопки. Время 250 - это на любителя, за 50 - не каждый успеет палец убрать. Реально я делал время сканирования в пределе 200 - 300 мс, работало аж самому нравилось как.