Hola oscarec60 hace tiempo yo modifique un ejemplo que utilizaba una interrupción externa para decodificar un teclado ps/2, y transmitirla serialmente hacia una hyperterminal, en el siguiente enlace te dejo un tutorial sobre como funciona el teclado y su respectivo codigo en ccs, a lo referente a la pantalla LCD si utilizas el compilador pcwh no creo que tengas muchos problemas ya que incluye un driver para el control de la misma, de todas formas te dejo mi codigo en ccs y si necesitas una explicación solo avisa y con gusto la posteare.
Codigo:
#include "18f452.h"
#fuses HS, NOWDT,NOPROTECT, PUT, BROWNOUT, NOLVP
#use Delay(Clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <bootloader.h>
int bitcount=11;
int data=0;
unsigned char const unshifted[68][2] = {
0x0d,9,
0x0e,"º",
0x15,"q",
0x16,"1",
0x1a,"z",
0x1b,"s",
0x1c,"a",
0x1d,"w",
0x1e,"2",
0x21,"c",
0x22,"x",
0x23,"d",
0x24,"e",
0x25,"4",
0x26,"3",
0x29," ",
0x2a,"v",
0x2b,"f",
0x2c,"t",
0x2d,"r",
0x2e,"5",
0x31,"n",
0x32,"b",
0x33,"h",
0x34,"g",
0x35,"y",
0x36,"6",
0x39,",",
0x3a,"m",
0x3b,"j",
0x3c,"u",
0x3d,"7",
0x3e,"8",
0x41,",",
0x42,"k",
0x43,"i",
0x44,"o",
0x45,"0",
0x46,"9",
0x49,".",
0x4a,"-",
0x4b,"l",
0x4c,"ñ",
0x4d,"p",
0x4e,""",
0x52,"´",
0x54,"`",
0x55,"¡",
0x5a,13,
0x5b,"+",
0x5d,"ç",
0x61,"<",
0x66,8,
0x69,"1",
0x6b,"4",
0x6c,"7",
0x70,"0",
0x71,".",
0x72,"2",
0x73,"5",
0x74,"6",
0x75,"8",
0x79,"+",
0x7a,"3",
0x7b,"-",
0x7c,"*",
0x7d,"9",
0,0
};
unsigned char const shifted[68][2] = {
0x0d,9,
0x0e,"ª",
0x15,"Q",
0x16,"!",
0x1a,"Z",
0x1b,"S",
0x1c,"A",
0x1d,"W",
0x1e,""",
0x21,"C",
0x22,"X",
0x23,"D",
0x24,"E",
0x25,"$",
0x26,"·",
0x29," ",
0x2a,"V",
0x2b,"F",
0x2c,"T",
0x2d,"R",
0x2e,"%",
0x31,"N",
0x32,"B",
0x33,"H",
0x34,"G",
0x35,"Y",
0x36,"&",
0x39,"L",
0x3a,"M",
0x3b,"J",
0x3c,"U",
0x3d,"/",
0x3e,"(",
0x41,";",
0x42,"K",
0x43,"I",
0x44,"O",
0x45,"=",
0x46,")",
0x49,":",
0x4a,"_",
0x4b,"L",
0x4c,"Ñ",
0x4d,"P",
0x4e,"?",
0x52,"¨",
0x54,"^",
0x55,"¿",
0x5a,13,
0x5b,"*",
0x5d,"Ç",
0x61,">",
0x66,8,
0x69,"1",
0x6b,"4",
0x6c,"7",
0x70,"0",
0x71,".",
0x72,"2",
0x73,"5",
0x74,"6",
0x75,"8",
0x79,"+",
0x7a,"3",
0x7b,"-",
0x7c,"*",
0x7d,"9",
0,0
};
void decode(unsigned char sc);
#int_ext
void int_ext_isr(void)
{
if(bitcount < 11 && bitcount > 2)
{
data = (data >> 1);
if( input(PIN_B7) == 1)
data = data | 0x80;
}
if(--bitcount == 0)
{
decode(data);
data = 0;
bitcount = 11;
}
}
void main(void)
{
set_tris_b(0xff);
printf("
INTERFACE DE TECLADO v1.0"
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(1)
{
}
}
void decode(unsigned char sc)
{
static unsigned char is_up=0, shift = 0;
int i=0;
//-------- El último dato recibido fue el identificador de Up-Key
if (!is_up)
{
switch (sc)
{
//-------- Identificador de Up-Key
case 0xF0 :
is_up = 1;
break;
//-------- SHIFT Izquierdo
case 0x12 :
shift = 1;
break;
//-------- SHIFT Derecho
case 0x59 :
shift = 1;
break;
//-------- ENTER
case 0x5A :
printf("
"
break;
default:
if(!shift)
{
for(i = 0; i<=68; i++)
{
if (unshifted[0] == sc)
{
printf("%c", unshifted[1]);
}
}
}
else
{
for(i = 0; i<=68; i++)
{
if (shifted[0] == sc)
{
printf("%c", shifted[1]);
}
}
}
break;
}
}
else
{
//-------- No se permiten 2 0xF0 en una fila
is_up = 0;
switch (sc)
{
//-------- SHIFT Izquierdo
case 0x12 :
shift = 0;
break;
//-------- SHIFT Derecho
case 0x59 :
shift = 0;
break;
}
}
}