#include "1000_Kbd.h"
#include "1000_ports.h"
#define LastKey 4
#define StatusBufferSize 3
#define StartDelay 200
#define NextDelay 30
const int bit_mask[16]={ BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, BIT8, BIT9, BITA, BITB, BITC, BITD, BITE, BITF};
char kbd_status0;
char kbd_status1;
char kbd_status2;
char kbd_status3;
char kbd_status4;
char interrupt_counter;
char found_events;
char old_pressed_keys;
char pressed_counter;
char pressed_keys;
//char found_keys;
//char unpressed_keys;
void InitKbd(void)
{
kbd_status3=kbd_status2=kbd_status1=kbd_status0=0;
}
void KbdService(void) // into timer interrupt 1 ms
{
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;
interrupt_counter=interrupt_counter;
break;
case 1: interrupt_counter=2; //check pressed key every tic
pressed_keys=kbd_status0&kbd_status1&kbd_status2;
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); //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
}
else // other key
{pressed_counter=StartDelay;
}
};
old_pressed_keys=pressed_keys;
break;
case 3: interrupt_counter=4;
break;
default:interrupt_counter=0;
}
}
char GetKeyEvent(void)
{ char i;
char mask;
for (i=evUp-1; i<=evUpDn-1; i++)
{ mask=(char) bit_mask[i];
if (found_events&mask) {found_events&=~mask; return(i+1);}
}
return(0);
}
E-mail: info@telesys.ru