1 | #include <Keyboard.h>
|
2 | int dataPin = 9;
|
3 | int clockPin = 7;
|
4 | int latchPin = 8;
|
5 |
|
6 | unsigned long last_press = 0;
|
7 | unsigned long last_key_press = 0;
|
8 |
|
9 | char* letters[] ={"dcbahgfe" };
|
10 |
|
11 | int num_chars = 43;
|
12 | int num_registers = 1;
|
13 | byte button_states[] = {0x00,0x00,0x00,0x00}; //01001000
|
14 | int cursor_index = 0;
|
15 | int char_index = 0;
|
16 | char cur_char = 'X';
|
17 |
|
18 | void setup() {
|
19 | Serial.begin(9600);
|
20 | pinMode(latchPin, OUTPUT);
|
21 | pinMode(clockPin, OUTPUT);
|
22 | pinMode(dataPin, INPUT);
|
23 | Keyboard.begin();
|
24 |
|
25 | }
|
26 |
|
27 | void loop() {
|
28 | if (millis() - last_key_press > 350) read_keyboard();
|
29 | delay(1);
|
30 | }
|
31 |
|
32 |
|
33 | void read_keyboard(){
|
34 | //set it to 0 to transmit data serially
|
35 | digitalWrite(latchPin,LOW);
|
36 | //while the shift register is in serial mode
|
37 | //collect each shift register into a byte
|
38 | //the register attached to the chip comes in first
|
39 | for (int i = 0; i < num_registers; i++){
|
40 | button_states[i] = shiftIn(dataPin, clockPin);
|
41 | }
|
42 | boolean something_in = false;
|
43 | for (int i = 0; i < num_registers; i++){
|
44 | something_in = translate_buttons_2_keys(button_states[i], letters[i]);
|
45 | if (something_in) last_key_press = millis();
|
46 | }
|
47 | digitalWrite(latchPin,HIGH);
|
48 | }
|
49 |
|
50 | boolean translate_buttons_2_keys(byte buttons, char* keys){
|
51 | for(int i = 0 ; i < 8; i++){
|
52 | if ( (1 << i) & buttons ){
|
53 | cur_char = keys[i];
|
54 | Keyboard.print(keys[i]);
|
55 | char_index++;
|
56 | return true;
|
57 | }
|
58 | }
|
59 | return false;
|
60 | }
|
61 | byte shiftIn(int myDataPin, int myClockPin) {
|
62 | int i;
|
63 | int temp = 0;
|
64 | int pinState;
|
65 | byte myDataIn = 0;
|
66 |
|
67 | pinMode(myClockPin, OUTPUT);
|
68 | pinMode(myDataPin, INPUT);
|
69 |
|
70 | for (i=7; i>=0; i--)
|
71 | {
|
72 | digitalWrite(myClockPin, 0);
|
73 | delayMicroseconds(20);
|
74 | temp = digitalRead(myDataPin);
|
75 | if (temp) {
|
76 | pinState = 1;
|
77 | myDataIn = myDataIn | (1 << i);
|
78 | }
|
79 | else {
|
80 | pinState = 0;
|
81 | }
|
82 | digitalWrite(myClockPin, 1);
|
83 | }
|
84 | return myDataIn;
|
85 | }
|