summaryrefslogtreecommitdiff
path: root/keyboards/al1/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/al1/matrix.c')
-rw-r--r--keyboards/al1/matrix.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/keyboards/al1/matrix.c b/keyboards/al1/matrix.c
new file mode 100644
index 000000000..f7ed7fbb0
--- /dev/null
+++ b/keyboards/al1/matrix.c
@@ -0,0 +1,184 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <util/delay.h>
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+
+#ifndef DEBOUNCING_DELAY
+# define DEBOUNCING_DELAY 5
+#endif
+static uint8_t debouncing = DEBOUNCING_DELAY;
+
+static matrix_row_t matrix[MATRIX_ROWS];
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+
+static uint8_t read_rows(void);
+static void init_rows(void);
+static void unselect_cols(void);
+static void select_col(uint8_t col);
+
+inline uint8_t matrix_rows(void) {
+ return MATRIX_ROWS;
+}
+
+inline uint8_t matrix_cols(void) {
+ return MATRIX_COLS;
+}
+
+
+void matrix_init(void) {
+ // initialize row and col
+ unselect_cols();
+ init_rows();
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ matrix[i] = 0;
+ matrix_debouncing[i] = 0;
+ }
+ matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ select_col(col);
+ _delay_us(3);
+ uint8_t rows = read_rows();
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col);
+ bool curr_bit = rows & (1<<row);
+ if (prev_bit != curr_bit) {
+ matrix_debouncing[row] ^= ((matrix_row_t)1<<col);
+ debouncing = DEBOUNCING_DELAY;
+ }
+ }
+ unselect_cols();
+ }
+
+ if (debouncing) {
+ if (--debouncing) {
+ _delay_ms(1);
+ } else {
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ matrix[i] = matrix_debouncing[i];
+ }
+ }
+ }
+
+ matrix_scan_quantum();
+ return 1;
+}
+
+bool matrix_is_modified(void) {
+ if (debouncing)
+ return false;
+ else
+ return true;
+}
+
+inline bool matrix_is_on(uint8_t row, uint8_t col) {
+ return (matrix[row] & ((matrix_row_t)1<<col));
+}
+
+inline matrix_row_t matrix_get_row(uint8_t row) {
+ return matrix[row];
+}
+
+void matrix_print(void) {
+ print("\nr/c 0123456789ABCDEF\n");
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ xprintf("%02X: %032lb\n", row, bitrev32(matrix_get_row(row)));
+ }
+}
+
+uint8_t matrix_key_count(void) {
+ uint8_t count = 0;
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ count += bitpop32(matrix[i]);
+ }
+ return count;
+}
+
+/* Row pin configuration
+ *
+ * row: 0 1 2 3 4 5
+ * pin: C7 B1 B2 C6 B4 B5
+ *
+ */
+static void init_rows(void)
+{
+ DDRC &= ~0b11000000;
+ DDRB &= ~0b00110110;
+ PORTC |= 0b11000000;
+ PORTB |= 0b00110110;
+}
+
+static uint8_t read_rows(void) {
+ return (PINC&(1<<PC7) ? 0 : (1<<0)) |
+ (PINB&(1<<PB1) ? 0 : (1<<1)) |
+ (PINB&(1<<PB2) ? 0 : (1<<2)) |
+ (PINC&(1<<PC6) ? 0 : (1<<3)) |
+ (PINB&(1<<PB4) ? 0 : (1<<4)) |
+ (PINB&(1<<PB5) ? 0 : (1<<5));
+}
+
+/* Row pin configuration
+ * pin: D3 D7 D6 D5 D4
+ * row: off 0 x x x x
+ * 0 1 0 0 0 0
+ * 1 1 0 0 0 1
+ * 2 1 0 0 1 0
+ * 3 1 0 0 1 1
+ * 4 1 0 1 0 0
+ * 5 1 0 1 0 1
+ * 6 1 0 1 1 0
+ * 7 1 0 1 1 1
+ * 8 1 1 0 0 0
+ * 9 1 1 0 0 1
+ * 10 1 1 0 1 0
+ * 11 1 1 0 1 1
+ * 12 1 1 1 0 0
+ * 13 1 1 1 0 1
+ * 14 1 1 1 1 0
+ * 15 1 1 1 1 1
+ */
+static void unselect_cols(void)
+{
+ // output high(DDR:1, PORT:1) to unselect
+ DDRB |= (1 << PD3);
+ PORTB |= (1 << PD3);
+}
+
+static void select_col(uint8_t col) {
+ DDRD |= (1<<PD3 | 1<<PD4 | 1<<PD5 | 1<<PD6 | 1<<PD7);
+
+ PORTD &= ~(1<<PD3);
+
+ if (col & (1<<0)) {
+ PORTD |= (1<<PD4);
+ }
+ else {
+ PORTD &= ~(1<<PD4);
+ }
+ if (col & (1<<1)) {
+ PORTD |= (1<<PD5);
+ }
+ else {
+ PORTD &= ~(1<<PD5);
+ }
+ if (col & (1<<2)) {
+ PORTD |= (1<<PD6);
+ }
+ else {
+ PORTD &= ~(1<<PD6);
+ }
+ if (col & (1<<3)) {
+ PORTD |= (1<<PD7);
+ }
+ else {
+ PORTD &= ~(1<<PD7);
+ }
+} \ No newline at end of file