Interface matrix Keypad
This is a driver for interfacing 4x4 matrix keypad with PIC microcontroller
/Keypad connection:
#define col0 PIN_B3
#define col1 PIN_B2
#define col2 PIN_B1
#define col3 PIN_B0
#define row0 PIN_B7
#define row1 PIN_B6
#define row2 PIN_B5
#define row3 PIN_B4
#define num_col 4
// Keypad layout:
char const KEYS[4][4] = {{1,2,3,13},
{4,5,6,14},
{7,8,9,15},
{11,10,12,16}};
void init_keypad()
{
output_high(row0);
output_high(row1);
output_high(row2);
output_high(row3);
output_low(col0);
output_low(col1);
output_low(col2);
output_low(col3);
}
short int ALL_ROWS (void)
{
if (input (row0) & input (row1) & input (row2) & input (row3))
return (0);
else
return (1);
}
//Will return a key value if pressed or 0 if not
int8 get_key()
{
int8 row,col=0;
do
{
switch (col)
{
case 0 :
output_low(col0);
output_high(col1);
output_high(col2);
output_high(col3);
break;
case 1 :
output_high(col0);
output_low(col1);
output_high(col2);
output_high(col3);
break;
case 2 :
output_high(col0);
output_high(col1);
output_low(col2);
output_high(col3);
break;
case 3 :
output_high(col0);
output_high(col1);
output_high(col2);
output_low(col3);
break;
}
if(!input (row0))
row=1;
else if(!input (row1))
row=2;
else if(!input (row2))
row=3;
else if(!input (row3))
row=4;
else
row=0;
col++;
}while(!row && col<num_col);
if(row)
return KEYS[row-1][col-1];
else
return 0;
}
//function waits until any key is pressed and released.
int8 get_key_released()
{
int8 _key_temp ;
do
{
_key_temp=get_key();
}while(!_key_temp);
init_keypad();
do
{
while(ALL_ROWS());
delay_ms(50);
}
while(ALL_ROWS());
return _key_temp;
}