вот чегото понавырезал, если лишнего не покоцал должно работать :) тока здеся uCOS2 юзался, ну да переделать думаю несложно будет... (+)
(«Телесистемы»: Конференция 'Микроконтроллеры и их применение')

миниатюрный аудио-видеорекордер mAVR

Отправлено SOIC 20 сентября 2004 г. 13:23
В ответ на: Поделитесь эффективной функцией работы с клавиатурой 4x4 (поддержка длительного нажатия, количество символов с секунду, пауза перед следующим символом, и.т.д.) отправлено ace2 20 сентября 2004 г. 11:10


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