PS/2 keyboard full example (scancodes, virtual keys, LEDs control...)
void printHelp()
{
Serial.printf("\n\nPS/2 Keyboard Studio\n");
Serial.printf("Chip Revision: %d Chip Frequency: %d MHz\n", ESP.getChipRevision(), ESP.getCpuFreqMHz());
printInfo();
Serial.printf("Commands:\n");
Serial.printf(" 1 = US Layout 2 = UK Layout 3 = DE Layout 4 = IT Layout\n");
Serial.printf(" r = Reset s = Scancode Mode a = VirtualKey/ASCII Mode\n");
Serial.printf(" l = Test LEDs\n");
Serial.printf("Various:\n");
Serial.printf(" h = Print This help\n\n");
}
void printInfo()
{
Serial.write("Device Id = ");
Serial.write("\"Old AT Keyboard\"");
break;
Serial.write("\"Standard Mouse\"");
break;
Serial.write("\"Mouse with scroll wheel\"");
break;
Serial.write("\"5 Buttons Mouse\"");
break;
Serial.write("\"MF2 Keyboard with translation\"");
break;
Serial.write("\"MF2 keyboard\"");
break;
default:
Serial.write("\"Unknown\"");
break;
}
Serial.printf(
" Keyboard Layout: \"%s\"\n", Keyboard.
getLayout()->
name);
} else
Serial.write("Keyboard Error!\n");
}
void setup()
{
Serial.begin(115200);
delay(500);
Serial.write("\n\nReset\n");
PS2Controller.
begin(PS2Preset::KeyboardPort0);
printHelp();
}
void loop()
{
static char mode = 'a';
if (Serial.available() > 0) {
char c = Serial.read();
switch (c) {
case 'h':
printHelp();
break;
case '1':
printInfo();
break;
case '2':
printInfo();
break;
case '3':
printInfo();
break;
case '4':
printInfo();
break;
case 'r':
printInfo();
break;
case 's':
case 'a':
mode = c;
break;
case 'l':
{
for (int i = 0; i < 8; ++i) {
Keyboard.
setLEDs(i & 1, i & 2, i & 4);
delay(1000);
}
delay(2000);
Serial.write("OK\n");
break;
}
}
}
bool down;
Serial.printf(
"VirtualKey = %s", Keyboard.
virtualKeyToString(vk));
if (c > -1) {
Serial.printf(" ASCII = 0x%02X ", c);
if (c >= ' ')
Serial.write(c);
}
if (!down)
Serial.write(" UP");
Serial.write('\n');
}
}