A l'exemple AI guardàvem els valors a la memòria de dades i després els llegiem amb adreçament indirecte. Encara que només s'executessin un cop, al programa hi havia un conjunt significatiu d'instruccions que escrivien els valors dels codis Gray que després havíem de llegir.
En aquest exemple guardarem els 16 valors del codi Gray a la memòria de programa en el moment de programar i així estalviarem línies de programa. Les etiquetes Gra2 i Gra3 no les fem servir. El valor d'EEDATH no el llegim ja que sabem que és zero.
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 Polsador ; Una variable amb l'estat del polsador (1 = premut) Previ ; I una amb l'estat previ del polsador Visualit ; Una variable on guardem el que mostraran els LED Compta ; Una variable per comptar iteracions Retard1 ; Variable per al bucle de retard endc
org 0 Inici bsf STATUS,RP0 ; Tria el banc 1 movlw 0xFF ; Posa l'acumulador a FFh (tot uns) movwf TRISA ; Posa tots els bits del port A com a entrada clrf TRISC ; Posa tots els bits del port C com a sortida bcf STATUS,RP0 clrf Compta ; Posa el comptador d'iteracions a valor zero clrf Visualit ; Posa el comptador dels LED a valor zero clrf Previ ; L'estat previ del polsador és no premut clrf PORTC ; Comencem amb els LED apagats Bucle movlw b'00000001' movwf Polsador ; Activem polsador abans de comprovar btfsc PORTA,3 ; Mira si està desactivada l'entrada A3 ; Si desactivat (premut), no fa la instrucció següent clrf Polsador ; Si no està premut, desactiva polsador movf Previ,w ; Copia Previ a l'acumulador xorwf Polsador,w ; Compara Previ amb Polsador, si són iguals s'activa Z btfsc STATUS,Z ; Si són iguals va a Final goto Esborra incf Compta,f ; Si són iguals, incrementa el valor de Compta movf Compta,w ; Copia Compta a l'acumulador xorlw .4 ; Comprova si val 4, si ho val s'activa Z btfss STATUS,Z ; Si val 4 no fa la instrucció següent goto Final ; Si no era 4 va a Final movf Polsador,w ; Copia Polsador a W, si val 0 s'activa Z btfsc STATUS,Z ; Si Polsador valia 1 (Z=0) no fa la instrucció següent goto Invert ; Si no està premut, ja estem incf Visualit,f ; Si ho està, incrementa el valor de Visualit btfsc Visualit,4 ; Mira si hem arribat a 16 clrf Visualit ; Si hem arribat a 16, torna a posar el comptador a zero call Llegir ; Llegim el valor a la memòria de programa movwf PORTC ; I ho posa als LED Invert movf Previ,w ; Copia Previ a l'acumulador xorlw b'00000001' ; Inverteix el valor movwf Previ ; I ho guarda a Previ Esborra clrf Compta ; Posa el comptador d'iteracions a valor zero Final ; Funció de retard 1 ms nop decfsz Retard1,f goto Final goto Bucle ; Repetim-ho...
Llegir bsf STATUS,RP1 ; Tria el banc 2 movlw HIGH Gray ; Llegim l'adreça de la variable movwf EEADRH ; Adreça EEPROM movlw LOW Gray ; Llegim l'adreça de la variable bcf STATUS,RP1 ; Tria el banc 0 addwf Visualit,w ; Li suma el valor a mostrar bsf STATUS,RP1 ; Tria el banc 2 movwf EEADR ; Adreça EEPROM bsf STATUS,RP0 ; Tria el banc 3 bsf EECON1,EEPGD ; Accés a memòria de programa bsf EECON1,RD ; Lectura nop nop ; espera dos cicles bcf STATUS,RP0 ; Tria el banc 2 movf EEDAT,w ; Llegim bcf STATUS,RP1 ; Tria el banc 0 return
org 0x60 ; Lloc on guardem els valors Gray db 0,b'00000000',0,b'00000001',0,b'00000011',0,b'00000010',0,b'00000110',0,b'00000111' Gra2 db 0,b'00000101',0,b'00000100',0,b'00001100',0,b'00001101',0,b'00001111',0,b'00001110' Gra3 db 0,b'00001010',0,b'00001011',0,b'00001001',0,b'00001000' end

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