Edoardo Armeriv / Mbed 2 deprecated lab5

Dependencies:   mbed mbed-rtos tsi_sensor SLCD

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers keypad4x4.h Source File

keypad4x4.h

00001 #ifndef KEYPAD4x4_H
00002 #define KEYPAD4x4_H
00003 
00004 /*
00005     +-----------------+
00006     | +-+ +-+ +-+ +-+ |
00007     | |1| |2| |3| |A| |
00008     | +-+ +-+ +-+ +-+ |
00009     | +-+ +-+ +-+ +-+ |
00010     | |4| |5| |5| |B| |
00011     | +-+ +-+ +-+ +-+ |
00012     | +-+ +-+ +-+ +-+ |
00013     | |7| |8| |9| |C| |
00014     | +-+ +-+ +-+ +-+ |
00015     | +-+ +-+ +-+ +-+ |
00016     | |*| |0| |#| |D| |
00017     | +-+ +-+ +-+ +-+ |
00018     +-----------------+
00019     | o o o o o o o o |  
00020       C C C C R R R R
00021       O O O O O O O O
00022       L L L L W W W W
00023       0 1 2 3 0 1 2 3
00024     
00025 */      
00026                             
00027 #ifndef BIT
00028 #define BIT(N) (1 << (N))
00029 #endif
00030 
00031 //BusOut keypad4x4_columns(KEYPAD4X4_COLUMN0, KEYPAD4X4_COLUMN1, KEYPAD4X4_COLUMN2, KEYPAD4X4_COLUMN3);
00032 //BusIn keypad4x4_rows(KEYPAD4X4_ROW0, KEYPAD4X4_ROW1, KEYPAD4X4_ROW2, KEYPAD4X4_ROW3);
00033 BusOut keypad4x4_columns(PTE19, PTE18, PTE17, PTE16);
00034 BusIn keypad4x4_rows(PTA14, PTA15, PTA16, PTA17);
00035 InterruptIn keypad4x4_interrupt(PTC16);
00036 
00037 #define KEYPAD4X4_TYPE_MIN 0
00038 #define KEYPAD4X4_TELEPHONE 0
00039 #define KEYPAD4X4_TELEPHONE_ALT 1
00040 #define KEYPAD4X4_HEXADECIMAL 2
00041 #define KEYPAD4X4_TYPE_MAX 2
00042 #define KEYPAD4X4_TYPE_DEFAULT KEYPAD4X4_TELEPHONE_ALT
00043 
00044 #ifndef KEYPAD4X4_TYPE
00045 #define KEYPAD4X4_TYPE KEYPAD4X4_TYPE_DEFAULT
00046 #endif /* #ifndef KEYPAD4X4_TYPE */
00047 
00048 #if (KEYPAD4X4_TYPE < KEYPAD4X4_TYPE_MIN) || (KEYPAD4X4_TYPE > KEYPAD4X4_TYPE_MAX)
00049 #warning "invalid KEYPAD4X4_TYPE specified, default KEYPAD4X4_TYPE used"
00050 #undef KEYPAD4X4_TYPE
00051 #define KEYPAD4X4_TYPE KEYPAD4X4_TYPE_DEFAULT
00052 #endif  /* #if (KEYPAD4X4_TYPE < KEYPAD4X4_TYPE_MIN) || (KEYPAD4X4_TYPE > KEYPAD4X4_TYPE_MAX) */
00053 
00054 int keypad4x4_type=KEYPAD4X4_TYPE;
00055 
00056 char keypad4x4_ASCII[KEYPAD4X4_TYPE_MAX+1][4][4]={ 
00057                                         {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}}, 
00058                                         {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'E','0','F','D'}}, 
00059                                         {{'0','1','2','3'},{'4','5','6','7'},{'8','9','A','B'},{'C','D','E','F'}} };
00060 /* KEYPAD4X4_ASCII[0][][] is KEYPAD4X4_TELEPHONE (e.g. '*' and '#') */                                     
00061 /* KEYPAD4X4_ASCII[1][][] is KEYPAD4X4_TELEPHONE_ALT (e.g. 'E' and 'F')*/ 
00062 /* KEYPAD4X4_ASCII[2][][] is KEYPAD4X4_HEXADECIMAL (e.g. 0-F in order) */ 
00063 
00064 int keypad4x4_set_type(int type)
00065 {
00066     if((type < KEYPAD4X4_TYPE_MIN) || (type > KEYPAD4X4_TYPE_MAX)) { type=KEYPAD4X4_TYPE_DEFAULT; }
00067     keypad4x4_type=type;
00068     return(keypad4x4_type);
00069 }
00070 
00071 int keypad4x4_query(char *key_value, int * key_row, int *key_column)
00072 {
00073     int row, column, temp, type;
00074     keypad4x4_rows.mode(PullDown);
00075 
00076     if((keypad4x4_type < KEYPAD4X4_TYPE_MIN) || (keypad4x4_type > KEYPAD4X4_TYPE_MAX)) 
00077     { 
00078         keypad4x4_type=KEYPAD4X4_TYPE_DEFAULT; 
00079     }
00080 
00081     keypad4x4_columns=0xF;
00082     if(keypad4x4_rows == 0)
00083     {
00084         *key_row=-1;
00085         *key_column=-1;
00086         *key_value='\0';
00087         return(-1);          
00088     }   
00089 
00090     for (column=0; column < 4; column++)
00091     {
00092        row=4;
00093 //       keypad4x4_columns=(1<<column);
00094        keypad4x4_columns=BIT(column);
00095        temp=keypad4x4_rows;
00096        if (temp != 0)
00097        {
00098             for(row=0; row <4; row++)
00099             {
00100 //                if((temp & (1<<row)) != 0)
00101                 if((temp & BIT(row)) != 0)
00102                 {
00103                     break;
00104                 }
00105             } 
00106         }
00107         if(row<4)
00108         {
00109             *key_row=row;
00110             *key_column=column;
00111             *key_value=keypad4x4_ASCII[keypad4x4_type][row][column];
00112             while(keypad4x4_rows != 0) {}   
00113 //            wait(0.01);          
00114             return((row<<2)+column);
00115         }
00116         else
00117         {
00118             *key_row=-1;
00119             *key_column=-1;
00120             *key_value='\0';
00121             //return(-1);          
00122         }
00123    }
00124    return(-3);
00125 }   /* end of KEYPAD4X4_query() */
00126 
00127 char keypad4x4_getc(void)
00128 {
00129     int row, column, type, temp;
00130     char c;
00131     while((temp=keypad4x4_query(&c, &row, &column)) < 0)
00132     { }
00133     return(c);
00134  
00135 }   /* end of keypad4x4_getc() */
00136     
00137 int keypad4x4_input(char *key_value, int * key_row, int *key_column)
00138 {
00139     int row, column, temp, type;
00140     char c;
00141 
00142     while((temp=keypad4x4_query(&c, &row, &column)) < 0)
00143     { }
00144     *key_row=row;
00145     *key_column=column;
00146     *key_value=c;    
00147     return(temp);
00148 
00149 
00150 }   /* end of KEYPAD4X4_input() */
00151 
00152 
00153 
00154 
00155 
00156 #endif /* #ifndef KEYPAD4x4_H */