diff options
author | tmk <nobody@nowhere> | 2013-01-01 03:20:53 +0900 |
---|---|---|
committer | tmk <nobody@nowhere> | 2013-01-01 03:20:53 +0900 |
commit | 9dfc611ae1903390a41b85da1cba2c6d67c7a8dd (patch) | |
tree | b9e0ea7ea21a17d13f440cb14d3c72703e719a69 | |
parent | 093108825b3407e02ae845dcf3d9f34dfbd4dc0f (diff) |
Fix debouncing code.(gh60)
-rw-r--r-- | keyboard/gh60/matrix.c | 55 |
1 files changed, 27 insertions, 28 deletions
diff --git a/keyboard/gh60/matrix.c b/keyboard/gh60/matrix.c index 1a774e17ef..6ded8158ff 100644 --- a/keyboard/gh60/matrix.c +++ b/keyboard/gh60/matrix.c @@ -33,11 +33,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #endif static uint8_t debouncing = DEBOUNCE; -// matrix state buffer(1:on, 0:off) +/* matrix state(1:on, 0:off) */ static uint16_t *matrix; -static uint16_t *matrix_prev; -static uint16_t _matrix0[MATRIX_ROWS]; -static uint16_t _matrix1[MATRIX_ROWS]; +static uint16_t *matrix_debouncing; +static uint16_t matrix0[MATRIX_ROWS]; +static uint16_t matrix1[MATRIX_ROWS]; +static bool is_modified; static uint16_t read_cols(void); static void init_cols(void); @@ -64,38 +65,42 @@ void matrix_init(void) init_cols(); // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0; - for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0; - matrix = _matrix0; - matrix_prev = _matrix1; + matrix = matrix0; + matrix_debouncing = matrix1; + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } + is_modified = false; } uint8_t matrix_scan(void) { - if (!debouncing) { - uint16_t *tmp = matrix_prev; - matrix_prev = matrix; - matrix = tmp; - } - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - unselect_rows(); + //unselect_rows(); select_row(i); - _delay_us(1); // without this wait read unstable value. + _delay_us(30); // without this wait read unstable value. uint16_t cols = read_cols(); - if (matrix[i] != cols) { - matrix[i] = cols; + if (matrix_debouncing[i] != cols) { + matrix_debouncing[i] = cols; if (debouncing) { - debug("bounce!: "); debug_hex(debouncing); print("\n"); + debug("bounce!: "); debug_hex(debouncing); debug("\n"); } debouncing = DEBOUNCE; + is_modified = false; } + unselect_rows(); } - unselect_rows(); + //unselect_rows(); if (debouncing) { debouncing--; - _delay_ms(1); // improved affect on bouncing + _delay_ms(1); + } else { + uint16_t *tmp = matrix; + matrix = matrix_debouncing; + matrix_debouncing = tmp; + is_modified = true; } return 1; @@ -103,13 +108,7 @@ uint8_t matrix_scan(void) bool matrix_is_modified(void) { - if (debouncing) return false; - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix[i] != matrix_prev[i]) { - return true; - } - } - return false; + return is_modified; } inline |