Que tal CMECKARDT!!!. Es muy buena idea la tuya para cambiar de página. Te parece bien si te paso otro tip para hacerlo?
Yo utilizo la directiva PAGESEL del asembler, pero cómo funciona?
Bien sencillo, vamos suponer que tienes una subrutina en las páginas 2 o superior, y esta se llama INI_LCD, al utilizar esta directiva la podrás llamar desde cualquier página y el asembler configura automáticamente el PCLATH, el código sería pues:
PAGESEL INI_LCD
CALL LCD
También se puede utilizar la directiva LCALL, es decir:
LCALL LCD
Con esta directiva no importa en cual página se encuentre tu subrutina. Cabe hacer mención que esta directiva lo que realmente hace es, agregar automáticamente dos instrucciones de BSF o BCF al PCLATH, es decir, si la subrutina se encuentra en la página 2, entonces lo que hace es agregar:
bsf pclath,3
bcf pclath,4
Si la subrutina se encuebtra en la página 3, entonces la directiva agrega:
bcf pclath,3
bsf pclath,4
y así sucesivamente.
Esta directiva también funciona con los saltos largos utilizando el GOTO. Ejemplo:
Suponiendo que deseas hacer un salto a una etiqueta o procedimiento que está mas alla de los 2K (es decir de la página 2 en delante) y la etiqueta se llama ROTAR, entonces, el código sería:
PAGESEL ROTAR
goto ROTAR.
También se puede utilizar la instrucción LGOTO que es equivalente a lo anterior, es decir:
LGOTO ROTAR
Las anteriores directivas también agregan los BSF y BCF a los bits 3 y 4 del registro PCLATH, por lo que se debe tener cuidado, al utilizarlos.
Por ejemplo:
btfss status,c
goto ROTAR
bcf status,c
Si tomamos el ejemplo anterior mencionaba, que ROTAR se encuentra mas allá de los 2K, por lo que una forma incorrecta sería hacer lo siguiente:
btfss status,c
LGOTO ROTAR
bcf status,c
Pero, porqué lo anterior no es correcto? Recordando nuevamente:
LGOTO y LCALL agregará dos instrucciones en donde se coloque la directiva, entonces realmente nuestro código es:
btfss status,c
bsf pclath,3
bcf pclath,4
goto ROTAR
bcf status,c
lo anterior nos provoca un error de lógica, por lo que se tiene que utilizar el PAGESEL como la solución adecuada, que dando entonces, nuestro código, de manera correcta:
PAGESEL ROTAR
btfss status,c
goto ROTAR
bcf status,c
Lo anterior también aplica para el LCALL.
Bueno espero y esto te sea de utilidad.
Nota: Estas directivas son válidas par el MPASM de microchip.