A simple 4x4 matrix key pad test program

Dependencies:   mbed

Revision:
1:be0aa2900453
Child:
2:bac691bab19c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matrix_key_4x4.cpp	Thu May 11 01:29:58 2017 +0000
@@ -0,0 +1,101 @@
+/**
+ * matrix key scan program
+ *
+ * @note assuming key pad of 16 keys
+ * @note 4 x 4 matrix scan
+ */
+#include "mbed.h"
+
+#if defined (TARGET_KL25Z)
+#define ROW0 PTC9
+#define ROW1 PTC8
+#define ROW2 PTA5
+#define ROW3 PTA4
+#define COL0 PTA12
+#define COL1 PTD4
+#define COL2 PTA1
+#define COL3 PTA2
+#endif
+
+#define NUM_COL 4
+#define NUM_ROW 4
+#define NUM_KEY (NUM_COL * NUM_ROW)
+
+int key[ NUM_KEY ] = {
+    0, 0, 0, 0,
+    0, 0, 0, 0,
+    0, 0, 0, 0,
+    0, 0, 0, 0
+} ;
+
+unsigned char key_char[NUM_KEY] = {
+    '1', '4', '7', '*',
+    '2', '5', '8', '0',
+    '3', '6', '9', '#',
+    'A', 'B', 'C', 'D'
+} ; 
+
+
+DigitalIn  *col[NUM_COL] ;
+DigitalOut *row[NUM_ROW] ;
+
+void init_hardware(void)
+{
+    col[3] = new DigitalIn(PTC11, PullUp) ;
+    col[2] = new DigitalIn(PTC10, PullUp) ;
+    col[1] = new DigitalIn(PTC6,  PullUp) ;
+    col[0] = new DigitalIn(PTC5,  PullUp) ;
+
+    row[3] = new DigitalOut(PTC4, 1) ;
+    row[2] = new DigitalOut(PTC3, 1) ;
+    row[1] = new DigitalOut(PTC0, 1) ;
+    row[0] = new DigitalOut(PTC7, 1) ;
+}
+
+int scan_key(int key[])
+{
+    int r, c ;
+    int count = 0 ;
+
+    for (r = 0 ; r < NUM_ROW ; r++ ) {
+        row[r]->write(0) ;
+        for (c = 0 ; c < NUM_COL ; c++ ) {
+            if (col[c]->read() == 0) {
+                key[r * NUM_COL + c] = 1 ;
+                count++ ;
+            } else {
+                key[r * NUM_COL + c] = 0 ;
+            }
+        }
+        row[r]->write(1)  ;
+    }
+    return(count) ;
+}
+
+void print_key(int key[])
+{
+    int i ;
+    for (i = 0 ; i < NUM_KEY ; i++ ) {
+        if (key[i]) {
+            printf("%c", key_char[i]) ;
+        }
+    }
+}
+    
+int main() {
+    int count ;
+    
+    init_hardware() ;
+    
+    printf("\n=== Matrix Key Test %s ===\n", __DATE__) ;
+    
+    while(1) {
+        count = scan_key(key) ;
+        if (count) {
+            print_key(key) ;
+            fflush(stdout) ;
+            wait(0.2) ;
+        }
+        wait(0.1) ;
+    }
+}