From c009f4643c17084b8f632b3292e0c7962b324ae5 Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 27 Dec 2012 02:41:32 +0900 Subject: Added Initial files for gh60. --- keyboard/gh60/matrix.c | 225 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 keyboard/gh60/matrix.c (limited to 'keyboard/gh60/matrix.c') diff --git a/keyboard/gh60/matrix.c b/keyboard/gh60/matrix.c new file mode 100644 index 0000000000..4c18a61912 --- /dev/null +++ b/keyboard/gh60/matrix.c @@ -0,0 +1,225 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" + + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif +static uint8_t debouncing = DEBOUNCE; + +// matrix state buffer(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 read_cols(void); +static void init_cols(void); +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; +} + +void matrix_init(void) +{ + // initialize row and col + unselect_rows(); + 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; +} + +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(); + select_row(i); + _delay_us(1); // without this wait read unstable value. + uint16_t cols = ~read_cols(); + if (matrix[i] != cols) { + matrix[i] = cols; + if (debouncing) { + debug("bounce!: "); debug_hex(debouncing); print("\n"); + } + debouncing = DEBOUNCE; + } + } + unselect_rows(); + + if (debouncing) { + debouncing--; + _delay_ms(1); // improved affect on bouncing + } + + return 1; +} + +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; +} + +inline +bool matrix_has_ghost(void) +{ + return false; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & (1< Date: Thu, 27 Dec 2012 16:06:13 +0900 Subject: Add README and keymap layers.(GH60) --- keyboard/gh60/matrix.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'keyboard/gh60/matrix.c') diff --git a/keyboard/gh60/matrix.c b/keyboard/gh60/matrix.c index 4c18a61912..1a774e17ef 100644 --- a/keyboard/gh60/matrix.c +++ b/keyboard/gh60/matrix.c @@ -82,7 +82,7 @@ uint8_t matrix_scan(void) unselect_rows(); select_row(i); _delay_us(1); // without this wait read unstable value. - uint16_t cols = ~read_cols(); + uint16_t cols = read_cols(); if (matrix[i] != cols) { matrix[i] = cols; if (debouncing) { @@ -132,7 +132,7 @@ uint16_t matrix_get_row(uint8_t row) void matrix_print(void) { - print("\nr/c 01234567\n"); + print("\nr/c 01234567890ABCDEF\n"); for (uint8_t row = 0; row < MATRIX_ROWS; row++) { phex(row); print(": "); pbin_reverse16(matrix_get_row(row)); @@ -170,20 +170,20 @@ static void init_cols(void) static uint16_t read_cols(void) { - return (PINF&(1<<0) ? (1<<0) : 0) | - (PINF&(1<<1) ? (1<<1) : 0) | - (PINE&(1<<6) ? (1<<2) : 0) | - (PINC&(1<<7) ? (1<<3) : 0) | - (PINC&(1<<6) ? (1<<4) : 0) | - (PINB&(1<<6) ? (1<<5) : 0) | - (PIND&(1<<4) ? (1<<6) : 0) | - (PINB&(1<<1) ? (1<<7) : 0) | - (PINB&(1<<0) ? (1<<8) : 0) | - (PINB&(1<<5) ? (1<<9) : 0) | - (PINB&(1<<4) ? (1<<10) : 0) | - (PIND&(1<<7) ? (1<<11) : 0) | - (PIND&(1<<6) ? (1<<12) : 0) | - (PINB&(1<<3) ? (1<<13) : 0); + return (PINF&(1<<0) ? 0 : (1<<0)) | + (PINF&(1<<1) ? 0 : (1<<1)) | + (PINE&(1<<6) ? 0 : (1<<2)) | + (PINC&(1<<7) ? 0 : (1<<3)) | + (PINC&(1<<6) ? 0 : (1<<4)) | + (PINB&(1<<6) ? 0 : (1<<5)) | + (PIND&(1<<4) ? 0 : (1<<6)) | + (PINB&(1<<1) ? 0 : (1<<7)) | + (PINB&(1<<0) ? 0 : (1<<8)) | + (PINB&(1<<5) ? 0 : (1<<9)) | + (PINB&(1<<4) ? 0 : (1<<10)) | + (PIND&(1<<7) ? 0 : (1<<11)) | + (PIND&(1<<6) ? 0 : (1<<12)) | + (PINB&(1<<3) ? 0 : (1<<13)); } /* Row pin configuration -- cgit v1.2.3 From 9dfc611ae1903390a41b85da1cba2c6d67c7a8dd Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 1 Jan 2013 03:20:53 +0900 Subject: Fix debouncing code.(gh60) --- keyboard/gh60/matrix.c | 55 +++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 28 deletions(-) (limited to 'keyboard/gh60/matrix.c') 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 . #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 -- cgit v1.2.3