1 #define F_CPU 16000000UL
3 #include <util/delay.h>
7 #include "uno-matrix.h"
10 #define debug_hex(X) NULL
16 static uint8_t debouncing = DEBOUNCE;
18 /* matrix state(1:on, 0:off) */
19 static matrix_row_t matrix[MATRIX_ROWS];
20 static matrix_row_t matrix_debouncing[MATRIX_ROWS];
22 static matrix_row_t read_cols(void);
23 static void init_cols(void);
24 static void unselect_rows(void);
25 static void select_row(uint8_t row);
28 uint8_t matrix_rows(void)
34 uint8_t matrix_cols(void)
39 void matrix_init(void)
41 //debug_enable = true;
42 //debug_matrix = true;
44 // initialize row and col
48 // initialize matrix state: all keys off
49 for (uint8_t i=0; i < MATRIX_ROWS; i++) {
51 matrix_debouncing[i] = 0;
55 uint8_t matrix_scan(void)
57 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
59 _delay_us(30); // without this wait read unstable value.
60 matrix_row_t cols = read_cols();
61 //Serial.println(cols, BIN);
62 if (matrix_debouncing[i] != cols) {
63 matrix_debouncing[i] = cols;
65 debug("bounce!: "); debug_hex(debouncing); debug("\n");
67 debouncing = DEBOUNCE;
76 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
77 matrix[i] = matrix_debouncing[i];
85 bool matrix_is_modified(void)
87 if (debouncing) return false;
92 bool matrix_is_on(uint8_t row, uint8_t col)
94 return (matrix[row] & ((matrix_row_t)1<<col));
98 matrix_row_t matrix_get_row(uint8_t row)
103 // TODO update this comment
104 /* Column pin configuration
106 * pin: D3 D4 D5 D6 D7 B0
108 static void init_cols(void)
110 // Input with pull-up(DDR:0, PORT:1)
111 DDRD &= ~(1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7);
112 PORTD |= (1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7);
118 static matrix_row_t read_cols(void)
120 return (PIND&(1<<3) ? 0 : (1<<0)) |
121 (PIND&(1<<4) ? 0 : (1<<1)) |
122 (PIND&(1<<5) ? 0 : (1<<2)) |
123 (PIND&(1<<6) ? 0 : (1<<3)) |
124 (PIND&(1<<7) ? 0 : (1<<4)) |
125 (PINB&(1<<0) ? 0 : (1<<5));
128 /* Row pin configuration
132 static void unselect_rows(void)
134 // Hi-Z(DDR:0, PORT:0) to unselect
139 static void select_row(uint8_t row)
141 // Output low(DDR:1, PORT:0) to select