keybrd library is an open source library for creating custom-keyboard firmware.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

keybrd_shift_register.ino 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /* keybrd_shift_reg.ino
  2. Tested on Teensy LC and daisy chained 74HC165 shift registers
  3. The keyboard hardware for this sketch has 4 shift registers,
  4. with every 4th input pin connected to a pull-down resistor and matrix column, also the 31st key.
  5. Unused input pins are not grounded, so add this line to Scanner_ShiftRegs74HC165::scan():
  6. //clear unpowered pins (for testing on breadboard)
  7. rowState &= 0b11110001000100010001000100010001; //todo
  8. Layout Layout
  9. | Left | **0**|**1**| | Right |**0**|**1**|**2**|**3**|**4**|**5**|**6**|**7**|**8**|
  10. |:-----:|------|-----| |:-----:|-----|-----|-----|-----|-----|-----|-----|-----|-----|
  11. | **0** |capLck| a | | **0** | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
  12. | **1** | b | c | | **1** | a | b | c | d | e | f | g | h | i |
  13. */
  14. // ################## GLOBAL ###################
  15. // ================= INCLUDES ==================
  16. #include <Debug.h>
  17. #include <ScanDelay.h>
  18. #include <LED_uC.h>
  19. #include <SPI.h>
  20. //Codes
  21. #include <Code_Sc.h>
  22. #include <Code_LEDLock.h>
  23. //Matrix
  24. #include <Row_uC.h>
  25. #include <Row_ShiftRegisters.h>
  26. // =============== CONFIGURATION ===============
  27. ScanDelay scanDelay(9000);
  28. //active state of left matrix
  29. const bool Scanner_uC::STROBE_ON = LOW;
  30. const bool Scanner_uC::STROBE_OFF = HIGH;
  31. const uint8_t Scanner_ShiftRegs74HC165::SHIFT_LOAD = 10;
  32. //active state of right matrix
  33. const bool Scanner_ShiftRegs74HC165::STROBE_ON = LOW;
  34. const bool Scanner_ShiftRegs74HC165::STROBE_OFF = HIGH;
  35. Debug debug;
  36. // ================= LEFT PINS =================
  37. uint8_t readPins[] = {14, 15};
  38. uint8_t READ_PIN_COUNT = sizeof(readPins)/sizeof(*readPins);
  39. // ==================== LEDs ===================
  40. LED_uC LED1(16);
  41. //sometimes OS takes 6 seconds to recongnize keyboard, LED blinks from the begining
  42. void wait()
  43. {
  44. for (uint8_t count = 0; count < 6; count++)
  45. {
  46. //print count
  47. Keyboard.print(count);
  48. Keyboard.print(F(" "));
  49. //blink LED
  50. LED1.on();
  51. delay(500);
  52. LED1.off();
  53. delay(500);
  54. }
  55. }
  56. // =================== CODES ===================
  57. Code_Sc s_a(KEY_A);
  58. Code_Sc s_b(KEY_B);
  59. Code_Sc s_c(KEY_C);
  60. Code_Sc s_d(KEY_D);
  61. Code_Sc s_e(KEY_E);
  62. Code_Sc s_f(KEY_F);
  63. Code_Sc s_g(KEY_G);
  64. Code_Sc s_h(KEY_H);
  65. Code_Sc s_i(KEY_I);
  66. Code_Sc s_u(KEY_U);
  67. Code_Sc s_v(KEY_V);
  68. Code_Sc s_w(KEY_W);
  69. Code_Sc s_x(KEY_X);
  70. Code_Sc s_z(KEY_Z);
  71. Code_Sc s_0(KEY_0);
  72. Code_Sc s_1(KEY_1);
  73. Code_Sc s_2(KEY_2);
  74. Code_Sc s_3(KEY_3);
  75. Code_Sc s_4(KEY_4);
  76. Code_Sc s_5(KEY_5);
  77. Code_Sc s_6(KEY_6);
  78. Code_Sc s_7(KEY_7);
  79. Code_Sc s_8(KEY_8);
  80. Code_LEDLock o_capsLock(KEY_CAPS_LOCK, LED1);
  81. // ================= LEFT ROWS =================
  82. Key* ptrsKeys_L0[] = { &o_capsLock, &s_a };
  83. Row_uC row_L0(0, readPins, READ_PIN_COUNT, ptrsKeys_L0);
  84. Key* ptrsKeys_L1[] = { &s_b, &s_c };
  85. Row_uC row_L1(1, readPins, READ_PIN_COUNT, ptrsKeys_L1);
  86. // ================= RIGHT ROWS ================
  87. //typedef should be large in /home/wolfv/Documents/Arduino/keybrd_proj/keybrd/src/config_keybrd.h
  88. //Row_ShiftRegisters(STROBE_PIN, READ_PIN_COUNT, ptrsKeys[])
  89. //the s_z are place holders and should not print
  90. /*
  91. //prints 0 1
  92. Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z };
  93. uint8_t READ_PIN_COUNT_R0 = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
  94. Row_ShiftRegisters row_R0(8, READ_PIN_COUNT_R0, ptrsKeys_R0);
  95. //prints a b
  96. Key* ptrsKeys_R1[] = { &s_a, &s_z, &s_z, &s_z, &s_b, &s_z, &s_z, &s_z };
  97. uint8_t READ_PIN_COUNT_R1 = sizeof(ptrsKeys_R1)/sizeof(*ptrsKeys_R1);
  98. Row_ShiftRegisters row_R1(9, READ_PIN_COUNT_R1, ptrsKeys_R1);
  99. */
  100. /*
  101. //prints 0 1 2
  102. Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z,
  103. &s_2, &s_z, &s_z, &s_z };
  104. uint8_t READ_PIN_COUNT_R0 = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
  105. Row_ShiftRegisters row_R0(8, READ_PIN_COUNT_R0, ptrsKeys_R0);
  106. */
  107. /*
  108. //prints 0 1 2 3
  109. Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z,
  110. &s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z };
  111. uint8_t READ_PIN_COUNT_R0 = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
  112. Row_ShiftRegisters row_R0(8, READ_PIN_COUNT_R0, ptrsKeys_R0);
  113. */
  114. /*
  115. //prints 0 1 2 3 4 5
  116. Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z,
  117. &s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z,
  118. &s_4, &s_z, &s_z, &s_z, &s_5, &s_z, &s_z, &s_z };
  119. uint8_t READ_PIN_COUNT_R0 = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
  120. Row_ShiftRegisters row_R0(8, READ_PIN_COUNT_R0, ptrsKeys_R0);
  121. */
  122. //prints 0 1 2 3 3 4 5 6, microseconds_per_scan=87 with SAMPLE_COUNT 4
  123. Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z,
  124. &s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z,
  125. &s_4, &s_z, &s_z, &s_z, &s_5, &s_z, &s_z, &s_z,
  126. &s_6, &s_z, &s_z, &s_z, &s_3, &s_4, &s_5, &s_6 };
  127. uint8_t READ_PIN_COUNT_R0 = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
  128. Row_ShiftRegisters row_R0(0, READ_PIN_COUNT_R0, ptrsKeys_R0);
  129. //prints a b c d u v w x
  130. Key* ptrsKeys_R1[] = { &s_a, &s_z, &s_z, &s_z, &s_b, &s_z, &s_z, &s_z,
  131. &s_c, &s_z, &s_z, &s_z, &s_d, &s_z, &s_z, &s_z,
  132. &s_e, &s_z, &s_z, &s_z, &s_f, &s_z, &s_z, &s_z,
  133. &s_g, &s_z, &s_z, &s_z, &s_u, &s_v, &s_w, &s_x };
  134. uint8_t READ_PIN_COUNT_R1 = sizeof(ptrsKeys_R1)/sizeof(*ptrsKeys_R1);
  135. Row_ShiftRegisters row_R1(1, READ_PIN_COUNT_R1, ptrsKeys_R1);
  136. // ################### MAIN ####################
  137. void setup()
  138. {
  139. Keyboard.begin();
  140. SPI.begin();
  141. row_R0.begin();
  142. row_R1.begin();
  143. wait();
  144. Keyboard.println(F("keybrd_shift_reg.ino"));
  145. }
  146. void loop()
  147. {
  148. //left matrix
  149. row_L0.process();
  150. row_L1.process();
  151. //right matrix
  152. row_R0.process();
  153. row_R1.process();
  154. scanDelay.delay();
  155. //delay(100);
  156. //Keyboard.println("");
  157. //debug.print_microseconds_per_scan();
  158. }