keyboard.ino 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #include "keyboard.h"
  2. #include "helper.h"
  3. KEY_DEB keyboard_debouncing;
  4. uint8_t matrix_rows[ MATRIX_ROWS ]= {ROW1,ROW2,ROW3,ROW4,ROW5,ROW6,ROW7,ROW8};
  5. uint8_t matrix_cols[ MATRIX_COLS ] = {COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8};
  6. /* matrix state(1:on, 0:off) */
  7. static uint8_t matrix[MATRIX_ROWS];
  8. static uint8_t matrix_debouncing[MATRIX_COLS];
  9. static uint8_t matrix_prev[MATRIX_ROWS];
  10. uint8_t read_kbd_io(uint8_t io) {
  11. #if defined KEYBOARD_PULL && KEYBOARD_PULL == 0
  12. if(digitalRead(io) == LOW ){
  13. return 0;
  14. }else {
  15. return 1;
  16. }
  17. #elif defined KEYBOARD_PULL && KEYBOARD_PULL == 1
  18. if(digitalRead(io) == LOW ){
  19. return 1;
  20. }else {
  21. return 0;
  22. }
  23. #endif
  24. }
  25. void init_rows(){
  26. int i;
  27. for(i=0;i<8;i++) {
  28. #if defined KEYBOARD_PULL && KEYBOARD_PULL == 0
  29. pinMode(matrix_rows[i],OUTPUT);
  30. digitalWrite(matrix_rows[i],LOW);
  31. pinMode(matrix_rows[i],INPUT_PULLDOWN);
  32. #elif defined KEYBOARD_PULL && KEYBOARD_PULL == 1
  33. pinMode(matrix_rows[i],INPUT_PULLUP);
  34. #endif
  35. }
  36. }
  37. void init_cols() {
  38. int i;
  39. for(i=0;i<8;i++){
  40. pinMode(matrix_cols[i],OUTPUT);
  41. digitalWrite(matrix_cols[i],LOW);
  42. }
  43. }
  44. void matrix_init() {
  45. init_cols();
  46. init_rows();
  47. for (uint8_t i=0; i < MATRIX_ROWS; i++) {
  48. matrix[i] = 0;
  49. matrix_debouncing[i] = 0;
  50. matrix_prev[i] = 0;
  51. }
  52. delay(500);
  53. }
  54. uint8_t matrix_scan(void) {
  55. uint8_t data;
  56. for(int col = 0; col < MATRIX_COLS;col++){
  57. data = 0;
  58. #if defined KEYBOARD_PULL && KEYBOARD_PULL == 1
  59. digitalWrite(matrix_cols[col],LOW);
  60. #elif defined KEYBOARD_PULL && KEYBOARD_PULL == 0
  61. digitalWrite(matrix_cols[col],HIGH);
  62. #endif
  63. delayMicroseconds(700);
  64. data =(
  65. ( read_kbd_io(matrix_rows[0]) << 0 ) |
  66. ( read_kbd_io(matrix_rows[1]) << 1 ) |
  67. ( read_kbd_io(matrix_rows[2]) << 2 ) |
  68. ( read_kbd_io(matrix_rows[3]) << 3 ) |
  69. ( read_kbd_io(matrix_rows[4]) << 4 ) |
  70. ( read_kbd_io(matrix_rows[5]) << 5 ) |
  71. ( read_kbd_io(matrix_rows[6]) << 6 ) |
  72. ( read_kbd_io(matrix_rows[7]) << 7 )
  73. );
  74. #if defined KEYBOARD_PULL && KEYBOARD_PULL == 1
  75. digitalWrite(matrix_cols[col],HIGH);
  76. #elif defined KEYBOARD_PULL && KEYBOARD_PULL == 0
  77. digitalWrite(matrix_cols[col],LOW);
  78. #endif
  79. if (matrix_debouncing[col] != data) {
  80. matrix_debouncing[col] = data;
  81. keyboard_debouncing.deing = true;
  82. keyboard_debouncing.de_time = millis();
  83. }
  84. }
  85. if (keyboard_debouncing.deing == true && ( (millis() - keyboard_debouncing.de_time) > DEBOUNCE )) {
  86. for (int row = 0; row < MATRIX_ROWS; row++) {
  87. matrix[row] = 0;
  88. for (int col = 0; col < MATRIX_COLS; col++) {
  89. matrix[row] |= ((matrix_debouncing[col] & (1 << row) ? 1 : 0) << col);
  90. }
  91. }
  92. keyboard_debouncing.deing = false;
  93. }else{
  94. delay(1);
  95. }
  96. return 1;
  97. }
  98. bool matrix_is_on(uint8_t row, uint8_t col) {
  99. return (matrix[row] & (1<<col));
  100. }
  101. uint8_t matrix_get_row(uint8_t row) {
  102. return matrix[row];
  103. }
  104. void matrix_press(DEVTERM*dv,uint8_t row,uint8_t col) {
  105. char buff[128];
  106. if(matrix_is_on(row,col) == true ){
  107. sprintf(buff,"%d %d M%d pressed\n",row,col,(row+1)*10+col+1);
  108. //dv->_Serial->print(buff);
  109. keyboard_action(dv,row,col,KEY_PRESSED);
  110. }
  111. }
  112. void matrix_release(DEVTERM*dv,uint8_t row,uint8_t col) {
  113. char buff[128];
  114. if(matrix_is_on(row,col) == false ){
  115. sprintf(buff,"%d %d M%d released\n",row,col,(row+1)*10+col+1);
  116. //dv->_Serial->print(buff);
  117. keyboard_action(dv,row,col,KEY_RELEASED);
  118. }
  119. }
  120. void keyboard_task(DEVTERM*dv)
  121. {
  122. char buff[128];
  123. uint8_t matrix_row = 0;
  124. uint8_t matrix_change = 0;
  125. uint8_t pressed = 0;
  126. matrix_scan();
  127. for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
  128. matrix_row = matrix_get_row(r);
  129. matrix_change = matrix_row ^ matrix_prev[r];
  130. if (matrix_change) {
  131. //sprintf(buff,"matrix_row: %d %d\n",matrix_row,matrix_prev[r]);
  132. //dv->_Serial->print(buff);
  133. uint8_t col_mask = 1;
  134. for (uint8_t c = 0; c < MATRIX_COLS; c++, col_mask <<= 1) {
  135. if (matrix_change & col_mask) {
  136. pressed = (matrix_row & col_mask);
  137. if(pressed != 0) {
  138. matrix_press(dv,r,c);
  139. }else {
  140. matrix_release(dv,r,c);
  141. }
  142. matrix_prev[r] ^= col_mask;
  143. }
  144. }
  145. }
  146. }
  147. }
  148. void keyboard_init(DEVTERM*){
  149. matrix_init();
  150. keyboard_debouncing.deing=false;
  151. keyboard_debouncing.de_time = 0;
  152. }