Цитата(Anjey_N @ Mar 13 2008, 21:51)

Необходимость есть, переведи! :help:
Эх... :)
Там статья то объемненькая :)
У меня щас есть время только функцию описать.
State = (State<<1) | !RawKeyPressed() | 0xe000;
оно же в двоичном виде: (State<<1) | !RawKeyPressed() | 1110 0000 0000 0000;
State изначально = 16 ноликов.
На этом шаге мы сдвигаем State влево, а на место нулевого бита ставим 0 если кнопка нажата, иначе 1.
При этом старшие три бита всегда единички.
Дергаем нашу функцию каждые 10мс.
Тогда при нажатии кнопки (если она была отпущена) State с каждым шагом будет меняться так:
1111 1111 1111 1111 -- кнопка отпущена
1111 1111 1111 1110 -- нажали кнопку
1111 1111 1111 1100 -- держим
1111 1111 1111 1001 -- пошел дребезг
1111 1111 1111 0010
...
1111 1110 1010 1101 -- вот сколько дребезга дофига было :)
1111 1101 0101 1010 -- вот тут контакты успокоились и пошли к нам нолики ровным строем
1111 1010 1011 0100
...
1111 1101 0000 0000 -- вот сколько уже ноликов пришло и продолжают идти...
Это первая часть алгоритма. А вторая -- это условие
if(State==0xf000)return TRUE;
То есть сравниваем State с 1111 0000 0000 0000.
А состояние 1111 0000 0000 0000 означает, что кнопка нажата уже 12 ноликов подряд, и перед этими 12-ю шагами она как минимум один шаг была не нажата (единичка в 13-м разряде).
Ну вот собственно когда условие выше описанное выполняется регистрируем нажатие кнопки: возвращаем true.
Это все можно заточить под себя меняя 0xe000 и 0xf000.
И вообще алгоритм простой и быстрый, функцию можно по всякому модифицировать. Вот например я так сделал:
//------------------------------------------------------
//--- Debounce switch action
//--- function operate on external debounce-state variable
// работает с внешней переменной состояния чтоб сразу несколько кнопок опрашивать
int DebouncePress(int RawButtonPressed(char), char button, unsigned int *state){
*state = (*state<<1) | !(RawButtonPressed(button)) | 0xe000;
if(*state == 0xf000) return 1; // Pressed Нажата
if(*state == 0xefff) return 0; // Released Отпущена
return -1; // Unstable Идет дребезг
}
//-------------------------------------------------------