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.

244 lines
4.9 KiB

  1. #include "quantum.h"
  2. static uint8_t debouncing = DEBOUNCE;
  3. static matrix_row_t matrix[MATRIX_ROWS];
  4. static matrix_row_t matrix_debouncing[MATRIX_ROWS];
  5. static uint8_t read_rows(void);
  6. static void init_rows(void);
  7. static void init_cols(void);
  8. static void unselect_cols(void);
  9. static void select_col(uint8_t col);
  10. __attribute__ ((weak))
  11. void matrix_init_kb(void)
  12. {
  13. matrix_init_user();
  14. }
  15. __attribute__ ((weak))
  16. void matrix_scan_kb(void)
  17. {
  18. matrix_scan_user();
  19. }
  20. __attribute__ ((weak))
  21. void matrix_init_user(void) {}
  22. __attribute__ ((weak))
  23. void matrix_scan_user(void) {}
  24. void matrix_init(void)
  25. {
  26. //setPinOutput(F0);
  27. //writePinHigh(F0);
  28. setPinOutput(B4);
  29. writePinLow(B4);
  30. init_cols();
  31. init_rows();
  32. for (uint8_t i=0; i < MATRIX_ROWS; i++) {
  33. matrix[i] = 0;
  34. matrix_debouncing[i] = 0;
  35. }
  36. matrix_init_quantum();
  37. }
  38. uint8_t matrix_scan(void)
  39. {
  40. for (uint8_t col = 0; col < MATRIX_COLS; col++) {
  41. select_col(col);
  42. _delay_us(3);
  43. uint8_t rows = read_rows();
  44. for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
  45. bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col);
  46. bool curr_bit = rows & (1<<row);
  47. if (prev_bit != curr_bit) {
  48. matrix_debouncing[row] ^= ((matrix_row_t)1<<col);
  49. debouncing = DEBOUNCE;
  50. }
  51. }
  52. unselect_cols();
  53. }
  54. if (debouncing) {
  55. if (--debouncing) {
  56. _delay_ms(1);
  57. } else {
  58. for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
  59. matrix[i] = matrix_debouncing[i];
  60. }
  61. }
  62. }
  63. matrix_scan_quantum();
  64. return 1;
  65. }
  66. inline matrix_row_t matrix_get_row(uint8_t row)
  67. {
  68. return matrix[row];
  69. }
  70. void matrix_print(void)
  71. {
  72. print("\nr/c 0123456789ABCDEF\n");
  73. for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
  74. xprintf("%02X: %032lb\n", row, bitrev32(matrix_get_row(row)));
  75. }
  76. }
  77. /*
  78. * Row pin configuration
  79. * row: 0 1 2 3 4
  80. * pin: PE6 PF6 PF7 PB7 PD4
  81. */
  82. static void init_rows(void)
  83. {
  84. setPinInputHigh(E6);
  85. setPinInputHigh(F6);
  86. setPinInputHigh(F7);
  87. setPinInputHigh(B7);
  88. setPinInputHigh(D4);
  89. }
  90. static uint8_t read_rows()
  91. {
  92. return ((readPin(E6) ? 0 : (1 << 0)) |
  93. (readPin(F6) ? 0 : (1 << 1)) |
  94. (readPin(F7) ? 0 : (1 << 2)) |
  95. (readPin(B7) ? 0 : (1 << 3)) |
  96. (readPin(D4) ? 0 : (1 << 4)));
  97. }
  98. /*
  99. * Columns 0 - 13
  100. * These columns uses two 74LVC138 3 to 8 bit demultiplexers.
  101. * EN Pin, PF5, PD6
  102. *
  103. * col / pin: PF0 PF1 PF4
  104. * 0: 0 0 0
  105. * 1: 1 0 0
  106. * 2: 0 1 0
  107. * 3: 1 1 0
  108. * 4: 0 0 1
  109. * 5: 1 0 1
  110. * 6: 0 1 1
  111. * PD2 PD3 PD5
  112. * 7: 0 0 0
  113. * 8: 1 0 0
  114. * 9: 0 1 0
  115. * 10: 1 1 0
  116. * 11: 0 0 1
  117. * 12: 1 0 1
  118. * 13: 0 1 1
  119. *
  120. */
  121. static void init_cols(void)
  122. {
  123. setPinOutput(F0);
  124. setPinOutput(F1);
  125. setPinOutput(F4);
  126. setPinOutput(F5);
  127. setPinOutput(D2);
  128. setPinOutput(D3);
  129. setPinOutput(D5);
  130. setPinOutput(D6);
  131. unselect_cols();
  132. }
  133. static void unselect_cols(void)
  134. {
  135. writePinHigh(F0);
  136. writePinHigh(F1);
  137. writePinHigh(F4);
  138. writePinHigh(F5);
  139. writePinHigh(D2);
  140. writePinHigh(D3);
  141. writePinHigh(D5);
  142. writePinHigh(D6);
  143. }
  144. static void select_col(uint8_t col) {
  145. switch (col) {
  146. case 0:
  147. writePinLow(F0);
  148. writePinLow(F1);
  149. writePinLow(F4);
  150. break;
  151. case 1:
  152. writePinHigh(F0);
  153. writePinLow(F1);
  154. writePinLow(F4);
  155. break;
  156. case 2:
  157. writePinLow(F0);
  158. writePinHigh(F1);
  159. writePinLow(F4);
  160. break;
  161. case 3:
  162. writePinHigh(F0);
  163. writePinHigh(F1);
  164. writePinLow(F4);
  165. break;
  166. case 4:
  167. writePinLow(F0);
  168. writePinLow(F1);
  169. writePinHigh(F4);
  170. break;
  171. case 5:
  172. writePinHigh(F0);
  173. writePinLow(F1);
  174. writePinHigh(F4);
  175. break;
  176. case 6:
  177. writePinLow(F0);
  178. writePinHigh(F1);
  179. writePinHigh(F4);
  180. break;
  181. case 7:
  182. writePinLow(D2);
  183. writePinLow(D3);
  184. writePinLow(D5);
  185. break;
  186. case 8:
  187. writePinHigh(D2);
  188. writePinLow(D3);
  189. writePinLow(D5);
  190. break;
  191. case 9:
  192. writePinLow(D2);
  193. writePinHigh(D3);
  194. writePinLow(D5);
  195. break;
  196. case 10:
  197. writePinHigh(D2);
  198. writePinHigh(D3);
  199. writePinLow(D5);
  200. break;
  201. case 11:
  202. writePinLow(D2);
  203. writePinLow(D3);
  204. writePinHigh(D5);
  205. break;
  206. case 12:
  207. writePinHigh(D2);
  208. writePinLow(D3);
  209. writePinHigh(D5);
  210. break;
  211. case 13:
  212. writePinLow(D2);
  213. writePinHigh(D3);
  214. writePinHigh(D5);
  215. break;
  216. }
  217. }