Алгоритм устранения дребезга выглядит так.
Язык описания - около Си.
CODE
unsigned char time;
void Some_timer_interrupt(void) // every 1 ms
{
time++;
}
unsigned char KEY_EVENT=0;
unsigned char key_state=0,Prev_key;
void Keyboard_task(void)
{
unsigned char key;
switch (key_state)
{
//state 0 -- wait for key press
case 0:
if (PIN()==xFF) break;
key_state=1; Prev_key=PIN();time=0;
break;
//state 1 - Убираем дребезг
case 1:
key=PIN();if (key<>Prev_key) {time=0;Prev_key=key;break;}//значение клавиатуры изменилось....
if (time>40) {if (key==0xFF) key_state=0; // ни фига - помеха проскочила....
else
{KEY_EVENT=key|0x80;key_state=2;} // ага, 40 миллисекунд клава стоит как вкопанная
};
break;
//ждем отжатия
case 2:
if (PIN()!=0xFF) {time=0;break;}// клава все еще не отжата
if (time>40) {key_state=0;KEY_EVENT=0x40};//40 миллисекунд как стабильно отжата. Можем послать сообщение //
//отжатии, а можем и не посылать. Обычно этого не требуется.
break;
}
}
Ну эта процедура вызывается время от времени. В фоновом цикле. Времени она не отъедает нисколько.
Сообщение отредактировал Omen_13 - Feb 22 2010, 05:13
Причина редактирования: Оформление кодбокса