|
unsigned char ScanKBD(void) // сканинг клавы, 0 - нет нажатой клавиши
{ // или код нажатой клавиши
unsigned int col,row;
unsigned char mask;
P5DIR |= 0x0F; // настр. на выход
P5OUT |= 0x0F;
if(!(P2IN&0xF0))
{
P5OUT &= 0xF0; // перекл. обратно на вход (для энергосбережения)
P5DIR &= 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)
{
P5DIR &= 0xF0;
return kbdtable[row*4+col];
}
return 0;
}
//------------------------------------------------------------------------------------------
unsigned char WaitKBD(void) // ждать нажатия кнопки и вернуть ее код
{
INT8U err;
OSSemPend(KbdSem, 0, &err);
return kbdKey;
}
unsigned char SensKBD(void)
{
INT8U err;
unsigned char sk;
if(OSSemAccept(KbdSem))
{
sk = kbdKey;
}
else sk = 0x00;
return sk;
}
//------------------------------------------------------------------------------------------
void RefreshKBD(void) // called each 10ms
{
unsigned short sk;
sk = ScanKBD();
if(!sk) { kbdCounter = 45; kbdFlags = 0x00; return; }
if(kbdFlags & 0x01)
{
if(kbdCounter) kbdCounter--;
else
{
kbdKey = sk;
kbdCounter = 4;
if(!KbdSem->OSEventCnt)
OSSemPost(KbdSem);
}
}
else
{
kbdKey = sk;
kbdFlags |= 0x01;
if(!KbdSem->OSEventCnt)
OSSemPost(KbdSem);
}
}
//------------------------------------------------------------------------------------------
E-mail: info@telesys.ru