#include "keyboard.h"
void kbbufadd(unsigned char dat)
{
unsigned char i;
for (i=0;i<BUFLEN;i++)
{
if (kbbuf[i]==dat)
{
return;
}
}
for (i=0;i<BUFLEN;i++)
{
if (kbbuf[i]==0)
{
kbbuf[i] = dat;
break;
}
}
}
void kbbufdel(unsigned char dat)
{
unsigned char i, c, c0 = 0, t;
bit f = 0;
for (i=0;i<BUFLEN;i++)
{
if (kbbuf[i] == dat)
{
t = i;
kbbuf[i] = 0;
f = 1;
}
}
if (f == 0)
{
for (i=0;i<BUFLEN;i++)
{
kbbuf[i] = 0;
}
}
}
void kbReply(void)
{
unsigned char i, j, t, mod;
j = 2; mod = 0;
for (i=0;i<6;i++)
{
ReplyBuffer[i+2] = 0;
t = kbdecode(kbbuf[i]);
if (t != 0)
{
s0 = 0;
switch (t) {
case 0xe0:
s0b0 = 1;
break;
case 0xe1:
s0b1 = 1;
break;
case 0xe2:
s0b2 = 1;
break;
case 0xe3:
s0b3 = 1;
break;
case 0xe4:
s0b4 = 1;
break;
case 0xe5:
s0b5 = 1;
break;
case 0xe6:
s0b6 = 1;
break;
case 0xe7:
s0b7 = 1;
break;
default:
;
}
if (s0 == 0) ReplyBuffer[j++] = t;
mod |= s0;
}
}
ReplyCount = 8;
ReplyBuffer[0] = mod;
ReplyBuffer[1] = 0;
}
void kbScan(void)
{
bit p;
p = ps2read();
while (ps2test(p) == 0)
{
ps2write(0xfe);
p = ps2read();
}
Output(PS2_BYTE);
if (PS2_Ready == 1)
{
if (PS2_BYTE != 0xf0)
{
kbbufadd(PS2_BYTE);
}
else
{
do {
p = ps2read();
while (ps2test(p) == 0)
{
ps2write(0xfe);
p = ps2read();
}
Output(PS2_BYTE);
} while (PS2_Ready == 0);
kbbufdel(PS2_BYTE);
}
kbReply(); //write keyboard buffer to reply buffer
// IsListening = 0;
d12comm(0x03);
SendReplyBuffer();
}
}
unsigned char kbdecode(unsigned char dat)
{
unsigned char usage;
switch (dat) {
case 0x1c:
usage = 0x04;
break;
case 0x32:
usage = 0x05;
break;
case 0x21:
usage = 0x06;
break;
case 0x23:
usage = 0x07;
break;
case 0x24:
usage = 0x08;
break;
case 0x2b:
usage = 0x09;
break;
case 0x34:
usage = 0x0a;
break;
case 0x33:
usage = 0x0b;
break;
case 0x43:
usage = 0x0c;
break;
case 0x3b:
usage = 0x0d;
break;
case 0x42:
usage = 0x0e;
break;
case 0x4b:
usage = 0x0f;
break;
case 0x3a:
usage = 0x10;
break;
case 0x31:
usage = 0x11;
break;
case 0x44:
usage = 0x12;
break;
case 0x4d:
usage = 0x13;
break;
case 0x15:
usage = 0x14;
break;
case 0x2d:
usage = 0x15;
break;
case 0x1b:
usage = 0x16;
break;
case 0x2c:
usage = 0x17;
break;
case 0x3c:
usage = 0x18;
break;
case 0x2a:
usage = 0x19;
break;
case 0x1d:
usage = 0x1a;
break;
case 0x22:
usage = 0x1b;
break;
case 0x35:
usage = 0x1c;
break;
case 0x1a:
usage = 0x1d;
break;
case 0x16:
usage = 0x1e;
break;
case 0x1e:
usage = 0x1f;
break;
case 0x26:
usage = 0x20;
break;
case 0x25:
usage = 0x21;
break;
case 0x2e:
usage = 0x22;
break;
case 0x36:
usage = 0x23;
break;
case 0x3d:
usage = 0x24;
break;
case 0x3e:
usage = 0x25;
break;
case 0x46:
usage = 0x26;
break;
case 0x45:
usage = 0x27;
break;
case 0x5a:
usage = 0x28;
break;
case 0x76:
usage = 0x29;
break;
case 0x66:
usage = 0x2a;
break;
case 0x0d:
usage = 0x2b;
break;
case 0x29:
usage = 0x2c;
break;
case 0x4e:
usage = 0x2d;
break;
case 0x55:
usage = 0x2e;
break;
case 0x54:
usage = 0x2f;
break;
case 0x5b:
usage = 0x30;
break;
case 0x5d:
usage = 0x31;
break;
case 0x4c:
usage = 0x33;
break;
case 0x52:
usage = 0x34;
break;
case 0x41:
usage = 0x36;
break;
case 0x49:
usage = 0x37;
break;
case 0x4a:
usage = 0x38;
break;
case 0x58:
usage = 0x39;
break;
case 0x05:
usage = 0x3a;
break;
case 0x06:
usage = 0x3b;
break;
case 0x04:
usage = 0x3c;
break;
case 0x0c:
usage = 0x3d;
break;
case 0x03:
usage = 0x3e;
break;
case 0x0b:
usage = 0x3f;
break;
case 0x83:
usage = 0x40;
break;
case 0x0a:
usage = 0x41;
break;
case 0x01:
usage = 0x42;
break;
case 0x09:
usage = 0x43;
break;
case 0x78:
usage = 0x44;
break;
case 0x07:
usage = 0x45;
break;
// case 0x57: //PrintScreen
// usage = 0x46;
// break;
case 0x7e:
usage = 0x47;
break;
// case 0x62: //Break
// usage = 0x48;
// break;
case 0x70:
usage = 0x49;
break;
case 0x6c:
usage = 0x4a;
break;
case 0x7d:
usage = 0x4b;
break;
case 0x71:
usage = 0x4c;
break;
case 0x69:
usage = 0x4d;
break;
case 0x7a:
usage = 0x4e;
break;
case 0x74:
usage = 0x4f;
break;
case 0x6b:
usage = 0x50;
break;
case 0x72:
usage = 0x51;
break;
case 0x75:
usage = 0x52;
break;
case 0x77:
usage = 0x53;
break;
// case 0x4a:
// usage = 0x54;
// break;
case 0x7c:
usage = 0x55;
break;
case 0x7b:
usage = 0x56;
break;
case 0x79:
usage = 0x57;
break;
// case 0x5a: //Keypad ENTER
// usage = 0x58;
// break;
// case 0x69: //Keypad 1
// usage = 0x59;
// break;
// case 0x72: //Keypad 2
// usage = 0x5a;
// break;
// case 0x7a: //Keypad 3
// usage = 0x5b;
// break;
// case 0x6b:
// usage = 0x5c;
// break;
// case 0x73:
// usage = 0x5d;
// break;
// case 0x74:
// usage = 0x5e;
// break;
// case 0x6c:
// usage = 0x5f;
// break;
// case 0x75:
// usage = 0x60;
// break;
// case 0x7d:
// usage = 0x61;
// break;
// case 0x70:
// usage = 0x62;
// break;
// case 0x71:
// usage = 0x63;
// break;
case 0x2f:
usage = 0x76;
break;
case 0x14:
usage = 0xe0;
break;
case 0x12:
usage = 0xe1;
break;
case 0x11:
usage = 0xe2;
break;
case 0x1f:
usage = 0xe3;
break;
// case 0x14: //Right Ctrl
// usage = 0xe4;
// break;
case 0x59:
usage = 0xe5;
break;
// case 0x11: //Right ALT
// usage = 0xe6;
// break;
case 0x27:
usage = 0xe7;
break;
default:
usage = 0;
}
return usage;
}
- 1
- 2
前往页