Created
November 23, 2020 17:19
-
-
Save rhwlo/a31b99f53a68e41979e3559d30d4f111 to your computer and use it in GitHub Desktop.
Arduino sketch for registering keypresses from the Kinesis and logging them to serial
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "Arduino.h" | |
#define KEY_UP 1 | |
#define KEY_DN 0 | |
/* Connect the Arduino to the socket of the keyboard's main microcontroller | |
(an AT89S8253: http://ww1.microchip.com/downloads/en/DeviceDoc/doc3286.pdf) | |
with the following pins: | |
Kinesis U1 Arduino | |
================= ============= | |
1 2 | |
2 3 | |
3 12 | |
4 A4 | |
5 through 19 not connected | |
20 GND | |
21 4 | |
22 5 | |
23 6 | |
24 7 | |
25 8 | |
26 9 | |
27 10 | |
28 11 | |
29 through 35 not connected | |
36 A3 | |
37 A2 | |
38 A1 | |
39 A0 | |
40 5V | |
*/ | |
const uint8_t ROW_PIN[8] = { 4, 5, 6, 7, 8, 9, 10, 11 }; | |
const uint8_t COL_SEL[4] = { A3, A2, A1, A0 }; | |
const uint8_t LED_OUT[4] = { 2, 3, 12, A4 }; | |
int i, col, row, positions[16][8]; | |
void printKey(int krow, int kcol) { | |
switch (krow) | |
{ | |
case 2: | |
switch (kcol) | |
{ | |
case 0: | |
Serial.print("f6"); break; | |
case 1: | |
Serial.print("f8"); break; | |
case 2: | |
Serial.print("f7"); break; | |
case 3: | |
Serial.print("5"); break; | |
case 4: | |
Serial.print("4"); break; | |
case 5: | |
Serial.print("3"); break; | |
case 6: | |
Serial.print("2"); break; | |
case 7: | |
Serial.print("1"); break; | |
case 8: | |
Serial.print("+"); break; | |
default: | |
break; | |
} | |
break; | |
case 3: | |
switch (kcol) | |
{ | |
case 0: | |
Serial.print("f3"); break; | |
case 1: | |
Serial.print("f5"); break; | |
case 2: | |
Serial.print("f4"); break; | |
case 3: | |
Serial.print("t"); break; | |
case 4: | |
Serial.print("r"); break; | |
case 5: | |
Serial.print("e"); break; | |
case 6: | |
Serial.print("w"); break; | |
case 7: | |
Serial.print("q"); break; | |
case 8: | |
Serial.print("tab"); break; | |
default: | |
break; | |
} | |
break; | |
case 4: | |
switch (kcol) | |
{ | |
case 0: | |
Serial.print("escape"); break; | |
case 1: | |
Serial.print("f2"); break; | |
case 2: | |
Serial.print("f1"); break; | |
case 3: | |
Serial.print("g"); break; | |
case 4: | |
Serial.print("f"); break; | |
case 5: | |
Serial.print("d"); break; | |
case 6: | |
Serial.print("s"); break; | |
case 7: | |
Serial.print("a"); break; | |
case 8: | |
Serial.print("caps lock"); break; | |
default: | |
break; | |
} | |
break; | |
case 5: | |
switch (kcol) | |
{ | |
case 0: | |
Serial.print("f9"); break; | |
case 1: | |
Serial.print("f11"); break; | |
case 2: | |
Serial.print("f10"); break; | |
case 3: | |
Serial.print("b"); break; | |
case 4: | |
Serial.print("v"); break; | |
case 5: | |
Serial.print("c"); break; | |
case 6: | |
Serial.print("x"); break; | |
case 7: | |
Serial.print("z"); break; | |
case 8: | |
Serial.print("left shift"); break; | |
case 9: | |
Serial.print("up arrow"); break; | |
case 11: | |
Serial.print("down arrow"); break; | |
case 13: | |
Serial.print("["); break; | |
case 14: | |
Serial.print("]"); break; | |
default: | |
break; | |
} | |
break; | |
case 6: | |
switch (kcol) | |
{ | |
case 0: | |
Serial.print("f12"); break; | |
case 2: | |
Serial.print("print screen"); break; | |
case 3: | |
Serial.print("right arrow"); break; | |
case 5: | |
Serial.print("left arrow"); break; | |
case 6: | |
Serial.print("insert"); break; | |
case 7: | |
Serial.print("`"); break; | |
case 9: | |
Serial.print("6"); break; | |
case 10: | |
Serial.print("7"); break; | |
case 11: | |
Serial.print("8"); break; | |
case 13: | |
Serial.print("9"); break; | |
case 14: | |
Serial.print("0"); break; | |
case 15: | |
Serial.print("-"); break; | |
default: | |
break; | |
} | |
break; | |
case 7: | |
switch (kcol) | |
{ | |
case 0: | |
Serial.print("pause"); break; | |
case 3: | |
Serial.print("left alt"); break; | |
case 5: | |
Serial.print("home"); break; | |
case 7: | |
Serial.print("end"); break; | |
case 9: | |
Serial.print("y"); break; | |
case 10: | |
Serial.print("u"); break; | |
case 11: | |
Serial.print("i"); break; | |
case 13: | |
Serial.print("o"); break; | |
case 14: | |
Serial.print("p"); break; | |
case 15: | |
Serial.print("\\"); break; | |
default: | |
break; | |
} | |
break; | |
case 8: | |
switch (kcol) | |
{ | |
case 3: | |
Serial.print("left control"); break; | |
case 4: | |
Serial.print("delete"); break; | |
case 5: | |
Serial.print("backspace"); break; | |
case 6: | |
Serial.print("right control"); break; | |
case 7: | |
Serial.print("enter"); break; | |
case 8: | |
Serial.print("space"); break; | |
case 9: | |
Serial.print("h"); break; | |
case 10: | |
Serial.print("j"); break; | |
case 11: | |
Serial.print("k"); break; | |
case 13: | |
Serial.print("l"); break; | |
case 14: | |
Serial.print(";"); break; | |
case 15: | |
Serial.print("'"); break; | |
default: | |
break; | |
} | |
break; | |
case 9: | |
switch (kcol) | |
{ | |
case 3: | |
Serial.print("right alt"); break; | |
case 6: | |
Serial.print("page up"); break; | |
case 8: | |
Serial.print("page down"); break; | |
case 9: | |
Serial.print("n"); break; | |
case 10: | |
Serial.print("m"); break; | |
case 11: | |
Serial.print(","); break; | |
case 13: | |
Serial.print("."); break; | |
case 14: | |
Serial.print("/"); break; | |
case 15: | |
Serial.print("right shift"); break; | |
default: | |
break; | |
} | |
break; | |
default: | |
break; | |
} | |
} | |
void applyColumnMask(int mask) { | |
digitalWrite(COL_SEL[0], (mask & 0b1000) ? HIGH : LOW); | |
digitalWrite(COL_SEL[1], (mask & 0b0100) ? HIGH : LOW); | |
digitalWrite(COL_SEL[2], (mask & 0b0010) ? HIGH : LOW); | |
digitalWrite(COL_SEL[3], (mask & 0b0001) ? HIGH : LOW); | |
} | |
void setup() { | |
Serial.begin(9600); | |
for (i = 0; i < 8; i++) { | |
pinMode(ROW_PIN[i], INPUT_PULLUP); | |
} | |
for (i = 0; i < 4; i++) { | |
pinMode(COL_SEL[i], OUTPUT); | |
pinMode(LED_OUT[i], OUTPUT); | |
digitalWrite(COL_SEL[i], HIGH); | |
} | |
for (col = 0; col < 16; col++) { | |
for (row = 0; row < 8; row++) { | |
positions[col][row] = KEY_UP; | |
} | |
} | |
for (i = 0; i < 64; i++) { | |
digitalWrite(LED_OUT[0], (i & 0b1000) ? HIGH : LOW); | |
digitalWrite(LED_OUT[1], (i & 0b0100) ? HIGH : LOW); | |
digitalWrite(LED_OUT[2], (i & 0b0010) ? HIGH : LOW); | |
digitalWrite(LED_OUT[3], (i & 0b0001) ? HIGH : LOW); | |
delay(20); | |
} | |
Serial.println("setup done"); | |
} | |
void loop() { | |
int position; | |
for (col = 0; col < 16; col++) { | |
applyColumnMask(col); | |
for (row = 0; row < 8; row++) { | |
position = digitalRead(ROW_PIN[row]); | |
if (position != positions[col][row] && position) { | |
printKey(row + 2, col); | |
Serial.print(" "); | |
} | |
positions[col][row] = position; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment