// pin connections // arduino pin 2 -> kbd PIC socket 35 (data) // arduino pin 3 -> kbd PIC socket 36 (clock) // arduino pin 4 -> kbd PIC socket 37 (data ready/ write?) // escape codes see https://en.wikipedia.org/wiki/ASCII#Control_characters // \M = carriage return // \H = backspace etc char debugstr[100]; const int SHIFT=5; const int CTRL =13; const int CAPS_LOCK=A6; const int PIN_SR_DATA=6; const int PIN_SR_SHIFT=7; const int PIN_SR_LATCH=8; const int PIN_OUT_DATA=4; const int PIN_OUT_CLOCK=3; const int PIN_OUT_LATCH=2; bool repeat_on=false; int repeat_cnt=0; char last_c=0; void setup() { // put your setup code here, to run once: Serial.begin(115200); pinMode(PIN_OUT_DATA, OUTPUT); // kbd out data pinMode(PIN_OUT_CLOCK, OUTPUT); // kbd out shift pinMode(PIN_OUT_LATCH, OUTPUT); // kbd out latch digitalWrite(PIN_OUT_DATA,0); digitalWrite(PIN_OUT_CLOCK,0); digitalWrite(PIN_OUT_LATCH,0); pinMode(SHIFT, INPUT); pinMode(CTRL, INPUT); pinMode(CAPS_LOCK,INPUT); pinMode(PIN_SR_DATA, OUTPUT); digitalWrite(PIN_SR_DATA,0); pinMode(PIN_SR_SHIFT, OUTPUT); digitalWrite(PIN_SR_SHIFT,0); pinMode(PIN_SR_LATCH, OUTPUT); digitalWrite(PIN_SR_LATCH,0); pinMode(A0,INPUT); pinMode(A1,INPUT); pinMode(A2,INPUT); pinMode(A3,INPUT); pinMode(A4,INPUT); pinMode(A5,INPUT); pinMode(A0,INPUT); pinMode(9,INPUT); pinMode(10,INPUT); pinMode(11,INPUT); pinMode(12,INPUT); // bodge reset digitalWrite(PIN_SR_DATA,0); // shift it 8 times for(int i=0;i<8;i++) { digitalWrite(PIN_SR_SHIFT,1); delay(1); digitalWrite(PIN_SR_SHIFT,0); } } char matrix[10][8]={ /* 0 1 2 3 4 5 6 7 8 9 10 * / /* 0 */ { 10, 11, 'p', '=', ',', 'k', 'u', '7', }, /* 1 */ {127, 13, '`', '\\','m', 'j', 't', '5', }, /* 2 */ { '~', '~', '~', '~', 'n', 'g', 'y', '6', }, /* 3 */ { '~', '~', '~', '~', 'b', 'f', 'r', '4', }, /* 4 */ { '~', '~', '~', '~', 'v', 'h', 'e', '3', }, /* 5 */ { '~', '~', '~', '~', 'c', 's', 'w', '2', }, /* 6 */ { '~', '~', '~', '~', 'x', 'd', 'q', '1', }, /* 7 */ { '~', '~', '~', '~', 'z', 'a', 9 , 27, }, /* 8 */ { 21, '\'', ']', '-', '/', 'l', 'o', '9', }, /* 9 */ { 8 , ' ', '[', '0', '.', ';', 'i', '8', }, }; char shifted_matrix[10][8]={ /* 0 1 2 3 4 5 6 7 8 9 10 * / /* 0 */ { 10, 11, 'P', '+', '<', 'K', 'U', '&', }, /* 1 */ {127, 13, '~', '|', 'M', 'J', 'T', '%', }, /* 2 */ { '~', '~', '~', '~', 'N', 'G', 'Y', '^', }, /* 3 */ { '~', '~', '~', '~', 'B', 'F', 'R', '$', }, /* 4 */ { '~', '~', '~', '~', 'V', 'H', 'E', '#', }, /* 5 */ { '~', '~', '~', '~', 'C', 'S', 'W', '@', }, /* 6 */ { '~', '~', '~', '~', 'X', 'D', 'Q', '!', }, /* 7 */ { '~', '~', '~', '~', 'Z', 'A', 9 , 27, }, /* 8 */ { 21, '"', '}', '_', '?', 'L', 'O', '(', }, /* 9 */ { 8 , ' ', '{', ')', '>', ':', 'I', '*', }, }; void loop() { short int i=-1; short int j=-1; short int down=0; for(short int _i=0;_i<8;_i++) { // write 1 data to SR on first pass only digitalWrite(PIN_SR_DATA,_i==0?1:0); delay(1); // shift it digitalWrite(PIN_SR_SHIFT,1); delay(1); digitalWrite(PIN_SR_SHIFT,0); // latch it digitalWrite(PIN_SR_LATCH,1); delay(1); digitalWrite(PIN_SR_LATCH,0); // do a scan // sprintf(debugstr, "%d %d %d %d %d %d %d %d %d %d", digitalRead(A0), digitalRead(A1), digitalRead(A2), digitalRead(A3), digitalRead(A4), digitalRead(A5), digitalRead(9), digitalRead(10), digitalRead(11), digitalRead(12)); // Serial.println(debugstr); // j=-1; for(short int _j=0; _j<10; _j++) { switch(_j) { case 0: if(digitalRead(A0)) { i=_i; j=_j; down++; } break; case 1: if(digitalRead(A1)) { i=_i; j=_j; down++; } break; case 2: if(digitalRead(A2)) { i=_i; j=_j; down++; } break; case 3: if(digitalRead(A3)) { i=_i; j=_j; down++; } break; case 4: if(digitalRead(A4)) { i=_i; j=_j; down++; } break; case 5: if(digitalRead(A5)) { i=_i; j=_j; down++; } break; case 6: if(digitalRead(9)) { i=_i; j=_j; down++; } break; case 7: if(digitalRead(10)) { i=_i; j=_j; down++; } break; case 8: if(digitalRead(11)) { i=_i; j=_j; down++; } break; case 9: if(digitalRead(12)) { i=_i; j=_j; down++; } break; } } } if(j==-1) { repeat_on=false; repeat_cnt=0; } else { char c=matrix[j][i]; if(c==last_c) { repeat_cnt++; if(repeat_cnt>=30) repeat_on=true; } else { repeat_on=false; repeat_cnt=1; } } if(j>=0 && (repeat_on || repeat_cnt==1) && down==1) { sprintf(debugstr, "i=%d j=%d caps=%d (analog=%d)", i, j, digitalRead(CAPS_LOCK), analogRead(CAPS_LOCK)); Serial.println(debugstr); char c=matrix[j][i]; if(!digitalRead(SHIFT)) send_char(shifted_matrix[j][i]); else if(!digitalRead(CTRL) && c>='a' && c<='z') send_char(c-'a'+1); else if(analogRead(CAPS_LOCK)<100 && c>='a' && c<='z') send_char(c-'a'+'A'); else send_char(c); last_c=c; } } void send_char(char c) { // you don't actually need this most sig bit but sending it works, so why not digitalWrite(PIN_OUT_DATA,bitRead(c,7)); // bit digitalWrite(PIN_OUT_CLOCK,1); // clock pulse digitalWrite(PIN_OUT_CLOCK,0); digitalWrite(PIN_OUT_DATA,bitRead(c,6)); digitalWrite(PIN_OUT_CLOCK,1); digitalWrite(PIN_OUT_CLOCK,0); digitalWrite(PIN_OUT_DATA,bitRead(c,5)); digitalWrite(PIN_OUT_CLOCK,1); digitalWrite(PIN_OUT_CLOCK,0); digitalWrite(PIN_OUT_DATA,bitRead(c,4)); digitalWrite(PIN_OUT_CLOCK,1); digitalWrite(PIN_OUT_CLOCK,0); digitalWrite(PIN_OUT_DATA,bitRead(c,3)); digitalWrite(PIN_OUT_CLOCK,1); digitalWrite(PIN_OUT_CLOCK,0); digitalWrite(PIN_OUT_DATA,bitRead(c,2)); digitalWrite(PIN_OUT_CLOCK,1); digitalWrite(PIN_OUT_CLOCK,0); digitalWrite(PIN_OUT_DATA,bitRead(c,1)); digitalWrite(PIN_OUT_CLOCK,1); digitalWrite(PIN_OUT_CLOCK,0); digitalWrite(PIN_OUT_DATA,bitRead(c,0)); digitalWrite(PIN_OUT_CLOCK,1); digitalWrite(PIN_OUT_CLOCK,0); digitalWrite(PIN_OUT_LATCH,1); // data ready (required) //sprintf(debugstr, "send=%d c=%d", cnt++, c); //Serial.println(debugstr); delay(5); digitalWrite(PIN_OUT_LATCH,0); delay(5); } void serialEvent() { static char lastch=0; static bool escape=false; while(Serial.available()) { char ch = Serial.read(); Serial.write(ch); if(escape) { send_char(ch-'A'+1); escape=false; } else { if(ch=='\\') { escape=true; } else { escape=false; send_char(ch); } } lastch=ch; } //send_char(13); }