Skip to content

Instantly share code, notes, and snippets.

@rhwlo
Created November 23, 2020 17:19
Show Gist options
  • Save rhwlo/a31b99f53a68e41979e3559d30d4f111 to your computer and use it in GitHub Desktop.
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
#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