A simple 4x4 matrix key pad test program

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers matrix_key_4x4.cpp Source File

matrix_key_4x4.cpp

00001 /**
00002  * matrix key scan program
00003  *
00004  * @note assuming key pad of 16 keys
00005  * @note 4 x 4 matrix scan
00006  */
00007 #include "mbed.h"
00008 
00009 #if defined (TARGET_KL25Z)
00010 #define COL0 PTC7
00011 #define COL1 PTC0
00012 #define COL2 PTC3
00013 #define COL3 PTC4
00014 #define ROW0 PTC5
00015 #define ROW1 PTC6
00016 #define ROW2 PTC10
00017 #define ROW3 PTC11
00018 #endif
00019 
00020 #define NUM_COL 4
00021 #define NUM_ROW 4
00022 #define NUM_KEY (NUM_COL * NUM_ROW)
00023 
00024 int key[ NUM_KEY ] = {
00025     0, 0, 0, 0,
00026     0, 0, 0, 0,
00027     0, 0, 0, 0,
00028     0, 0, 0, 0
00029 } ;
00030 
00031 #if 0 
00032 /* Sengoku 4x4 keypad */
00033 unsigned char key_char[NUM_KEY] = {
00034     '1', '2', '3', 'A',
00035     '4', '5', '6', 'B',
00036     '7', '8', '9', 'C',
00037     '*', '0', '#', 'D'
00038 } ; 
00039 #endif /* Sengoku 4x4 keypad */
00040 #if 1
00041 /* Aitendo HC-54375 */
00042 unsigned char key_char[NUM_KEY] = {
00043     'C', 'D', 'E', 'F',
00044     '9', '0', 'A', 'B',
00045     '5', '6', '7', '8',
00046     '1', '2', '3', '4'
00047 } ;
00048 #endif /* Aitendo HC-54375 */
00049 
00050 DigitalIn  *col[NUM_COL] ;
00051 DigitalOut *row[NUM_ROW] ;
00052 
00053 void init_hardware(void)
00054 {
00055     col[3] = new DigitalIn(COL3, PullUp) ;
00056     col[2] = new DigitalIn(COL2, PullUp) ;
00057     col[1] = new DigitalIn(COL1, PullUp) ;
00058     col[0] = new DigitalIn(COL0, PullUp) ;
00059 
00060     row[3] = new DigitalOut(ROW3, 1) ;
00061     row[2] = new DigitalOut(ROW2, 1) ;
00062     row[1] = new DigitalOut(ROW1, 1) ;
00063     row[0] = new DigitalOut(ROW0, 1) ;
00064 }
00065 
00066 int scan_key(int key[])
00067 {
00068     int r, c ;
00069     int count = 0 ;
00070 
00071     for (r = 0 ; r < NUM_ROW ; r++ ) {
00072         row[r]->write(0) ;
00073         for (c = 0 ; c < NUM_COL ; c++ ) {
00074             if (col[c]->read() == 0) {
00075                 key[r * NUM_COL + c] = 1 ;
00076                 count++ ;
00077             } else {
00078                 key[r * NUM_COL + c] = 0 ;
00079             }
00080         }
00081         row[r]->write(1)  ;
00082     }
00083     return(count) ;
00084 }
00085 
00086 void print_key(int key[])
00087 {
00088     int i ;
00089     for (i = 0 ; i < NUM_KEY ; i++ ) {
00090         if (key[i]) {
00091             printf("%c", key_char[i]) ;
00092         }
00093     }
00094 }
00095     
00096 int main() {
00097     int count ;
00098     
00099     init_hardware() ;
00100     
00101     printf("\n=== Matrix Key Test %s ===\n", __DATE__) ;
00102     
00103     while(1) {
00104         count = scan_key(key) ;
00105         if (count) {
00106             print_key(key) ;
00107             fflush(stdout) ;
00108             wait(0.2) ;
00109         }
00110         wait(0.1) ;
00111     }
00112 }