summaryrefslogtreecommitdiffstats
path: root/keyboards/dp60/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/dp60/matrix.c')
-rw-r--r--keyboards/dp60/matrix.c245
1 files changed, 245 insertions, 0 deletions
diff --git a/keyboards/dp60/matrix.c b/keyboards/dp60/matrix.c
new file mode 100644
index 0000000000..3aa5925fe6
--- /dev/null
+++ b/keyboards/dp60/matrix.c
@@ -0,0 +1,245 @@
+#include "quantum.h"
+
+static uint8_t debouncing = DEBOUNCE;
+
+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 init_cols(void);
+static void unselect_cols(void);
+static void select_col(uint8_t col);
+
+
+__attribute__ ((weak))
+void matrix_init_kb(void)
+{
+ matrix_init_user();
+}
+
+__attribute__ ((weak))
+void matrix_scan_kb(void)
+{
+ matrix_scan_user();
+}
+
+__attribute__ ((weak))
+void matrix_init_user(void) {}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {}
+
+void matrix_init(void)
+{
+ //setPinOutput(F0);
+ //writePinHigh(F0);
+ setPinOutput(B4);
+ writePinLow(B4);
+
+ init_cols();
+ init_rows();
+
+ 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 = DEBOUNCE;
+ }
+ }
+ 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;
+}
+
+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)));
+ }
+}
+
+/*
+ * Row pin configuration
+ * row: 0 1 2 3 4
+ * pin: PE6 PF6 PF7 PB7 PD4
+ */
+static void init_rows(void)
+{
+ setPinInputHigh(E6);
+ setPinInputHigh(F6);
+ setPinInputHigh(F7);
+ setPinInputHigh(B7);
+ setPinInputHigh(D4);
+}
+
+static uint8_t read_rows()
+{
+ return ((readPin(E6) ? 0 : (1 << 0)) |
+ (readPin(F6) ? 0 : (1 << 1)) |
+ (readPin(F7) ? 0 : (1 << 2)) |
+ (readPin(B7) ? 0 : (1 << 3)) |
+ (readPin(D4) ? 0 : (1 << 4)));
+}
+
+/*
+ * Columns 0 - 13
+ * These columns uses two 74LVC138 3 to 8 bit demultiplexers.
+ * EN Pin, PF5, PD6
+ *
+ * col / pin: PF0 PF1 PF4
+ * 0: 0 0 0
+ * 1: 1 0 0
+ * 2: 0 1 0
+ * 3: 1 1 0
+ * 4: 0 0 1
+ * 5: 1 0 1
+ * 6: 0 1 1
+ * PD2 PD3 PD5
+ * 7: 0 0 0
+ * 8: 1 0 0
+ * 9: 0 1 0
+ * 10: 1 1 0
+ * 11: 0 0 1
+ * 12: 1 0 1
+ * 13: 0 1 1
+ *
+ */
+static void init_cols(void)
+{
+ setPinOutput(F0);
+ setPinOutput(F1);
+ setPinOutput(F4);
+ setPinOutput(F5);
+
+ setPinOutput(D2);
+ setPinOutput(D3);
+ setPinOutput(D5);
+ setPinOutput(D6);
+
+ unselect_cols();
+}
+
+static void unselect_cols(void)
+{
+ writePinHigh(F0);
+ writePinHigh(F1);
+ writePinHigh(F4);
+ writePinHigh(F5);
+
+ writePinHigh(D2);
+ writePinHigh(D3);
+ writePinHigh(D5);
+ writePinHigh(D6);
+}
+
+static void select_col(uint8_t col) {
+
+ switch (col) {
+ case 0:
+ writePinLow(F0);
+ writePinLow(F1);
+ writePinLow(F4);
+ break;
+ case 1:
+ writePinHigh(F0);
+ writePinLow(F1);
+ writePinLow(F4);
+ break;
+ case 2:
+ writePinLow(F0);
+ writePinHigh(F1);
+ writePinLow(F4);
+ break;
+ case 3:
+ writePinHigh(F0);
+ writePinHigh(F1);
+ writePinLow(F4);
+ break;
+ case 4:
+ writePinLow(F0);
+ writePinLow(F1);
+ writePinHigh(F4);
+ break;
+ case 5:
+ writePinHigh(F0);
+ writePinLow(F1);
+ writePinHigh(F4);
+ break;
+ case 6:
+ writePinLow(F0);
+ writePinHigh(F1);
+ writePinHigh(F4);
+ break;
+ case 7:
+ writePinLow(D2);
+ writePinLow(D3);
+ writePinLow(D5);
+ break;
+ case 8:
+ writePinHigh(D2);
+ writePinLow(D3);
+ writePinLow(D5);
+ break;
+ case 9:
+ writePinLow(D2);
+ writePinHigh(D3);
+ writePinLow(D5);
+ break;
+ case 10:
+ writePinHigh(D2);
+ writePinHigh(D3);
+ writePinLow(D5);
+ break;
+ case 11:
+ writePinLow(D2);
+ writePinLow(D3);
+ writePinHigh(D5);
+ break;
+ case 12:
+ writePinHigh(D2);
+ writePinLow(D3);
+ writePinHigh(D5);
+ break;
+ case 13:
+ writePinLow(D2);
+ writePinHigh(D3);
+ writePinHigh(D5);
+ break;
+ }
+} \ No newline at end of file