Al final ya me funcionó,aqui esta por si lo quiere alguien
;****************************************************************************************
; TECLADO.INC
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal organi-
;zado en una matriz de 4 x 4 tal y como es el caso del teclado incorporado en la tarjeta
;de ampliación MicroPic Trainer PLUS de Microsystems Engineering.
;
;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE.
;
;Key_Scan: realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
; variable "Tecla" retorna con el código de la tecla pulsada o el 0x80 en caso
; de no haber ninguna.
;
;Key_BCD: Convierte el código de tecla en código BCD (del 0 a F). Antes de llamar a la
; rutina la variable "Tecla" contiene el código de tecla. Al finalizar, la
; rutina devuelve el código BCD en la misma variable "Tecla".
;
;BCD_7seg: Convierte el código BCD en código 7 segmentos. A la llamada de la rutina, el
; W debe contener el código BCD y al finalizar la misma W retorna con el có-
; digo 7 segmentos.
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
; RB0 RB1 RB2 RB3
; ^ ^ ^ ^ TECLA CODIGO
; | | | | ----- --------------
; |---|---|---|---| 0 01111101 = 0x7D
; RB4 --> | 1 | 2 | 3 | A | 1 11101110 = 0xEE
; |---|---|---|---| 2 11101101 = 0xED
; RB5 --> | 4 | 5 | 6 | B | 3 11101011 = 0xEB
; |---|---|---|---| 4 11011110 = 0xDE
; RB6 --> | 7 | 8 | 9 | C | 5 11011101 = 0xDD
; |---|---|---|---| 6 11011011 = 0xDB
; RB7 --> | * | 0 | . | D | 7 10111110 = 0xBE
; |---|---|---|---| 8 10111101 = 0xBD
; 9 10111011 = 0xBB
; * 01111110 = 0x7E
; . 01111011 = 0x7B
; D 01110111 = 0x77
; C 10110111 = 0xB7
; B 11010111 = 0xD7
; A 11100111 = 0xE7
;
;Hubiera sido más interesante que RB4-RB7 actuaran como entradas para poder hacer
;uso de la capacidad que tiene el PIC de provocar interrupción al cambiar de estado
;estas líneas. Ello no es posible dado que, en la Trainer, las líneas RB6 y RB7 forman
;parte también del circuito de grabación.
cblock Key_var ;Inicio de las variables
Tecla ;Retorno del código de tecla
Key_1 ;Nº de columnas a explorar
Key_2 ;Temporal de código
Key_Delay_1 ;Variable de temporización
Key_Delay_2 ;Variable de temporización
TRISB_Temp ;Estado temporal de TRISB
endc
;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" retorna con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.
Key_Scan: bsf STATUS,RP0 ;Seleciona página 1
movf TRISB,W
movwf TRISB_Temp ;Salva estado actual de TRISB
movlw b'00001111'
movwf TRISB ;RB0-RB3 entradas, RB4-RB7 salidas
bcf STATUS,RP0 ;Selecciona página 0
movlw 4
movwf Key_1 ;Nº de columnas a explorar
movlw b'01111111'
movwf Tecla ;Columna a activar
Key_Scan_1: movf Tecla,W
movwf PORTB ;Activa columna
nop
movf PORTB,W
movwf Key_2
subwf Tecla,W ;Lee las filas
btfss STATUS,Z ;Hay alguna pulsada ?
goto Key_Scan_2 ;Si, hay alguna pulsada
bsf STATUS,C ;No hay ninguna en esa columna
rrf Tecla,F ;Seleciona siguiente columna
decfsz Key_1,F
goto Key_Scan_1
movlw 0x80
movwf Tecla ;Retorna código 0x80 (no hay pulsación)
movf TRISB_Temp,W
bsf STATUS,RP0 ;Selecciona página 1
movwf TRISB ;Repone TRISB al valor original
bcf STATUS,RP0 ;Selecciona página 0
return ;Fin de exploración
Key_Scan_2: movlw .10 ;Bucle de temporización de unos 20 mS
movwf Key_Delay_1 ;para evitar el rebote de los pulsado-
Key_Scan_3: clrf Key_Delay_2 ;res.
clrwdt
Key_Scan_4: decfsz Key_Delay_2,F
goto Key_Scan_4
decfsz Key_Delay_1,F
goto Key_Scan_3
movf Tecla,W ;Trás la temporización se lee nuevamente
movwf PORTB ;si la tecla es la misma. Así se evitan
nop ;los rebotes.
movf PORTB,W
subwf Key_2,W
btfss STATUS,Z ;Es la misma ??
goto Key_Scan_1 ;No, seguir con la exploración
movf Key_2,W ;Si guardar en variable de salida "Tecla"
movwf Tecla
movf TRISB_Temp,W
bsf STATUS,RP0 ;Selecciona página 1
movwf TRISB ;Repone TRISB al valor original
bcf STATUS,RP0 ;Selecciona página 0
return ;Fin de exploración
;***************************************************************************************
Key_BCD:
bsf STATUS,RP0 ;Seleciona página 1
movlw b'00001111'
movwf TRISB ;RB0-RB3 entradas, RB4-RB7 salidas
bcf STATUS,RP0 ;Selecciona página 0
CLRF Tecla
MOVLW b'11101111'
MOVWF PORTB
call retardo
BTFSC PORTB,0
GOTO n2
RETLW '1'
n2:BTFSC PORTB,1
GOTO n3
RETLW '2'
n3:BTFSC PORTB,2
GOTO letraA
RETLW '3'
letraA:BTFSC PORTB,3
GOTO n4
RETLW 'A'
n4:MOVLW b'11011111'
MOVWF PORTB
call retardo
BTFSC PORTB,0
GOTO n5
RETLW '4'
n5:BTFSC PORTB,1
GOTO n6
RETLW '5'
n6:BTFSC PORTB,2
GOTO letraB
RETLW '6'
letraB:BTFSC PORTB,3
GOTO n7
RETLW 'B'
n7:MOVLW b'10111111'
MOVWF PORTB
call retardo
BTFSC PORTB,0
GOTO n8
RETLW '7'
n8:BTFSC PORTB,1
GOTO n9
RETLW '8'
n9:BTFSC PORTB,2
GOTO letraC
RETLW '9'
letraC:BTFSC PORTB,3
GOTO estrella
RETLW 'C'
estrella:MOVLW b'01111111'
MOVWF PORTB
call retardo
BTFSC PORTB,0
GOTO n0
RETLW '*'
n0:BTFSC PORTB,1
GOTO n#
RETLW '0'
n#:BTFSC PORTB,2
GOTO letraD
RETLW '#'
letraD:BTFSC PORTB,3
GOTO fin
RETLW 'D'
fin:return
retardo:bsf STATUS,RP0
movlw b'00000110'
movwf OPTION_REG
bcf STATUS, RP0
bcf INTCON, TMR0IF
clrf TMR0
espera1:btfss INTCON,TMR0IF
goto espera1
return