Aqui te dejo un ejemplo con el pic18f452 programado en PCWH, espero que te sirva.
PIC18F452 KEYBOARD
Vcc----------------> +5v
RB0---------------> Clock
RB7----------------->Data
GND---------------->GND
#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;
}
}
}