Aquest grup va codificar el sentit de gir amb l'interruptor connectat a RB4 i els diferents modes segons la següent taula:
| RB7 | RB5 | Mode |
| 0 | 0 | Aturat |
| 0 | 1 | Full step |
| 1 | 0 | Wave drive |
| 1 | 1 | Half step |
El seu programa es basa en tenir els blocs ordenats per a half step. Per fer els altres dos modes es salten els passos que no corresponen al mode actual i per canviar el sentit de gir es salta en sentit contrari. El programa final és:
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 Delay1 ; Definim dues variables de comptatge Delay2 Durada int endc
org 0 Inici bsf STATUS,RP0 ; Tria el banc 1 bcf OPTION_REG,7 ; Activa el control individual de pull-ups movlw 0xFF movwf TRISA movwf WPUA ; Activa les resistències de pull-up movwf TRISB ; Posa tot el port B com a entrada clrf TRISC movlw 0x10 movwf ADCON1 bcf STATUS,RP0 bsf STATUS,RP1 movlw 0xFF ; Posa l'acumulador a FFh (tot uns) movwf WPUB ; Activa les resistències de pull-up movlw 0x01 ; Posa l'acumulador a 01h movwf ANSEL ; L'entrada AN0 és analògica movlw 0x00 ; Posa l'acumulador a 00h movwf ANSELH ; Les altres entrades són digitals movlw 0xF7 movwf ANSEL bcf STATUS,RP0 bcf STATUS,RP1 movlw 0x01 movwf ADCON0 movlw 0x00 movwf PORTC ; Copia el valor de W al port C MainLoop nop ; espera un microsegon nop nop nop bsf ADCON0,GO ; Inicia la conversió btfsc ADCON0,GO ; Quan el bit sigui 0 la conversió haurà acabat goto $-1 ; Quan el bit sigui 0 la conversió haurà acabat movf ADRESH,w ; Copia els bits superiors a l'acumulador addlw 1 ; Li suma 1 i tenim la durada variable cicle movwf Delay2 movwf Durada OnLoop movf PORTB,w andlw b'10110000' ; Només tindrem en compte els bits 4,5 i 7 movwf int ; Copia el valor de l'acumulador a la variable int xorlw b'00100000' ; Compara aquesta seqüencia amb la seqüencia d'interruptors btfsc STATUS,Z ; Si les sequencies no coincideixen es salta la propera instrucció goto OnLoop2 movf int,w xorlw b'00110000' btfsc STATUS,Z goto OnLoop8 call TEMPS ; Crida la funció TEMPS movlw 0x88 ; Posa el valor (1000 1000) al registre W call A ; Crida la funció A btfsc STATUS,Z goto OnLoop8 movf int,w xorlw b'10010000' btfsc STATUS,Z goto OnLoop7 goto OnLoop2 MainLoop2 nop nop nop nop bsf ADCON0,GO btfsc ADCON0,GO goto $-1 movf ADRESH,w addlw 1 movwf Delay2 movwf Durada OnLoop2 movf PORTB,w andlw b'10110000' movwf int xorlw b'10000000' btfsc STATUS,Z goto OnLoop3 movf int,w xorlw b'10010000' btfsc STATUS,Z goto OnLoop call TEMPS movlw 0xAA ; Posa el valor (1010 1010) al registre W call A btfsc STATUS,Z goto MainLoop movf int,w xorlw b'00110000' btfsc STATUS,Z goto OnLoop8 OnLoop3 movf int,w xorlw b'00100000' btfsc STATUS,Z goto OnLoop4 movf int,w xorlw b'00110000' btfsc STATUS,Z goto MainLoop2 call TEMPS movlw 0x22 ; Posa el valor (0010 0010) al registre W call A btfsc STATUS,Z goto MainLoop2 movf int,w xorlw b'10010000' btfsc STATUS,Z goto MainLoop OnLoop4 movf int,w xorlw b'10000000' btfsc STATUS,Z goto OnLoop5 movf int,w xorlw b'10010000' btfsc STATUS,Z goto OnLoop3 call TEMPS movlw 0x66 ; Posa el valor (0110 0110) al registre W call A btfsc STATUS,Z goto OnLoop3 movf int,w xorlw b'00110000' btfsc STATUS,Z goto MainLoop2 OnLoop5 movf int,w xorlw b'00100000' btfsc STATUS,Z goto OnLoop6 movf int,w xorlw b'00110000' btfsc STATUS,Z goto OnLoop4 call TEMPS movlw 0x44 ; Posa el valor (0100 0100) al registre W call A btfsc STATUS,Z goto OnLoop4 movf int,w xorlw b'10010000' btfsc STATUS,Z goto OnLoop3 OnLoop6 movf int,w xorlw b'10000000' btfsc STATUS,Z goto OnLoop7 movf int,w xorlw b'10010000' btfsc STATUS,Z goto OnLoop5 call TEMPS movlw 0x55 ;Posa el valor (0101 0101) al registre W call A btfsc STATUS,Z goto OnLoop5 movf int,w xorlw b'00110000' btfsc STATUS,Z goto OnLoop4 OnLoop7 movf int,w xorlw b'00100000' btfsc STATUS,Z goto OnLoop8 movf int,w xorlw b'00110000' btfsc STATUS,Z goto OnLoop6 call TEMPS movlw 0x11 ; Posa el valor (0001 0001) al registre W call A btfsc STATUS,Z goto OnLoop6 movf int,w xorlw b'10010000' btfsc STATUS,Z goto OnLoop5 OnLoop8 movf int,w xorlw b'10000000' btfsc STATUS,Z goto MainLoop movf int,w xorlw b'10010000' btfsc STATUS,Z goto OnLoop7 call TEMPS movlw 0x99 ; Posa el valor (1001 1001) al registre W call A btfsc STATUS,Z goto OnLoop7 movf int,w xorlw b'00110000' btfsc STATUS,Z goto OnLoop6 goto MainLoop ;Repetim-ho
TEMPS decfsz Delay1,f ; Decrementa la variable 1 ; si dona zero, no es fa la instrucció següent goto TEMPS ; Salta, excepte si el resultat ha estat zero decfsz Delay2,f ; Decrementa la variable 2 goto TEMPS ; Salta, excepte si el resultat ha estat zero return A movwf PORTC ; Copia el valor de W al port C movf Durada,w movwf Delay2 movf int,w xorlw b'10110000' return end

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