En aquest exemple tindrem un programa que anirà incrementant (o decrementant) un valor del 0 al 15 i aquest valor es mostrarà en els LED. Prement el polsador podrem canviar el sentit (incrementar o decrementar). A l'inici de cada cicle de programa el valor i el sentit actuals es guardaran a la memòria EEPROM (adreces 0 i 1, respectivament), d'altra banda, en la inicialització del programa es llegiran aquests valors a la memòria EEPROM per tal que el programa pugui continuar a partir del punt on s'havia quedat.
A l'hora de provar el programa, podem fer-ho desconnectant l'alimentació i tornant-la a connectar o bé tornant a enviar el programa. En aquest segon cas, cal assegurar-se que la casella EEPROM del menú Memories to Program està desactivada ja que en cas contrari ens hi escriurà al damunt. Si ho provem desconnectant l'alimentació no cal prendre cap precaució especial.

En el següent programa hem marcat en color les línies que corresponen a la gestió de la memòria EEPROM, si les esborrem el programa també funcionarà però no recordarà on s'havia quedat.
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
Retard EQU 0x20 ; Definim tres variables per controlar els retards (3 bytes) Visualit EQU 0x23 ; I una variable on guardem el que mostraran els LED Sentit EQU 0x24 ; Si és 0 suma, si és 1 resta ; Zona de memòria de dades que no depèn del banc triat Adre EQU 0x70 ; Adreça de la memòria EEPROM en la que volem escriure Valor EQU 0x71 ; Valor que volem escriure a la memòria EEPROM
PSECT code, class=CODE, delta=2, abs
main:
bsf RP0 ; Tria el banc 1
clrf TRISC ; Posa tots els bits del port C com a sortida
bcf RP0 ; Tria el banc 0
clrf Adre ; Posició on hi ha el valor a visualitzar
call LecEE ; Llegim de la memòria EEPROM
movf Valor,w ; Valor llegit
movwf Visualit ; El guarda
movlw 1 ; Posició on hi ha el sentit
movwf Adre
call LecEE ; Llegim de la memòria EEPROM
movf Valor,w ; Valor llegit
movwf Sentit ; El guarda
Bucle: ; Primer copiem el valor als LED
movf Visualit,w ; Anem a guardar el valor a la memòria EEPROM
movwf Valor
clrf Adre ; El guardem a la posició 0
call EscEE ; Ho escriu
movf Sentit,w ; Anem a guardar el sentit a la memòria EEPROM
movwf Valor
movlw 1 ; Posició on guardarem el sentit
movwf Adre
call EscEE ; Ho escriu
movf Visualit,w ; Copia la variable Visualit sobre el registre W
movwf PORTC ; Copia el valor de W al port C
btfsc PORTA,3 ; Mirem l'estat del polsador
goto NoCanvi ; Si no està premut, no canvia res
movlw 1 ; Volem canviar el bit 0
xorwf Sentit,f ; Canviem el sentit de l'operació
NoCanvi:
btfss PORTA,3 ; Mirem l'estat del polsador
goto $-1 ; Esperem que es deixi anar el polsador
movlw 5 ; Retard d'un segon
movwf Retard+2
Ret:
decfsz Retard,f ; Decrementa la variable 1
; si dona zero, no es fa la instrucció següent
goto Ret ; Salta, excepte si el resultat ha estat zero
decfsz Retard+1,f ; Decrementa la variable 2
goto Ret ; Salta, excepte si el resultat ha estat zero
decfsz Retard+2,f ; Decrementa la variable 2
goto Ret ; Salta, excepte si el resultat ha estat zero
; Acabat el retard, canviem el valor de Visualit
btfss Sentit,0 ; Mirem el sentit actual
goto Suma
decf Visualit,f ; Decrementa Visualit
movlw 15 ; Prepara l'acumulador per si cal reiniciar la variable
btfsc Visualit,7 ; Mira si hem decrementat un zero
movwf Visualit ; Posa 15 a la variable Visualit
goto Bucle ; Repetim-ho...
Suma:
incf Visualit,f ; Incrementa Visualit
btfsc Visualit,4 ; Mira si ja hem arribat al bit 4
clrf Visualit ; Si hi hem arribat, posa a zero la variable Visualit
goto Bucle ; Repetim-ho...
; ; Llegeix la memòria EEPROM ; LecEE: bsf RP1 ; Tria el banc 2 movf Adre,w ; Adreça que volem llegir movwf EEADR ; Adreça EEPROM bsf RP0 ; Tria el banc 3 bcf EEPGD ; Accés a EEPROM bsf RD ; Lectura bcf RP0 ; Tria el banc 2 movf EEDAT,w ; Llegim, el valor està a W movwf Valor ; El guardem bcf RP1 ; Tria el banc 0 return ; ; Escriu la memòria EEPROM ; EscEE: bsf RP1 ; Tria el banc 2 movf Valor,w ; Valor que volem guardar movwf EEDAT ; Guarda el valor de l'acumulador al registre EEDAT movf Adre,w ; Adreça on volem escriure movwf EEADR ; Adreça EEPROM bsf RP0 ; Tria el banc 3 bcf EEPGD ; Accés a EEPROM bsf WREN ; Activa la possibilitat d'escriptura bcf GIE ; Desactiva les interrupcions btfsc GIE ; Comprova si el bit s'ha desactivat goto $-2 movlw 0x55 ; Valor necessari movwf EECON2 ; Escriu 55h movlw 0xAA ; Valor necessari movwf EECON2 ; Escriu AAh bsf WR ; Inicia l'escriptura btfsc WR ; Ha acabat l'escriptura? goto $-1 ; No, doncs esperem bsf GIE ; Torna a activar les interrupcions bcf WREN ; Desactiva la possibilitat d'escriptura bcf RP0 bcf RP1 ; Tria el banc 0 return END main

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