4 #include <util/delay.h>
10 #ifndef DEBOUNCING_DELAY
11 # define DEBOUNCING_DELAY 5
13 static uint8_t debouncing = DEBOUNCING_DELAY;
15 static matrix_row_t matrix[MATRIX_ROWS];
16 static matrix_row_t matrix_debouncing[MATRIX_ROWS];
18 static uint8_t read_rows(void);
19 static void init_rows(void);
20 static void unselect_cols(void);
21 static void select_col(uint8_t col);
23 inline uint8_t matrix_rows(void) {
27 inline uint8_t matrix_cols(void) {
31 void matrix_init(void) {
32 // initialize row and col
36 // initialize matrix state: all keys off
37 for (uint8_t i=0; i < MATRIX_ROWS; i++) {
39 matrix_debouncing[i] = 0;
41 matrix_init_quantum();
44 uint8_t matrix_scan(void) {
45 for (uint8_t col = 0; col < MATRIX_COLS; col++) {
48 uint8_t rows = read_rows();
49 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
50 bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col);
51 bool curr_bit = rows & (1<<row);
52 if (prev_bit != curr_bit) {
53 matrix_debouncing[row] ^= ((matrix_row_t)1<<col);
54 debouncing = DEBOUNCING_DELAY;
64 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
65 matrix[i] = matrix_debouncing[i];
70 matrix_scan_quantum();
74 bool matrix_is_modified(void) {
81 inline bool matrix_is_on(uint8_t row, uint8_t col) {
82 return (matrix[row] & ((matrix_row_t)1<<col));
85 inline matrix_row_t matrix_get_row(uint8_t row) {
89 void matrix_print(void) {
90 print("\nr/c 0123456789ABCDEF\n");
91 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
92 xprintf("%02X: %032lb\n", row, bitrev32(matrix_get_row(row)));
96 uint8_t matrix_key_count(void) {
98 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
99 count += bitpop32(matrix[i]);
104 /* Row pin configuration
107 * pin: C7 B1 B2 C6 B4 B5
110 static void init_rows(void)
118 static uint8_t read_rows(void) {
119 return (PINC&(1<<PC7) ? 0 : (1<<0)) |
120 (PINB&(1<<PB1) ? 0 : (1<<1)) |
121 (PINB&(1<<PB2) ? 0 : (1<<2)) |
122 (PINC&(1<<PC6) ? 0 : (1<<3)) |
123 (PINB&(1<<PB4) ? 0 : (1<<4)) |
124 (PINB&(1<<PB5) ? 0 : (1<<5));
127 /* Row pin configuration
128 * pin: D3 D7 D6 D5 D4
147 static void unselect_cols(void)
149 // output high(DDR:1, PORT:1) to unselect
154 static void select_col(uint8_t col) {
155 DDRD |= (1<<PD3 | 1<<PD4 | 1<<PD5 | 1<<PD6 | 1<<PD7);