X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=keyboard%2Falps64%2Fmatrix.c;h=1082773fca7dbbb154c635127d598b23984b35f3;hb=3b21f85e9bb731adcbd40be1b93b7d39ef7748c5;hp=a49755c3a375eef5d06844a41d0d77b271b44705;hpb=f1f2066657f4a0998adc016c95d7e541b436e09f;p=max%2Ftmk_keyboard.git diff --git a/keyboard/alps64/matrix.c b/keyboard/alps64/matrix.c index a49755c3..1082773f 100644 --- a/keyboard/alps64/matrix.c +++ b/keyboard/alps64/matrix.c @@ -25,13 +25,15 @@ along with this program. If not, see . #include "print.h" #include "debug.h" #include "util.h" +#include "timer.h" #include "matrix.h" #ifndef DEBOUNCE # define DEBOUNCE 5 #endif -static uint8_t debouncing = DEBOUNCE; +static bool debouncing = false; +static uint16_t debouncing_time = 0; /* matrix state(1:on, 0:off) */ static matrix_row_t matrix[MATRIX_ROWS]; @@ -43,17 +45,9 @@ static void unselect_rows(void); static void select_row(uint8_t row); -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} +#define LED_ON() do { DDRC |= (1<<5); PORTC |= (1<<5); } while (0) +#define LED_OFF() do { DDRC &= ~(1<<5); PORTC &= ~(1<<5); } while (0) +#define LED_TGL() do { DDRC |= (1<<5); PINC |= (1<<5); } while (0) void matrix_init(void) { @@ -66,59 +60,47 @@ void matrix_init(void) matrix[i] = 0; matrix_debouncing[i] = 0; } + + //debug + debug_matrix = true; + LED_ON(); + _delay_ms(500); + LED_OFF(); } uint8_t matrix_scan(void) { for (uint8_t i = 0; i < MATRIX_ROWS; i++) { select_row(i); - _delay_us(30); // without this wait read unstable value. + _delay_us(30); // delay for settling matrix_row_t cols = read_cols(); if (matrix_debouncing[i] != cols) { - matrix_debouncing[i] = cols; if (debouncing) { - debug("bounce!: "); debug_hex(debouncing); debug("\n"); + dprintf("bounce: %d %d@%02X\n", timer_elapsed(debouncing_time), i, matrix_debouncing[i]^cols); } - debouncing = DEBOUNCE; + matrix_debouncing[i] = cols; + debouncing = true; + debouncing_time = timer_read(); } unselect_rows(); } - if (debouncing) { - if (--debouncing) { - _delay_ms(1); - } else { - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - matrix[i] = matrix_debouncing[i]; - } + if (debouncing && timer_elapsed(debouncing_time) >= DEBOUNCE) { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; } + debouncing = false; } return 1; } -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<