|
|
Из прерывания вызываешь RefreshKBD (константы расчитаны на вызов каждые 15мс )
WaitKBD - ожидание нажатия кнопки
SensKBD - проверка состояния кнопок (если 0, то кнопки не нажаты)
функцию ScanKBD можешь переписать в соответствии со своей клавой - она сканирует клаву и возвращает код нажатой кнопки или если кнопка не нажата то возвращает 0x00...
Пользуйтесь на здоровье... ;)
//------------------------------------------------------------------------------------------
// Keyboard routines
// (C)2003 Alex Makeev
//
// P5.0 ... P5.3 - kbd bus 1
// P2.4 ... P2.7 - kbd bus 2 (resistance on Vss)
//
//------------------------------------------------------------------------------------------const unsigned char kbdtable[] = { '7','4','1','*', '8','5','2','0', '9','6','3','.', 'B','-','+','E' };
unsigned char kbdKey;
unsigned char kbdFlags;
unsigned char kbdCounter;unsigned char ScanKBD(void)
{
unsigned int col,row;
unsigned char mask;P5OUT |= 0x0F;
if(!(P2IN&0xF0)) { P5OUT &= 0xF0; return 0; }for(row=0, mask=0x01; row < 4; row++, mask<<=1)
{
P5OUT &= 0xF0;
P5OUT |= mask;
if(P2IN&0xF0) break;
}for(col=0, mask=0x10; col < 4; col++, mask<<=1)
if(P2IN & mask) return kbdtable[row*4+col];return 0;
}
//------------------------------------------------------------------------------------------
unsigned char WaitKBD(void)
{
int exit=1;for(;;)
{
if(kbdFlags&0x80)
{
kbdFlags&=0x7F;
break;
}
}
return kbdKey;
}unsigned char SensKBD(void)
{
if(kbdFlags&0x80)
{
kbdFlags&=0x7F;
}
else return 0x00;
return kbdKey;
}//------------------------------------------------------------------------------------------
void RefreshKBD(void) // called each 15ms
{
unsigned char sk;sk = ScanKBD();
if(!sk) { kbdCounter = 45; kbdFlags = 0x00; return; }if(kbdFlags & 0x01)
{
if(kbdCounter) kbdCounter--;
else { kbdKey = sk; kbdCounter = 4; kbdFlags |= 0x80; }
}
else {kbdKey = sk; kbdFlags |= 0x81; }
}
//------------------------------------------------------------------------------------------
E-mail: info@telesys.ru