HOla compi, te dejo la gestion de un LCD (de los genericos, este escribe una linea completa la funcion) y la gestion del teclado 4x4 (con antirebotes), esta escrito para keil C, y ambas rutinas estan probadas y funcionando.
/********************* Gestion del display ***********************/
void valida_LCD (void)
{
LCD_E = 1;
wait (5);
LCD_E = 0;
}
void init_display(void)
{
wait (10);
LCD = 0x3F; //00111111b;
LCD_RS = LCD_RW = 0;
valida_LCD();
LCD = 0x0C; //00001100b;
valida_LCD();
LCD = 0X01;
valida_LCD();
LCD = 0X06;
valida_LCD();
wait (100);
}
void escribe_display (unsigned int numero, char linea[20])
{
unsigned int i;
for (i=0;i<0x14;i++)
{
/* BUSCAMOS POSICION DE LA DDRAM */
LCD_RS = 0;
LCD_RW = 0;
if (numero == 1)
LCD = (0x00+i)|0x80;
else if (numero == 2)
LCD = (i+0x40)|0x80;
else if (numero == 3)
LCD = (i+0x14)|0x80;
else if (numero == 4)
LCD = (i+0x54)|0x80;
valida_LCD();
/* ESCRIBIMOS CARACTER EN LA DDRAM */
LCD_RS = 1;
LCD_RW = 0;
LCD = linea;
valida_LCD();
}
}
char teclado (void )
{
/*
TEC_3 TEC_2 TEC_1 TEC_0
TEC_4 1 2 3 >
TEC_5 4 5 6 <
TEC_6 7 8 9 M
TEC_7 D 0 B e
*/
/* verificamos que no hay tecla pulsada si no la hay salimos */
TEC_4 = TEC_5 = TEC_6 = TEC_7 = off;
if (TECLAS == 0x0F)
return 0xFF;
/* comenzamos sondeo de teclado */
TEC_4 = TEC_5 = TEC_6= on;
/* primera linea */
TEC_7 = off;
if (TEC_0 == 0)
tecla_actual="e";
if (TEC_1 == 0)
tecla_actual="B";
if (TEC_2==0)
tecla_actual="0";
if (TEC_3==0)
tecla_actual="D";
/* segunda linea */
TEC_7 = on;
TEC_6 = off;
if (TEC_0==0)
tecla_actual="M";
if (TEC_1==0)
tecla_actual="9";
if (TEC_2==0)
tecla_actual="8";
if (TEC_3==0)
tecla_actual="7";
/* tercera linea */
TEC_6 = on;
TEC_5 = off;
if (TEC_0==0)
tecla_actual="<";
if (TEC_1==0)
tecla_actual="6";
if (TEC_2==0)
tecla_actual="5";
if (TEC_3==0)
tecla_actual="4";
/* cuarta linea */
TEC_5 = on;
TEC_4 = off;
if (TEC_0==0)
tecla_actual=">"; // enter
if (TEC_1==0)
tecla_actual="3"; // izquierda
if (TEC_2==0)
tecla_actual="2";
if (TEC_3==0)
tecla_actual="1"; // derecha
TEC_4 = on;
if (tecla == tecla_actual)
{
tecla_pulsada = 1;
}
else
tecla_pulsada = 0;
return tecla_actual;
}
char scan_teclado (void)
{
tecla = teclado();
if (tecla_pulsada != 1)
return tecla;
else
return 0xFF;
}
Te faltara la definicion de alguna variable, pero eso ya lo veras en cuanto lo compiles o le eches un vistazo a las funciones.
Un saludo.