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

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

Отправлено SOIC 21 апреля 2003 г. 19:07
В ответ на: Нужна помощь(+) отправлено FlexyMind 21 апреля 2003 г. 15:14

Из прерывания вызываешь 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