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.
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
Visualit EQU 0x20 ; Una variable on guardem el que mostraran els LED
Bloqueig EQU 0x21 ; Variable que farà el bloqueig del programa
; Si val 1 es bloqueja
Retard1 EQU 0x22 ; Definim dues variables de comptatge
Retard2 EQU 0x23
PSECT code, class=CODE, delta=2, abs main: ; Adreça 0 h goto Inici ; Saltem al lloc on hi ha el programa principal nop ; Zona de memòria de programa que no utilitzem nop nop
Interrup: ; La funció d'interrupció no fa res retfie ; Torna al programa principal, on s'havia quedat
Inici:
bsf 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 11000000B ; Interrupció a l'activació
; I resistències de pull-up desactivades (valor per defecte)
movwf OPTION_REG ; Ho guarda al registre de configuració
bcf RP0 ; Tria el banc 0
bsf RP1 ; Tria el banc 2
clrf ANSEL ; Desactiva entrades analògiques
bcf 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 00001000B ; Activa el bit 3 al registre W
movwf Visualit ; Copia el valor de W a la variable Visualit
movlw 00010000B ; 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 CARRY ; 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 CARRY ; 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
bsf Bloqueig,0 ; Si s'ha premut, activa el bloqueig
btfss Bloqueig,0 ; S'ha activat?
goto Seguim ; Si ho és, continua
clrf PORTC ; Estalviem energia
sleep ; Passa a mode espera
clrf Bloqueig ; Desactivem el bloqueig
bcf INTF ; Desactiva la bandera de la interrupció externa
; Si no la desactivéssim ja no podríem tornar a entrar al mode d'espera
Seguim:
goto Bucle ; Repetim
; ; Funció de retard de 0,2 s ; RetM: decfsz Retard1,f goto RetM decfsz Retard2,f goto RetM return END main

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