А что собственно нужно? Я реализую клаву так - обработчик по таймеру которые в очередь кидает коды нажатых клавишь (так и в PC сделано очередь проще всего и сделать как она в биосе была реализована еще под ДОСОМ)
Антидребезг проще всего делать не на каждую кнопку а целиком на байт (8 кнопок)
я делаю примерно так
typedef struct { BYTE Current; BYTE Count; BYTE Prev; } KbdRow;
static KbdRow KbdData[KBD_ROW_COUNT];
void KbdRowCheck(KbdRow* Row, BYTE RowVal, BYTE Code) { BYTE Prev;
Prev=Row->Prev; if (RowVal==Prev) goto Skip;
if (Row->Current!=RowVal) { Row->Count=KBD_SAME_COUNT; Skip: Row->Current=RowVal; return; }
if (!--Row->Count) { Row->Prev=RowVal; Prev^=RowVal; do { if (Prev & 1) { FifoPut(KBD, (RowVal & 1) ? Code : Code | 0x80 ); } Code++; RowVal>>=1; } while(Prev>>=1); } }
осталсь только вызвать KbdRowCheck на каждую строку матрицы примерно так
static void KbdHandler(void) { BYTE Code; KbdRow* Row; Row_PORT=0xFE; Row=KbdData; Code=0; do { BYTE Tmp; KbdRowCheck(Row,Key_PORT,Code); Tmp=(Row1_PORT<<1)|1; Row1_PORT=Tmp; Row++; Code+=8; } while(Tmp!=0xFF); }
|