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){
}