En aquest exemple farem que el microcontrolador entri en mode d'espera i que després en pugui retornar. Mentre no entrem en el mode d'espera el microcontrolador farà una rotació de LED. Farem servir una variable Bloqueig que quan s'activi ens portarà a entrar en el mode d'espera. L'activació del mode d'espera la farem amb el polsador RA3. Quan s'activi prepararem la interrupció externa per poder-lo despertar i desactivarem els LED per estalviar energia. És molt important desactivar la variable Bloqueig just després de la instrucció sleep si no volem que es torni a posar immediatament en mode d'espera. La interrupció externa correspon a RA2, caldrà activar aquesta entrada per despertar el microcontrolador. Si fem servir la placa de la matriu de vuit per vuit LED podem emprar els polsadors BTN1 o BTN2 per a aquesta aplicació. Recordem, però, que cal tenir l'entrada analògica desactivada per tal que funcioni la interrupció.
En aquest cas no fem res a la funció d'interrupció (per tant no cal guardar W ni STATUS) ja que la interrupció només la fem servir per despertar el microcontrolador.
#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 ; Variable on guardem el que mostraran els LED Bloqueig ; Variable que farà el bloqueig del programa ; Si no val 0 es bloqueja endc
org 0 goto Inici ; Saltem al lloc on hi ha el programa principal nop ; Zona de memòria de programa que no utilitzem nop nop
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'11000000' ; Interrupció a l'activació ; I resistències de pull-up desactivades (valor per defecte) movwf OPTION_REG ; Ho guarda al registre de configuració bcf STATUS,RP0 ; Tria el banc 0 bsf STATUS,RP1 ; Tria el banc 2 clrf ANSEL ; Desactiva entrades analògiques bcf STATUS,RP1 ; Tria el banc 0 call RetM ; Fa un retard per evitar una mala lectura del polsador clrf Bloqueig ; Inicialment el bloqueig està desactivat movlw b'00001000' ; Activa el bit 3 al registre W movwf Visualit ; Copia el valor de W a la variable Visualit movlw b'00010000' ; Activem INTE, interrupció externa movwf INTCON ; per poder despertar Bucle movf Visualit,w ; Copia la variable Visualit sobre el registre W movwf PORTC ; Copia el valor de W al port C call RetM ; Fa un retard 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 btfss PORTA,3 ; Mira si s'ha premut el polsador incf Bloqueig,f ; Si s'ha premut incrementa i, per tant, força el bloqueig movf Bloqueig,f ; Copiem sobre ella mateixa per veure si és zero btfsc STATUS,Z ; És zero? goto Seguim ; Si ho és, continua clrf PORTC ; Estalviem energia sleep ; Passa a mode espera clrf Bloqueig ; Desactivem el bloqueig Seguim goto Bucle ; Repetim
; ; Funció de retard de 0,2 s ; RetM decfsz Retard1,f goto RetM decfsz Retard2,f goto RetM return end

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