Aca esta el codigo,saque bastante para no confundir,deje en el main solo un loop con un delay..como prueba para demostrar que no va a interrupcion durante el delay..
#include "16f648A.h"
#fuses INTRC_IO,NOLVP,WDT,NOPROTECT,NOCPD,NOMCLR
#use delay(clock=4000000,restart_wdt)
#include <tones.c>
#DEFINE RELE PIN_A2
#DEFINE LED_LECT PIN_A7
#DEFINE LED PIN_A1
#DEFINE LED_ROJO PIN_A6
#define D1 PIN_A4
#define D0 PIN_A5
#define puerta PIN_B7 //entrada
//Keypad connection:
#define col0 PIN_B1 //SALIDA
#define col1 PIN_B2 //SALIDA
#define col2 PIN_B3 //SALIDA
#define row0 PIN_A0 //ENTRADA
#define row1 PIN_B6//ENTRADA //
#define row2 PIN_B5//ENTRADA
#define row3 PIN_B4//ENTRADA
short int ALL_ROWS (void);
// Keypad layout:
char const KEYS[4][3] = {{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12}};
#define KBD_DEBOUNCE_FACTOR 100// 33 100 // Set this number to apx n/333 where
// n is the number of times you expect
// to call kbd_getc each second
static int error=0,falla=0;
static int b[3]; //vector
static short CODE_OK=0, blo=0;//bit
static short secure ,teclado,baja=0;//bit
static short bien=0,llamada=0,timeout_error=0,inte=0;
static int i,key;
static int cant_usu,cant_borr;
static short pwd=0,abier=0,beeping=0,molestar=0,jodi=0,inchar=0,prim=0,pswreset=0,pswreset1=0,control=0, new_card=0;
int32 inc=0;
#int_EXT
interrp(){
int timeout,i;
int numer=0;
output_high(LED_ROJO);
delay_ms(600);
output_LOW(LED_ROJO);
}
char kbd_getc( ) {
static byte kbd_call_count;
static short int kbd_down;
static char last_key;
static byte col;
byte kchar;
byte row;
kchar='\0';
if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
switch (col) {
case 0 : output_low(col0);
output_high(col1);
output_high(col2);
break;
case 1 : output_high(col0);
output_low(col1);
output_high(col2);
break;
case 2 : output_high(col0);
output_high(col1);
output_low(col2);
break;
}
if(kbd_down) {
if(!ALL_ROWS()) {
kbd_down=false;
kchar=last_key;
last_key='\0';
}
}
else
{
if(ALL_ROWS()) {
if(!input (row0))
row=0;
else if(!input (row1))
row=1;
else if(!input (row2))
row=2;
else if(!input (row3))
row=3;
last_key =KEYS[row][col];
kbd_down = true;
} else {
++col;
if(col==3)
col=0;
}
}
kbd_call_count=0;
}
return(kchar);
}
short int ALL_ROWS (void)
{
if (input (row0) & input (row1) & input (row2) & input (row3))
return (0);
else
return (1);
}
//****************************MAIN!!!!!!!!!*****PROGAMA ANDANDO *******************************
void main() {
int32 incr=0;
short din=0;
int ind=0;
SET_TRIS_B(241);
SET_TRIS_A(49);
port_b_pullups(TRUE);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
ext_int_edge( H_TO_L );
output_low(PIN_A6);
OUTPUT_LOW(RELE);
OUTPUT_LOW(LED_LECT);
OUTPUT_LOW(LED_ROJO);
OUTPUT_high(LED);
OUTPUT_LOW(Col0);
OUTPUT_HIGH(Col1);
OUTPUT_HIGH(Col2);
while(true){
delay_ms(2000);
}
}