Так и делаю иногда в реальной клавиатуре, но не для 256 отсчетов же. void KbdService(void) // into timer interrupt 1 ms
{
if (prescaler<4) { prescaler++; return;}
prescaler=0;
switch (interrupt_counter) // to reduce time of function
{
case 0: interrupt_counter=1; //refresh statuses
kbd_status3=kbd_status2;
kbd_status2=kbd_status1;
kbd_status1=kbd_status0;
kbd_status0=Kbd;
if (kbd_status0) pressed_keys|=0x80;
interrupt_counter=interrupt_counter;
break;
case 1: interrupt_counter=2; //check pressed key every tic
pressed_keys=kbd_status0&kbd_status1&kbd_status2;
if (pressed_keys&(~kbd_status3))
if (bSound==SoundAlwaysOn) Beep(5,1);
found_events|=pressed_keys&(~kbd_status3); // found edge
if ((pressed_keys==kUp+kDn)&& // now this two keys
((~kbd_status3)&(kUp+kDn)))//and before it wasn't so
{found_events|=kUpDn; // set new bit
found_events&=~(kUp+kDn); break; } //reset usual bits
if ((pressed_keys==kUp+kSt)&& // now this two keys
((~kbd_status3)&(kUp+kSt)))//and before it wasn't so
{found_events|=kUpSt; // set new bit
found_events&=~(kUp+kSt); break; }//reset usual bits
if ((pressed_keys==kDn+kSt)&& // now this two keys
((~kbd_status3)&(kDn+kSt)))//and before it wasn't so
{found_events|=kDnSt; // set new bit
found_events&=~(kDn+kSt); break; } //reset usual bits
break;
case 2: interrupt_counter=3; //check if key the same as before
if ((pressed_keys&kUp)||(pressed_keys&kDn)) //key for repeat
{ if (pressed_keys==old_pressed_keys) // same key?
{ if (pressed_counter) // yes, time over?
{ pressed_counter--; //No
}
else
{ pressed_counter=NextDelay; //Yes
found_events=pressed_keys; //reset
if (same_key_counter>15)
{ speed=30;
}
else
{ same_key_counter++;
speed=5;
}
}
}
else // other key
{ pressed_counter=StartDelay;
speed=1;
same_key_counter=0;
}
}
else
{ speed=1;
same_key_counter=0;
}
old_pressed_keys=pressed_keys;
break;
case 3: interrupt_counter++;
break;
default: interrupt_counter=0;
}
}