Hola a todos!
Soy nuevo en el tema de la programación C en los microcontroladores y me gustaría saber si me podéis ayudar en un problema que tengo con el teclado matricial 4x3. Llevo un tiempo peleándome por hacer funcionar el teclado en el PIC18f4550 pero no hay manera, he probado usando la librería KBD.C, pero no me a funcionado (almenos al simularlo en PROTEUS), por lo que he optado en desarrollar el programa por mi mismo, pero de momento no he conseguido tener éxito en que me funcione y ya nose que mas hacer, nose si es fallo de programación, de montaje en PROTEUS o ambos. Os dejo los archivos del programa (uso PIC C Compiler) y los archivos de PROTEUS.
Haber si hay alguien que me pueda ayudar o guiarme en donde tengo el fallo, muchas gracias de ante mano!
codigo c:
#INCLUDE <18F4550.H>
#fuses XT // XTPLL: Vamos a usar un cristal de 4.00Mhz.
#fuses CPUDIV1//USADO PARA 4MHZ, NO DIVIDE LA FRECUENCIA
#FUSES NOMCLR // NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por soft.
#FUSES PUT//ACTIVACACION DE BAJO VOLTAJE
#fuses NOWDT//No vamos a usar el perro guardian.
#fuses NOPROTECT //Memoria no protejida contra lecturas.
#fuses NOVREGEN // Habilita el regulador de 3.3 volts que usa el módulo USB, no lo usaremos por los momentos, se cambiará por NOVREGEN
#USE DELAY (CLOCK= 4000000)
#USE STANDARD_IO(A)
#USE STANDARD_IO(B)
#USE STANDARD_IO(C)
#USE STANDARD_IO(D)
#byte PORTC=0xf82
#byte TRISC=0xf94
void tecla(void);
CHAR K;
CHAR J;
int tiempo=5;
INT secuencia;
int aux;
Byte CONST DISPLAY[10]={0b1000000,0b1111001,0b0100100,0b0110000,0b0011001,0b0010010,0b0000011,0b1111000,0b0000000,0b0011000};
//Valores en binario de los numeros (0 a 9) que saldran por el display
VOID MAIN()
{
SET_TRIS_C(0); //Configurar el puerto C como salida
SET_TRIS_B(0x0f);
WHILE (TRUE)
{
tecla(); //Llamamos al bloque tecla
IF(K=='*') // Valor del display 1 pasa al display 2
J=K;
IF(K=='#') // Los dos displays pasan a 0
K=0;
J=0;
output_d(0b01);// Display 1
output_c(DISPLAY[K]);
delay_ms(tiempo);
output_d(0b10);// Display 2
output_c(DISPLAY[J]);
delay_ms(tiempo);
}
}
//**********************TECLADO******************************
void tecla(){
while(1){
if(secuencia==0x80)
secuencia=0x10;
else secuencia=secuencia*2;
output_b(secuencia);
delay_ms(10); //retardo de corrimiento
aux=secuencia;
if(input(pin_B1))
aux=aux+2;
else if(input(pin_B2))
aux=aux+4;
else if(input(pin_B3))
aux=aux+8;
if(aux==secuencia)
continue;
else break;
}
switch(aux){
case 0x12:k='1'; break;
case 0x14:k='2'; break;
case 0x18:k='3'; break;
case 0x22:k='4'; break;
case 0x24:k='5'; break;
case 0x28:k='6'; break;
case 0x42:k='7'; break;
case 0x44:k='8'; break;
case 0x48:k='9'; break;
case 0x82:k='*'; break;
case 0x84:k='0'; break;
case 0x88:k='#'; break;
// default:boton=' '; break;
}
}