void interrupt(){
if (INTCON.RBIF){
char tmp; // PORTB Change Interrupt ??
if((KEYPAD_DATA & 0xF0) != 0XF0){ // Check to see that it is TRUE INTERUPT ( i.e. Falling Edge Interrupt)
char i;
[B]delay_ms(20);[/B] // Avoid debouncing
tmp=0x10;
for(i=0;i<4;i++){ // Find the row
if((KEYPAD_DATA & tmp) == 0x00)
{row=i;break;}
tmp=(tmp<<1);
}
KEYPAD_DATA=0X01;
for(i=0;i<4;i++){ // Find the column
if((KEYPAD_DATA & tmp) == tmp)
{colum=i;break;}
KEYPAD_DATA=(KEYPAD_DATA<<1); //01,10,100,1000
}
tmp=array[row][colum];
LCD_character_write((tmp+48));
KEYPAD_DATA=0x00; // Clear DATA PORT
}
tmp=KEYPAD_DATA; // MUST Read KEYPAD_DATA, otherwise flag will not clear
INTCON.RBIF = 0; // Clear the flag
}
}