From fd49c69d1a173b9d273b2b53eb6a22eda920223a Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 6 Jan 2011 15:18:55 +0900 Subject: added config option: MATRIX_HAS_GHOST and fixed some on matrix.c ADD: Build option: MATRIX_HAS_GHOST to enable ghost blocking logic. FIX: choose matrix buffer type(uint8_t/uint16_t) automatically depending on column size in matrix.c. FIX: use uint8_t insted of int in matrix.c. --- macway/matrix.c | 75 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 18 deletions(-) (limited to 'macway/matrix.c') diff --git a/macway/matrix.c b/macway/matrix.c index 7c2a42105..f8c0640fd 100644 --- a/macway/matrix.c +++ b/macway/matrix.c @@ -10,31 +10,47 @@ #include "matrix_skel.h" -// matrix state buffer (key on: 1/key off: 0) +#if (MATRIX_COLS > 16) +# error "MATRIX_COLS must not exceed 16" +#endif +#if (MATRIX_ROWS > 255) +# error "MATRIX_ROWS must not exceed 255" +#endif + + +// matrix state buffer(1:on, 0:off) +#if (MATRIX_COLS <= 8) static uint8_t *matrix; static uint8_t *matrix_prev; static uint8_t _matrix0[MATRIX_ROWS]; static uint8_t _matrix1[MATRIX_ROWS]; - +#else +static uint16_t *matrix; +static uint16_t *matrix_prev; +static uint16_t _matrix0[MATRIX_ROWS]; +static uint16_t _matrix1[MATRIX_ROWS]; +#endif + +#ifdef MATRIX_HAS_GHOST static bool matrix_has_ghost_in_row(uint8_t row); +#endif static uint8_t read_col(void); static void unselect_rows(void); static void select_row(uint8_t row); inline -int matrix_rows(void) +uint8_t matrix_rows(void) { return MATRIX_ROWS; } inline -int matrix_cols(void) +uint8_t matrix_cols(void) { return MATRIX_COLS; } -// this must be called once before matrix_scan. void matrix_init(void) { // initialize row and col @@ -44,13 +60,13 @@ void matrix_init(void) PORTB = 0xFF; // initialize matrix state: all keys off - for (int i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; - for (int i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; + for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; + for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; matrix = _matrix0; matrix_prev = _matrix1; } -int matrix_scan(void) +uint8_t matrix_scan(void) { uint8_t *tmp; @@ -58,7 +74,7 @@ int matrix_scan(void) matrix_prev = matrix; matrix = tmp; - for (int i = 0; i < MATRIX_ROWS; i++) { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { unselect_rows(); select_row(i); _delay_us(30); // without this wait read unstable value. @@ -70,30 +86,37 @@ int matrix_scan(void) bool matrix_is_modified(void) { - for (int i = 0; i < MATRIX_ROWS; i++) { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { if (matrix[i] != matrix_prev[i]) return true; } return false; } +inline bool matrix_has_ghost(void) { - for (int i = 0; i < MATRIX_ROWS; i++) { +#ifdef MATRIX_HAS_GHOST + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { if (matrix_has_ghost_in_row(i)) return true; } +#endif return false; } inline -bool matrix_is_on(int row, int col) +bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & (1<