aboutsummaryrefslogtreecommitdiff
path: root/keyboards/matrix/noah/matrix.c
diff options
context:
space:
mode:
authoryulei <yuleiz@gmail.com>2019-11-27 23:54:02 +0800
committerMechMerlin <30334081+mechmerlin@users.noreply.github.com>2019-11-27 07:54:02 -0800
commit265c415f5e13b32fd14f06d8af4ae2498ba9059b (patch)
tree95a9820ec26722e42db85b19a8e32ded3da3fb7a /keyboards/matrix/noah/matrix.c
parent2b318ba01b6e504bfe5f300f8459afc849e104b7 (diff)
downloadqmk_firmware-265c415f5e13b32fd14f06d8af4ae2498ba9059b.tar.gz
qmk_firmware-265c415f5e13b32fd14f06d8af4ae2498ba9059b.zip
adding noah keyboard (#7432)
* adding noah keyboard * Update keyboards/matrix/noah/config.h Co-Authored-By: Drashna Jaelre <drashna@live.com> * Update keyboards/matrix/noah/noah.c Co-Authored-By: Drashna Jaelre <drashna@live.com>
Diffstat (limited to 'keyboards/matrix/noah/matrix.c')
-rw-r--r--keyboards/matrix/noah/matrix.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/keyboards/matrix/noah/matrix.c b/keyboards/matrix/noah/matrix.c
new file mode 100644
index 000000000..02861a8e3
--- /dev/null
+++ b/keyboards/matrix/noah/matrix.c
@@ -0,0 +1,166 @@
1/**
2 * matrix.c
3 */
4
5#include <stdint.h>
6#include <stdbool.h>
7#include <string.h>
8#include "hal.h"
9#include "quantum.h"
10#include "timer.h"
11#include "wait.h"
12#include "printf.h"
13#include "matrix.h"
14
15/**
16 *
17 * Row pins are input with internal pull-down.
18 * Column pins are output and strobe with high.
19 * Key is high or 1 when it turns on.
20 *
21 */
22/* matrix state(1:on, 0:off) */
23static matrix_row_t matrix[MATRIX_ROWS];
24static matrix_row_t matrix_debouncing[MATRIX_COLS];
25static bool debouncing = false;
26static uint16_t debouncing_time = 0;
27
28void matrix_init(void)
29{
30 //debug_enable = true;
31 palSetLineMode(LINE_COL_1, PAL_MODE_OUTPUT_PUSHPULL);
32 palSetLineMode(LINE_COL_2, PAL_MODE_OUTPUT_PUSHPULL);
33 palSetLineMode(LINE_COL_3, PAL_MODE_OUTPUT_PUSHPULL);
34 palSetLineMode(LINE_COL_4, PAL_MODE_OUTPUT_PUSHPULL);
35 palSetLineMode(LINE_COL_5, PAL_MODE_OUTPUT_PUSHPULL);
36 palSetLineMode(LINE_COL_6, PAL_MODE_OUTPUT_PUSHPULL);
37 palSetLineMode(LINE_COL_7, PAL_MODE_OUTPUT_PUSHPULL);
38 palSetLineMode(LINE_COL_8, PAL_MODE_OUTPUT_PUSHPULL);
39 palSetLineMode(LINE_COL_9, PAL_MODE_OUTPUT_PUSHPULL);
40 palSetLineMode(LINE_COL_10, PAL_MODE_OUTPUT_PUSHPULL);
41 palSetLineMode(LINE_COL_11, PAL_MODE_OUTPUT_PUSHPULL);
42 palSetLineMode(LINE_COL_12, PAL_MODE_OUTPUT_PUSHPULL);
43 palSetLineMode(LINE_COL_13, PAL_MODE_OUTPUT_PUSHPULL);
44 palSetLineMode(LINE_COL_14, PAL_MODE_OUTPUT_PUSHPULL);
45 palSetLineMode(LINE_COL_15, PAL_MODE_OUTPUT_PUSHPULL);
46
47 palSetLineMode(LINE_ROW_1, PAL_MODE_INPUT_PULLDOWN);
48 palSetLineMode(LINE_ROW_2, PAL_MODE_INPUT_PULLDOWN);
49 palSetLineMode(LINE_ROW_3, PAL_MODE_INPUT_PULLDOWN);
50 palSetLineMode(LINE_ROW_4, PAL_MODE_INPUT_PULLDOWN);
51 palSetLineMode(LINE_ROW_5, PAL_MODE_INPUT_PULLDOWN);
52
53 palClearLine(LINE_COL_1);
54 palClearLine(LINE_COL_2);
55 palClearLine(LINE_COL_3);
56 palClearLine(LINE_COL_4);
57 palClearLine(LINE_COL_5);
58 palClearLine(LINE_COL_6);
59 palClearLine(LINE_COL_7);
60 palClearLine(LINE_COL_8);
61 palClearLine(LINE_COL_9);
62 palClearLine(LINE_COL_10);
63 palClearLine(LINE_COL_11);
64 palClearLine(LINE_COL_12);
65 palClearLine(LINE_COL_13);
66 palClearLine(LINE_COL_14);
67 palClearLine(LINE_COL_15);
68
69 memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t));
70 memset(matrix_debouncing, 0, MATRIX_COLS * sizeof(matrix_row_t));
71
72 matrix_init_quantum();
73}
74
75uint8_t matrix_scan(void)
76{
77 for (int col = 0; col < MATRIX_COLS; col++) {
78 matrix_row_t data = 0;
79 switch (col) {
80 case 0: palSetLine(LINE_COL_1); break;
81 case 1: palSetLine(LINE_COL_2); break;
82 case 2: palSetLine(LINE_COL_3); break;
83 case 3: palSetLine(LINE_COL_4); break;
84 case 4: palSetLine(LINE_COL_5); break;
85 case 5: palSetLine(LINE_COL_6); break;
86 case 6: palSetLine(LINE_COL_7); break;
87 case 7: palSetLine(LINE_COL_8); break;
88 case 8: palSetLine(LINE_COL_9); break;
89 case 9: palSetLine(LINE_COL_10); break;
90 case 10: palSetLine(LINE_COL_11); break;
91 case 11: palSetLine(LINE_COL_12); break;
92 case 12: palSetLine(LINE_COL_13); break;
93 case 13: palSetLine(LINE_COL_14); break;
94 case 14: palSetLine(LINE_COL_15); break;
95 }
96
97 // need wait to settle pin state
98 wait_us(20);
99
100 data = (
101 (palReadLine(LINE_ROW_1) << 0 ) |
102 (palReadLine(LINE_ROW_2) << 1 ) |
103 (palReadLine(LINE_ROW_3) << 2 ) |
104 (palReadLine(LINE_ROW_4) << 3 ) |
105 (palReadLine(LINE_ROW_5) << 4 )
106 );
107
108 switch (col) {
109 case 0: palClearLine(LINE_COL_1); break;
110 case 1: palClearLine(LINE_COL_2); break;
111 case 2: palClearLine(LINE_COL_3); break;
112 case 3: palClearLine(LINE_COL_4); break;
113 case 4: palClearLine(LINE_COL_5); break;
114 case 5: palClearLine(LINE_COL_6); break;
115 case 6: palClearLine(LINE_COL_7); break;
116 case 7: palClearLine(LINE_COL_8); break;
117 case 8: palClearLine(LINE_COL_9); break;
118 case 9: palClearLine(LINE_COL_10); break;
119 case 10: palClearLine(LINE_COL_11); break;
120 case 11: palClearLine(LINE_COL_12); break;
121 case 12: palClearLine(LINE_COL_13); break;
122 case 13: palClearLine(LINE_COL_14); break;
123 case 14: palClearLine(LINE_COL_15); break;
124 }
125
126 if (matrix_debouncing[col] != data) {
127 matrix_debouncing[col] = data;
128 debouncing = true;
129 debouncing_time = timer_read();
130 }
131 }
132
133 if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCING_DELAY) {
134 for (int row = 0; row < MATRIX_ROWS; row++) {
135 matrix[row] = 0;
136 for (int col = 0; col < MATRIX_COLS; col++) {
137 matrix[row] |= ((matrix_debouncing[col] & (1 << row) ? 1 : 0) << col);
138 }
139 }
140 debouncing = false;
141 }
142
143 matrix_scan_quantum();
144
145 return 1;
146}
147
148bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & (1<<col)); }
149
150matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; }
151
152void matrix_print(void)
153{
154 printf("\nr/c 01234567\n");
155 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
156 printf("%X0: ", row);
157 matrix_row_t data = matrix_get_row(row);
158 for (int col = 0; col < MATRIX_COLS; col++) {
159 if (data & (1<<col))
160 printf("1");
161 else
162 printf("0");
163 }
164 printf("\n");
165 }
166}