Добавил:
Eatmore
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:отчеты по лабораторным работам / драйвер клавиатуры / my / SRC / kb
.c#define KEY_PRESSED 1
#define KEY_UNPRESSED 0
#define KEY_REPTIME 100
struct FIFOb dFIFO, uFIFO;
unsigned char key;
unsigned short itime;
unsigned char APIKeyUp()
{
return PopF(&uFIFO);
}
unsigned char APIKeyDown()
{
return PopF(&dFIFO);
}
unsigned char Scan(unsigned char col_row)
{
WriteMax(0, 0x01);
if( ( ReadMax(0) & 0xF0 ) == 0xF0 ){
switch (col_row){
case 0xE0:
return 0x31;
case 0xD0:
return 0x34;
case 0xB0:
return 0x37;
case 0x70:
return 0x2A;
}
}
WriteMax(0, 0x02);
if( ( ReadMax(0) & 0xF0 ) == 0xF0 ){
switch (col_row){
case 0xE0:
return 0x32;
case 0xD0:
return 0x35;
case 0xB0:
return 0x38;
case 0x70:
return 0x30;
}
}
WriteMax(0, 0x04);
if( ( ReadMax(0) & 0xF0 ) == 0xF0 ){
switch (col_row){
case 0xE0:
return 0x33;
case 0xD0:
return 0x36;
case 0xB0:
return 0x39;
case 0x70:
return 0x23;
}
}
WriteMax(0, 0x08);
if( ( ReadMax(0) & 0xF0 ) == 0xF0 ){
switch (col_row){
case 0xE0:
return 0x41;
case 0xD0:
return 0x42;
case 0xB0:
return 0x43;
case 0x70:
return 0x44;
}
}
return 0;
}
void T0_ISR(void) __interrupt ( 1 ) //действия, выполняемы обработчиком прерываний таймера 0
{
static unsigned char regENA = ReadMax(4);
static unsigned char key=0, KeyPressed=0;
static unsigned char ktime=0;
unsigned char col_row;
TH0 = 0xDC; //100 per sec
TL0 = 0x01;
itime++;
WriteMax(0,0x00);
col_row = ReadMax(0);//читаем регистр клавы
ktime++;
if (col_row == 0xF0){
if(ktime<3) return;
if (key != 0){
PushF(&uFIFO, key);
key=0;
}
KeyPressed=0;
ktime=0;
return;
}
regENA ^= 0x1c;
WriteMax(4, regENA);
if( ktime > KEY_REPTIME){
ktime=0;
KeyPressed=0;
}
if (!KeyPressed){
key = Scan(col_row); //сканируем столбцы соответствующей строки клавы
PushF(&dFIFO, key); //записываем в буфер введенный символ
KeyPressed=1;
return;
}
}