////////////////////////////////////////////// // Matrix Keypad Scanning Routine // // Author(s): David Hobday // Date 11 December 2006 // // Revision History: // V1.0 11/12/2006 - Initial Release // ////////////////////////////////////////////// // Code written for Accord keypad AK-304-BBW // with key layout as below: // COL1 COL2 COL3 // 1 2 3 ROW 1 // 4 5 6 ROW 2 // 7 8 9 ROW 3 // * 0 # ROW 4 // #include <system.h> // define keypad connections volatile bit row1port @PORTC.1; volatile bit row1tris @TRISC.1; volatile bit row2port @PORTC.6; volatile bit row2tris @TRISC.6; volatile bit row3port @PORTC.5; volatile bit row3tris @TRISC.5; volatile bit row4port @PORTC.3; volatile bit row4tris @TRISC.3; volatile bit col1port @PORTC.2; volatile bit col1tris @TRISC.2; volatile bit col2port @PORTC.0; volatile bit col2tris @TRISC.0; volatile bit col3port @PORTC.4; volatile bit col3tris @TRISC.4; rom char* keyPadMatrix = { '1','2','3', '4','5','6', '7','8','9', '*','0','#', 0xFF }; void ScanKeyMatrixInit() { // we scan the keypad by turning on the row outputs and // reading the columns row1tris = 0; row2tris = 0; row3tris = 0; row4tris = 0; col1tris = 1; col2tris = 1; col3tris = 1; } char ScanKeyMatrix() { // This routine returns the first key found to be // pressed during the scan. char key = 0, row; for( row = 0b00000001; row < 0b00010000; row <<= 1 ) { { // turn on row output row1port = row.0; row2port = row.1; row3port = row.2; row4port = row.3; } // read colums - break when key press detected if( col1port ) break; key++; if( col2port ) break; key++; if( col3port ) break; key++; } row1port = 0; row2port = 0; row3port = 0; row4port = 0; return keyPadMatrix[ key ]; }
Copyright © 2006 SourceBoost Technologies