Te recomiendo la siguiente tecnica, en ella mueves un numero equivalente a la rutina y llamas una "tabla de rutinas" esta tabla realiza un goto a la rutina deseada
y desde cada una realizas un "Return"
;{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
; Función TABLA_DE_RUTINAS
; Metodo de llamado
; movlw NumMiRutina
; movwf TablaOffset
; pagesel TABLA_DE_RUTINAS
; call TABLA_DE_RUTINAS
; Descripción; Ejecuta una rutina segun una tabla
; Detalle: Se utiliza una tabla para realizar un llamado a rutina.
; estas rutinas deben terminar en Return para la correcta
; Ejecución.
; Salida: goto miRutina.
;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
TABLA_DE_RUTINAS:
movlw HIGH T_RUTINAS
movwf PCLATH
banksel TablaOffset
movlw LOW T_RUTINAS
addwf TablaOffset,W
btfsc STATUS,C ;se cruzo la pagina?
incf PCLATH,F
movwf PCL
T_RUTINAS
goto CMD_A
goto CMD_B
goto CMD_C
goto CMD_D
goto CMD_E
goto CMD_F
CMD_A
;...Codigo de A
Return
CMD_B
;Codigo de B
Return
etc...
La salida de reloj es mejor hacerla mediante el pwm del PIC, con eso mientras se atiende el teclado puedes desentenderte del reloj.
Saludos...
Oldkami