Que tal, hace algun tiempo hice algo asi con un micro AT89C51. El siguiente enlace fue mi referencia:
http://www.beyondlogic.org/keyboard/keybrd.htmY aqui esta el codigo. Solo esta la parte de las letras en minusculas y mayusculas, asi como los numeros que estan arriba de las letras. El shift me parece que no me funciono.
;////////////AQUI TENGO CONECTADO UN TECLADO TIPO DIN DE 6 PINES AL MICROCONTROLADOR 89C51//////////////
;/////////// CON EL MICRO LEO EL DATO Y LO ENVIO SERIAL AL HIPERTERMINAL///////////////////////////////
$MOD51
VAL1 EQU 30H ;AREA NO BIT A BIT
VAL2 EQU 31H
VAL3 EQU 32H
LETRA EQU 33H
SEMAFOR EQU 23H ;AREA BIT A BIT
AUX_BIT EQU 21H
COMP EQU 22H
IN BIT P3.0
ORG 00H
JMP CONFIG
ORG 003H
JMP SERVI
CONFIG: MOV IE,#81H
MOV SP,#78H
MOV TCON,#01H
MOV SCON,#53H
MOV TMOD,#20h
MOV PCON,#80H
MOV TH1,#0FDH
MOV P1,#00H
MOV R0,#00H
CLR COMP.0
CICLO: NOP
JMP CICLO ;Espero que llegue el primer clock y se interrumpe el micro
SERVI: CALL CARGA
CLR SEMAFOR.0
LOOP0: JNB IN,START ;ESPERA BIT INICIO
JMP LOOP0
START: JB SEMAFOR.0,VISUAL ;Pregunto si la bandera es uno y salto a la etiqueta VISUAL
CALL RET_100Mseg
JNB IN,LOOP1 ;REVISA LOS BIT"S EN P3, A TRAVES DE ESTE PIN ENTRARAN LOS BITS DE DATOS
CALL UNO
JMP START
LOOP1: CALL CERO
JMP START
;////////////////AQUI LLEGO CUANDO LA BANDERA SEMAFOR.0 ES "1"////////////////
VISUAL:
;MOV P1,A ;RESPALDO EL VALOR EN EL REGISTRO LETRA
MOV LETRA,A
CALL RET1
MOV A,LETRA
;//////////////APARIR DE AQUI PREGUNTO QUE TECLA PRESIONE/////////////
ENTER: CJNE A,#5AH,BLOCK ;AQUI PUEDES SUSTITUIR BLOCK POR SHIFIZ Y PROBAR
MOV A,#0DH ;VALOR PARA PASAR A LA SIGUIENTE LINEA
CALL Trans
MOV A,#0AH
CALL Trans
MOV A,#00H
JMP SAL
;//////////////LAS RUTINAS DE SHIFT NO RECUERDO QUE ME HALLAN FUNCIONARON/////////////////
SHIFIZ: CJNE A,#12H,SHIFDE
SETB COMP.1
;MOV R1,#00h
JB COMP.0,MINUS ;JB MINUS
JNB COMP.0,MAYUS ;JB MAYUS
JMP SAL
SHIFDE: CJNE A,#59H,BLOCK
SETB COMP.1
;MOV R1,#00h
;JB COMP.0,CBLOQ
;JNB COMP.0,SBLOQ
JMP SAL
;/////////////////////////////////////////////////////////////////////
BLOCK: CJNE A,#58H,BAND
JMP GRAND
GRAND: INC R0
SETB COMP.0
CJNE R0,#02H,SAL
CLR COMP.0
MOV R0,#00H
JMP SAL
BAND: JB COMP.0,MAYUS ;AQUI PREGUNTO POR EL ESTADO DE LA BANDERA COMP.0 Y VOY A LA SUBRUTINA CORRESPONDIENTE
JNB COMP.0,MINUS
MINUS: MOV A,LETRA
MOV DPTR,#Minusculas
MOVC A,@A+DPTR
CALL Trans
JMP SAL
MAYUS: MOV A,LETRA
MOV DPTR,#Mayusculas ;CARGO EL DPTR CON LA TABLA MAYUSCULA
MOVC A,@A+DPTR ;INCREMENTO EL DPTR HASTA ENCONTRAR EL VALOR CORRESPONDIENTE EN LA TABLA Y LO CARGO EN EL ACUMULADOR
CALL Trans ;LLAMO LA RUTINA DE ENVIO
JMP SAL
;//////////////RUTINA DE ENVIO SERIAL AL PC//////////////////////////////
Trans: MOV SBUF,A
SETB TR1
CLR TI
JNB TI,$
CLR TI
CLR TR1
CALL RET1
RET
SAL: CLR IE0
RETI
UNO: SETB ACC.7 ;PONGO UN "1" EN EL ACUMULADOR SI EL PRIMER BIT DE DATO ES "1"
DJNZ AUX_BIT,ROTAR1 ;DECREMENTO AUX_BIT QUE ES EL CONTADOR DE 8 BITS QUE ME INDICA CUANDO LLEGAN TODOS LOS DATOS
JMP THEN1
ROTAR1: RR A ;ROTO EL ACUMULADOR PARA IR ACOMODANDO EL DATO
JMP SALIR1 ;sALTO PARA SALIR DE LA SUBRUTINA Y ESPERAR EL SIGUIENTE BIT DE DATOS
THEN1: SETB SEMAFOR.0 ;LEVANTO LA BANDERA PARA INDICAR QUE LLEGARON LOS 8 BITS DE DATO
SALIR1: RET
CERO: CLR ACC.7 ;IGUAL QUE LA SUBRUTINA UNO, PERO SE COLOCA "0" SEA NECESARIO
DJNZ AUX_BIT,ROTAR2
JMP THEN2
ROTAR2: RR A
JMP SALIR2
THEN2: SETB SEMAFOR.0
SALIR2: RET
CARGA: MOV AUX_BIT,#08H
MOV ACC,#00H
RET
RET_100Mseg:
MOV VAL1,#28D
DESC: DJNZ VAL1,DESC
RET
RET1:
MOV VAL1,#10D
TERC1: MOV VAL2,#10D
SEGU1: MOV VAL3,#10D
PRIM1: DJNZ VAL3,PRIM1
DJNZ VAL2,SEGU1
DJNZ VAL1,TERC1
RET
;/////////////////////////TABLAS/////////////////////
Minusculas:
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 09H ;TABULADOR(14)
DB ""
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB "q"
DB "1"
DB 00H
DB 00H
DB 00H
DB "z"
DB "s"
DB "a"
DB "w"
DB "2"
DB 00H
DB 00H
DB "c"
DB "x"
DB "d"
DB "e"
DB "4"
DB "3"
DB 00H
DB 00H
DB " "
DB "v"
DB "f"
DB "t"
DB "r"
DB "5"
DB 00H
DB 00H
DB "n"
DB "b"
DB "h"
DB "g"
DB "y"
DB "6"
DB 00H
DB 00H
DB 00H
DB "m"
DB "j"
DB "u"
DB "7"
DB "8"
DB 00H
DB 00H
DB ","
DB "k"
DB "i"
DB "o"
DB "0"
DB "9"
DB 00H
DB 00H
DB "."
DB "-"
DB "l"
DB 164 ;ñ(77)
DB "p"
DB 39 ;"(79)
DB 00H
DB 00H
DB ","
DB "{"
DB 00H
DB "["
DB 173 ;?(86)*
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H ;ENTER(91)-13
DB "]"
DB 00H
DB "}"
DB 00H
DB 00H
DB 00H
DB "<"
DB 00H
DB 00H
DB 00H
DB 00H
DB 008H ;RETROCESO(103)
DB 00H
Mayusculas:
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 09H
DB ""
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB "Q"
DB "1"
DB 00H
DB 00H
DB 00H
DB "Z"
DB "S"
DB "A"
DB "W"
DB "2"
DB 00H
DB 00H
DB "C"
DB "X"
DB "D"
DB "E"
DB "4"
DB "3"
DB 00H
DB 00H
DB " "
DB "V"
DB "F"
DB "T"
DB "R"
DB "5"
DB 00H
DB 00H
DB "N"
DB "B"
DB "H"
DB "G"
DB "Y"
DB "6"
DB 00H
DB 00H
DB 00H
DB "M"
DB "J"
DB "U"
DB "7"
DB "8"
DB 00H
DB 00H
DB ","
DB "K"
DB "I"
DB "O"
DB "0"
DB "9"
DB 00H
DB 00H
DB "."
DB "-"
DB "L"
DB 165
DB "P"
DB 39
DB 00H
DB 00H
DB ","
DB "{"
DB 00H
DB "["
DB 173
DB 00H
DB 00H
DB 00H
DB 00H
DB 13
DB "]"
DB 00H
DB "}"
DB 00H
DB 00H
DB 00H
DB "<"
DB 00H
DB 00H
DB 00H
DB 00H
DB 08H
DB 00H
END