keybrd library is an open source library for creating custom-keyboard firmware.
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

keybrd_shift_register.ino 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /* keybrd_shift_reg.ino
  2. tested on Teensy LC and daisy chained 74HC165 shift registers
  3. add this line to RowScanner_SPIShiftRegisters::scan():
  4. //clear unpowered pins (for testing bb)
  5. rowState &= 0b01010001000100010001000100010001; //also 31st key
  6. Layout
  7. | Left |**0**|**1**| | Right |**0**|**1**|**2**|**3**|**4**|**5**|**6**|**7**|**8**|
  8. |:-----:|-----|-----| |:-----:|-----|-----|-----|-----|-----|-----|-----|-----|-----|
  9. | **0** | a | b | | **0** | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
  10. | **1** | c | d | | **1** | a | b | c | d | e | f | g | h | i |
  11. */
  12. // ################## GLOBAL ###################
  13. // ================= INCLUDES ==================
  14. #include <Debug.h>
  15. //Codes
  16. #include <Code_Sc.h>
  17. //Matrix
  18. #include <Row_uC.h>
  19. #include <SPI.h>
  20. #include <Row_ShiftRegisters.h>
  21. // =============== CONFIGURATION ===============
  22. const unsigned int RowBase::DELAY_MICROSECONDS = 500; //500
  23. const uint8_t RowScanner_SPIShiftRegisters::SHIFT_LOAD = 10;
  24. //activeLow has diode cathode (band) on row
  25. //activeHigh has diode cathode (band) on col, and pull down resistors on cols
  26. //0=active low, 1= active high
  27. const bool RowScanner_PinsArray::ACTIVE_HIGH = 0;
  28. Debug debug;
  29. // ================= LEFT PINS =================
  30. uint8_t readPins[] = {14, 15};
  31. uint8_t READ_PIN_COUNT = sizeof(readPins)/sizeof(*readPins);
  32. // =================== CODES ===================
  33. Code_Sc s_a(KEY_A);
  34. Code_Sc s_b(KEY_B);
  35. Code_Sc s_c(KEY_C);
  36. Code_Sc s_d(KEY_D);
  37. Code_Sc s_e(KEY_E);
  38. Code_Sc s_f(KEY_F);
  39. Code_Sc s_g(KEY_G);
  40. Code_Sc s_h(KEY_H);
  41. Code_Sc s_i(KEY_I);
  42. Code_Sc s_0(KEY_0);
  43. Code_Sc s_1(KEY_1);
  44. Code_Sc s_2(KEY_2);
  45. Code_Sc s_3(KEY_3);
  46. Code_Sc s_4(KEY_4);
  47. Code_Sc s_5(KEY_5);
  48. Code_Sc s_6(KEY_6);
  49. Code_Sc s_7(KEY_7);
  50. Code_Sc s_8(KEY_8);
  51. Code_Sc s_z(KEY_Z);
  52. // ================= LEFT ROWS =================
  53. Key* ptrsKeys_L0[] = { &s_a, &s_b };
  54. Row_uC row_L0(0, readPins, READ_PIN_COUNT, ptrsKeys_L0);
  55. Key* ptrsKeys_L1[] = { &s_c, &s_d };
  56. Row_uC row_L1(1, readPins, READ_PIN_COUNT, ptrsKeys_L1);
  57. // ================= RIGHT ROWS ================
  58. //typedef should be large in /home/wolfv/Documents/Arduino/keybrd_proj/keybrd/src/config_keybrd.h
  59. //Row_ShiftRegisters(STROBE_PIN, ptrsKeys[], KEY_COUNT)
  60. //the s_z are place holders and should not print
  61. //prints 0 1
  62. Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z };
  63. const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
  64. Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT);
  65. //prints a b
  66. Key* ptrsKeys_R1[] = { &s_a, &s_z, &s_z, &s_z, &s_b, &s_z, &s_z, &s_z };
  67. const uint8_t KEY_R1_COUNT = sizeof(ptrsKeys_R1)/sizeof(*ptrsKeys_R1);
  68. Row_ShiftRegisters row_R1(9, ptrsKeys_R1, KEY_R1_COUNT);
  69. /*
  70. //prints 0 1 2
  71. Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z,
  72. &s_2, &s_z, &s_z, &s_z };
  73. const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
  74. Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT);
  75. */
  76. /*
  77. //prints 0 1 2 3
  78. Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z,
  79. &s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z };
  80. const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
  81. Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT);
  82. */
  83. /*
  84. //prints 0 1 2 3 4 5
  85. Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z,
  86. &s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z,
  87. &s_4, &s_z, &s_z, &s_z, &s_5, &s_z, &s_z, &s_z };
  88. const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
  89. Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT);
  90. */
  91. /*
  92. //prints 0 1 2 3 4 5 6 7 8
  93. Key* ptrsKeys_R0[] = { &s_0, &s_z, &s_z, &s_z, &s_1, &s_z, &s_z, &s_z,
  94. &s_2, &s_z, &s_z, &s_z, &s_3, &s_z, &s_z, &s_z,
  95. &s_4, &s_z, &s_z, &s_z, &s_5, &s_z, &s_z, &s_z,
  96. &s_6, &s_z, &s_z, &s_z, &s_7, &s_z, &s_8 }; //31-key limit because endRow
  97. const uint8_t KEY_R0_COUNT = sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0);
  98. Row_ShiftRegisters row_R0(8, ptrsKeys_R0, KEY_R0_COUNT);
  99. //prints a b c d e f g h i
  100. Key* ptrsKeys_R1[] = { &s_a, &s_z, &s_z, &s_z, &s_b, &s_z, &s_z, &s_z,
  101. &s_c, &s_z, &s_z, &s_z, &s_d, &s_z, &s_z, &s_z,
  102. &s_e, &s_z, &s_z, &s_z, &s_f, &s_z, &s_z, &s_z,
  103. &s_g, &s_z, &s_z, &s_z, &s_h, &s_z, &s_i }; //31-key limit because endRow
  104. const uint8_t KEY_R1_COUNT = sizeof(ptrsKeys_R1)/sizeof(*ptrsKeys_R1);
  105. Row_ShiftRegisters row_R1(9, ptrsKeys_R1, KEY_R1_COUNT);
  106. */
  107. const uint8_t LED_PIN = 16; //indicates wait
  108. //sometimes OS takes 6 seconds to recongnize keyboard, LED blinks from the begining
  109. void wait()
  110. {
  111. for (uint8_t count = 0; count < 7; count++)
  112. {
  113. //print count
  114. Keyboard.print(count);
  115. Keyboard.print(F(" "));
  116. //blink LED
  117. digitalWrite(LED_PIN, HIGH);
  118. delay(900);
  119. digitalWrite(LED_PIN, LOW);
  120. delay(100);
  121. }
  122. }
  123. // ################### MAIN ####################
  124. void setup()
  125. {
  126. pinMode (LED_PIN, OUTPUT);
  127. Keyboard.begin();
  128. wait();
  129. SPI.begin();
  130. row_R0.begin();
  131. row_R1.begin();
  132. Keyboard.print(F("keybrd_shift_reg.ino "));
  133. debug.print_free_RAM();
  134. }
  135. void loop()
  136. {
  137. row_L0.process();
  138. row_L1.process();
  139. row_R0.process();
  140. row_R1.process();
  141. //delay(100);
  142. //Keyboard.println("");
  143. //debug.print_microseconds_per_scan();
  144. }