Estou precisando fazer uma programação de um teclado matricial com o pic 18f4520


#1

eu preciso fazer um teclado matricial com o pic 18f4520 o programa consiste em fazer um led piscar conforme o numero apertado (ex se aperta o numero 4 o led deve piscar 4 vezes e assim por diante) lembrando que deve ser utilizado timer e não pode utilizar delay .Sempre que vou compilar ele no mplab da erro alguem pode me ajudar? segue abaixo meu codigo;

#pragma config PWRT = ON //Power-UP timer enable
#pragma config WDT = OFF //Watchdog Timer disable
#pragma config PBADEN = OFF //RB0: RB4 I/O Digital
#pragma config LVP = OFF //ICSP. Low Power Programming Disable
#pragma config BOREN = SBORDIS //Brown-out Reset (BOREN) Habilitado somente no hardware
#pragma config BORV = 1 //Voltagem do BOR é 4,33v
#pragma config LPT1OSC = ON //TIMER1 programado para operar no modo low-power

char lcd[17];

#define S1 PORTBbits.RB0
#define S2 PORTCbits.RC0
#define LED1 PORTDbits.RD1

#define col_1 PORTBbits.RB1
#define col_2 PORTBbits.RB2
#define col_3 PORTBbits.RB3
#define row_A PORTBbits.RB4
#define row_B PORTBbits.RB5
#define row_C PORTBbits.RB6
#define row_D PORTBbits.RB7

void pulser (unsigned char number); // Funçao para pulsar led1
unsigned char control = 0x01;

void ISR_alta_prioridade(void); //Protótipo da função de interrupção

#pragma code int_alta = 0x08 //Vetor de interrupçao de alta prioridade
void int_alta(void)
{
_asm goto ISR_alta_prioridade _endasm //Desvia o programa para a função ISR_alta_prioridade
}
#pragma code
#pragma interrupt ISR_alta_prioridade
void ISR_alta_prioridade(void){

//Note que o TMRL1 não é alterado o que permite que ele continue incremetando
WriteTimer0(0X6C); // Carrega o valor de 40535 para dentro do registro TMR1H
if(INTCONbits.TMR0IF){
	INTCONbits.TMR0IF=0;    //T0IE_bit = 0x01;
}
WriteTimer0(0X6C);
if(col_1 && control ==1){             //coluna em nivel alto? control igual a 1?
   control = 0x02;                    //sim
   col_1 = 0x00;                      //apenas a coluna 2 em nivel baixo
   col_2 = 0x01;
   col_3 = 0x01; 
   if(!row_A){
    pulse(1); 
   }  
   if(!row_B){
    pulse(4);
 } 
   if(!row_C){
    pulse(7);
}
   if(!row_D){
    pulse (11);
  }
}
  if (col_2&& control ==2){          //coluna 2 em nivel alto? control igual a 2 ? 
    control = 0x03;                  //sim... 
    col_1 = 0x01;
    col_2 = 0x00;                   //apenas a coluna 2 em nivel baixo
    col_3 = 0x01;
 }   
    if(col_3 && control==3){       //coluna 3 em nivel alto? control igual a 1?
    control = 0x01;                //sim...
    col_1 = 0x01;
    col_2 = 0x01;
    col_3 = 0x00;                  //apenas coluna 3 em nivel baix0
 }    

}

void pulse( unsigned char number){ //desenvolver a funçao
unsigned char i; //variavel de interaçao
for(i=0;i<number;i++){
LED1 = 0x01;
Delay10KTCYx(255);
LED1 = 0x00;
Delay10KTCYx(255);
}
}
void main(void){
CMCON = 0x07;

OpenTimer0(	TIMER_INT_ON
			&T0_8BIT
			&T0_SOURCE_INT
			&T0_PS_1_128);

INTCONbits.GIE = 1;
INTCONbits.PEIE=1;
INTCONbits.TMR0IE=1;
INTCONbits.TMR0IF=0;

TRISA = 0x3;               //Entrada em RA0 e RA1
TRISB = 0xF0;              //Mais significativo entrada
TRISC = 0x00;              
TRISD = 0x00;
ADCON1 = 0x0F;
PORTB = 0xFF;             //mais significativo nivel alto

while(1){

}