La memòria de programa interna del PIC16F690 té 4 k paraules dividides en dues pàgines. Les adreces de cada una de les pàgines són les següents:
| Pàgina | Adreces (decimal) | Adreces (hexadecimal) | Adreces (binari) |
| 0 | 0 a 2047 | 000h a 7FFh | 0000 0000 0000 a 0111 1111 1111 |
| 1 | 2048 a 4095 | 800h a FFFh | 1000 0000 0000 a 1111 1111 1111 |
Observem que les adreces requereixen nombres de dotze bits.
D'altra banda, les instruccions de salt del PIC16F690 només emmagatzemen adreces d'onze bits. Per tant, si no fem res especial, les dues instruccions següents anirien a parar al mateix lloc:
goto 0x004 goto 0x804
Si nosaltres tenim un programa que ocupa més de 2 kB ens apareixerà un missatge d'error o bé el programa no farà el que esperem.
Per a poder tenir programes que ocupin més de 2 kB cal dividir-los en dues parts i posar-ne una part a cada pàgina. Una opció és posar el programa principal en la pàgina 0 i totes les funcions o una part d'elles a la pàgina 1.
Quan vulguem fer instruccions com goto i call hem de tenir present que les adreces que es guarden amb la instrucció són de només 11 bits. Els altres dos bits es guarden a les posicions corresponents (bits 3 i 4) del registre PCLATH. Així, per a saltar a l'adreça 804 faríem servir el següent tros de programa:
bsf PCLATH,3 ; Canviem a la segona pàgina goto 0x804
o bé aquest altre (tots dos fan el mateix):
bsf PCLATH,3 ; Canviem a la segona pàgina goto 0x004
El registre PCLATH no es modifica si no el toquem nosaltres, per tant els següents goto i els següents call seguirant sent a la pàgina 1 fins que tornem a desactivar els bits.
Cal tenir present que la pila on es guarden les adreces de retorn (per als return, retlw i retfie) sí que és de 13 bits i, per tant, retorna a la pàgina des d'on s'ha saltat i no modifica els bits 3 i 4 de PCLATH.
Així doncs, la manera més habitual de treballar serà la que expliquem a continuació. Quan hem de saltar a una posició de la pàgina 1 farem:
movlw high AdrPag1 movwf PCLATH ; Bits de més pes de l'adreça de la segona pàgina goto AdrPag1
I quan haguem de tornar a la pàgina 0 farem:
movlw high AdrPag0 movwf PCLATH ; Bits de més pes de l'adreça de la primera pàgina goto AdrPag0
A l'hora de fer la crida a una funció que està a la pàgina 1, el més habitual serà:
movlw high FuncPag1 movwf PCLATH ; Bits de més pes de l'adreça de la funció PosicAct: call FuncPag1 movlw high PosicAct movwf PCLATH ; Bits de més pes de l'adreça del lloc on retornem
En aquest cas (si no modifiquem PCLATH) tots els goto (i els call) que hi hagi en la funció aniran a la pàgina 1. El retorn de la funció (return o retlw) torna a la pàgina 0 (perquè la pila conté l'adreça sencera) però no modifica PCLATH i, per tant, el modifiquem nosaltres després (si cal).
El següent programa intenta mostrar com funciona el canvi de pàgina. La primera part del programa està situada a la pàgina 0 (inici per defecte) i el programa encén primer el LED 1 i passat un segon l'apaga i encén el 2. Passat un altre segon tornaria a repetir encenent el LED 1.
Hi ha un altre programa gairebé igual posat a la pàgina 1 (org 0x800) que només canvia en el fet que els LED que hi intervenen són el 3 i el 4. En el programa de la pàgina 1 hem substituït per nop les quatre primeres instruccions perquè, de fet, no s'executaran mai i l'objectiu és que la resta de programa es correspongui en les adreces (és a dir que cada instrucció de la pàgina 1 estigui en la mateixa adreça que la de la pàgina 0 però sumant-hi 800h). Al programa s'hi han afegit dues instruccions (marcades en groc) que fan que cada cop que s'arriba al final del bucle es salti a l'altra pàgina. El resultat serà que primer s'activarà el LED 1, després el 2; després es saltarà de pàgina i s'activarà el 3, després s'activarà el 4 i, finalment, es tornarà a saltar de pàgina i haurem tornat a veure activar el LED 0. El resultat, doncs, serà una rotació de LED.
PROCESSOR 16F690 #include <xc.inc> config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Retard1 EQU 0x20 ; Variables de retard Retard2 EQU 0x21 Retard3 EQU 0x22
PSECT code, class=CODE, delta=2, abs ; A l'inici de la memòria main: bsf RP0 ; Tria el banc 1 movlw 0xF0 ; Els LED són sortides movwf TRISC ; La resta del port són entrades bcf RP0 ; Tria el banc 0 Bucle: movlw 00000001B ; Encén el LED 1 (el més proper al polsador) movwf PORTC movlw 5 ; Bucle de retard d'un segon call Rets movlw 00000010B ; Encén el LED 2 movwf PORTC movlw 5 ; Bucle de retard d'un segon call Rets movlw high Bucle8 movwf PCLATH ; Passem a la segona pàgina goto Bucle ; Salta a Bucle8
; ; Funció de retard de 0,2 W s ; Rets: movwf Retard3 Bucles: decfsz Retard1,f goto Bucles decfsz Retard2,f goto Bucles decfsz Retard3,f goto Bucles return
ORG 0x800 Inici8: nop ; Substitueix a bsf nop ; Substitueix a movlw nop ; Substitueix a movwf nop ; Substitueix a bcf Bucle8: movlw 00000100B ; Encén el LED 3 (el més proper al polsador) movwf PORTC movlw 5 ; Bucle de retard d'un segon call Rets8 movlw 00001000B ; Encén el LED 4 movwf PORTC movlw 5 ; Bucle de retard d'un segon call Rets8 movlw high Bucle movwf PCLATH ; Passem a la primera pàgina goto Bucle8 ; Salta a Bucle
; ; Funció de retard de 0,2 W s ; Rets8: movwf Retard3 Bucles8: decfsz Retard1,f goto Bucles8 decfsz Retard2,f goto Bucles8 decfsz Retard3,f goto Bucles8 return END main
Quan ja tenim el codi màquina, podem fer:

I se'ns obrirà una finestra on veurem el nostre programa en codi màquina i també en ensamblador però amb tots els paràmetres en forma numèrica hexadecimal. D'aquesta visualització hem agafat els dos trossos de programa que hem creat:

Si ens hi fixem, veurem que els dos trossos són gairebé iguals i que, en concret, les adreces que hi ha a les instruccions goto i call dels dos costats són iguals.
Una forma alternativa de saltar a una altra pàgina és fer servir l'opció pagesel. Per exemple, podríem canviar les línies marcades en color per les següents:
pagesel Bucle8 goto Bucle ; Salta a Bucle8
pagesel Bucle goto Bucle8 ; Salta a Bucle

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.