Bueno, si estás realizando el programa en asembler, este pedazo de codigo te ayudará mucho. Si lo realizas en C de CCS, te recomiendo que llames el driver del teclado que viene incluido. Empieza a hacer el programa y ya iremos mejorandolo.
gfp

;ESTA RUTINA DECODIFICA EL TECLADO DE 4X4 Y EL RESULTADO ES GUARDADO EN EL
;REGISTRO "TECLA"
CONTBYTE EQU 0X0C
CONTADOR EQU 0X1C
TECLA EQU 0X2C
COLUMNA EQU 0X3C
FILA EQU 0X4C
CONTA1 EQU 0X4F
REG1 EQU 0X0E
REG2 EQU 0X13
CONT EQU 0X0D
#DEFINE BANK1 BSF STATUS,5 ;Macro para abreviar el Banco 1
#DEFINE BANK0 BCF STATUS,5 ;Macro para abreviar el Banco 0
TECLADO BANK1 ;Seleccion de banco1
MOVLW 0XF0 ;W = 0XF0, PORTB 0,1,2,3 = OUT; 4,5,6,7 = IN
MOVWF TRISB ;TRISB=W
BANK0 ;Seleccion de banco0
NEW CLRF FILA
MOVLW .1
MOVWF COLUMNA
MOVLW 0XFE ;Columna 1
MOVWF PORTB
MOVLW .4
MOVWF CONTBYTE
SCAN BTFSS PORTB,4 ;Oprimieron tecla de Fila 0?
GOTO SUEFIL0 ;si
INCF FILA,1 ;no
BTFSS PORTB,5 ;Oprimieron tecla de Fila 1?
GOTO SUEFIL1 ;si
INCF FILA,1 ;no
BTFSS PORTB,6 ;Oprimieron tecla de Fila 2?
GOTO SUEFIL2 ;si
INCF FILA,1 ;no
BTFSS PORTB,7 ;Oprimieron tecla de Fila 3?
GOTO SUEFIL3 ;si
DECFSZ CONTBYTE,1
GOTO RESET
GOTO NEW
RESET CLRF FILA ;no
INCF COLUMNA,1
BSF STATUS,0
RLF PORTB,1
GOTO SCAN
SUEFIL0 BTFSS PORTB,4
GOTO SUEFIL0
GOTO TECLAD
SUEFIL1 BTFSS PORTB,5
GOTO SUEFIL1
GOTO TECLAD
SUEFIL2 BTFSS PORTB,6
GOTO SUEFIL2
GOTO TECLAD
SUEFIL3 BTFSS PORTB,7
GOTO SUEFIL3
GOTO TECLAD
TECLAD MOVLW .3
MOVWF CONTBYTE
MOVF FILA,0
SUMA ADDWF FILA,1
DECFSZ CONTBYTE,1
GOTO SUMA
MOVF FILA,0
MOVWF TECLA
MOVF COLUMNA,0
ADDWF TECLA,1 ;Tecla decodificada!
PUERTOS BANK1 ;Seleccion de banco1
CLRF TRISB ;trisb=w
BANK0 ;Seleccion de banco0
RETURN