En aquest exemple es combinen coses dels exemples RL i EA.
Com en l'exemple anterior, en aquest cas llegirem el potenciòmetre utilitzant una entrada analògica. Ara el que farem serà utilitzar els 8 bits superiors del valor llegit per variar la velocitat. A l'Exemple RL definíem la velocitat de rotació dels LED amb dos bucles, un dins un altre, que es repetien 256 vegades. Ara variarem, en funció del potenciòmetre, el nombre de cops que es repeteix el bucle exterior.
A l'Exemple RL el bucle començava amb la variable a zero i s'anava restant (255, 254, 253, etc.) fins arribar altre cop a zero. Ara el valor llegit al potenciòmetre estarà entre 0 i 255. Si recordem que el bucle intern és de 771 μs, les durades que correspondrien a cada valor de la lectura del potenciòmetre serien:
| Valor | Cicles | Durada |
| 0 | 256 | 256 * 771 μs = 197,4 ms |
| 1 | 1 | 1 * 771 μs = 0,7 ms |
| 2 | 2 | 2 * 771 μs = 1,5 ms |
| ... | ... | ... |
| 254 | 254 | 254 * 771 μs = 195,8 ms |
| 255 | 255 | 255 * 771 μs = 196,6 ms |
I ens trobem que a l'extrem hi ha un valor que no encaixa i ens donaria un efecte visual estrany. Per evitar aquest problema, a la lectura del conversor li sumem 1. També ens trobem que el cicle mínim és de 0,7 ms que és molt poc. Per això, després dels cicles variables, farem un cicle fix de 10 ms (13 iteracions del bucle llarg).
El programa serà el següent:
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 Retard1 ; Definim dues variables de comptatge Retard2 Visualit ; I una variable on guardem el que mostraran els LED 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 movlw b'00010000' movwf ADCON1 ; Posa el conversor a 1/8 de la freqüència bcf STATUS,RP0 bsf STATUS,RP1 ; Tria el banc 2 movlw b'00000001' movwf ANSEL ; Posa AN0 com entrada analògica bcf STATUS,RP0 bcf STATUS,RP1 ; Tria el banc 0 movlw b'00000001' ; activa el conversor A/D connectat a AN0 movwf ADCON0 ; amb el resultat justificat per l'esquerra movlw b'00001000' ; Activa el bit 3 movwf Visualit ; Ho copia sobre la variable Visualit Bucle movf Visualit,w ; Copia la variable Visualit a l'acumulador movwf PORTC ; Copia el resultat sobre els LED nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon nop ; espera un microsegon, en total 5 bsf ADCON0,GO ; Inicia la conversió btfsc ADCON0,GO ; Quan el bit sigui 0 la conversió haurà acabat goto $-1 ; repetim la línia fins que deixi de ser 0 movf ADRESH,w ; Copia els bits superiors a l'acumulador addlw 1 ; Li suma 1 i tenim la durada variable del cicle movwf Retard2 ; Ho copia a la variable Retard2 RetVar decfsz Retard1,f ; Decrementa la variable 1 ; si dona zero, no es fa la instrucció següent goto RetVar ; Salta, excepte si el resultat ha estat zero decfsz Retard2,f ; Decrementa la variable 2 goto RetVar ; Salta, excepte si el resultat ha estat zero movlw .13 ; El punt indica que es un valor decimal movwf Retard2 ; Comença un altre cicle de durada fixa (10 ms) Ret10ms decfsz Retard1,f goto Ret10ms decfsz Retard2,f goto Ret10ms Rotar bcf STATUS,C ; posa a zero el bit d'arrossegament rrf Visualit,f ; Fa rodar els bits cap a la dreta ; el bit d'arrossegament entra per l'esquerra ; i el bit de la dreta passa a l'arrossegament btfsc STATUS,C ; Comprova si s'ha activat l'arrossegament ; Si no s'ha activat, salta una instrucció bsf Visualit,3 ; Si s'ha activat, torna a posar un 1 (0000 1000) goto Bucle ; Repetim-ho... end

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