]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
add debouncing into macway/matrix.c.
authortmk <nobody@nowhere>
Thu, 29 Sep 2011 08:08:57 +0000 (17:08 +0900)
committertmk <nobody@nowhere>
Thu, 29 Sep 2011 08:08:57 +0000 (17:08 +0900)
macway/config.h
macway/matrix.c

index 546067beb1d4589fa14659231fc6f1c56c5abf47..2e68bf252fb0b57e8cf42353b78ac9e347eb3e7f 100644 (file)
@@ -33,6 +33,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MATRIX_COLS 8
 /* define if matrix has ghost */
 #define MATRIX_HAS_GHOST
+/* Set 0 if need no debouncing */
+#define DEBOUNCE    5
 
 
 /* key combination for command */
index 20cfd9dd60f610131976eabfaf5ccad494e36290..56fb85896025311ad85cfac7aa485d94a623a239 100644 (file)
@@ -23,6 +23,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include <avr/io.h>
 #include <util/delay.h>
 #include "print.h"
+#include "debug.h"
 #include "util.h"
 #include "matrix.h"
 
@@ -35,6 +36,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #endif
 
 
+#ifndef DEBOUNCE
+#   define DEBOUNCE    0
+#endif
+static uint8_t debouncing = DEBOUNCE;
+
 // matrix state buffer(1:on, 0:off)
 #if (MATRIX_COLS <= 8)
 static uint8_t *matrix;
@@ -85,27 +91,40 @@ void matrix_init(void)
 
 uint8_t matrix_scan(void)
 {
-    uint8_t *tmp;
-
-    tmp = matrix_prev;
-    matrix_prev = matrix;
-    matrix = tmp;
+    if (!debouncing) {
+        uint8_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(30);  // without this wait read unstable value.
-        matrix[i] = ~read_col();
+        if (matrix[i] != (uint8_t)~read_col()) {
+            matrix[i] = (uint8_t)~read_col();
+            if (debouncing) {
+                debug("bounce!: "); debug_hex(debouncing); print("\n");
+            }
+            debouncing = DEBOUNCE;
+        }
     }
     unselect_rows();
+
+    if (debouncing) {
+        debouncing--;
+    }
+
     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])
+        if (matrix[i] != matrix_prev[i]) {
             return true;
+        }
     }
     return false;
 }