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 funció 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ó, ja que la interrupció només la fem servir per despertar el microcontrolador; però sí cal desactivar el bit corresponent.
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8
unsigned char Visualit; // Variable on guardem el que mostraran els LED char Bloqueig; // Variable que farà el bloqueig del programa // Si no val 0 es bloqueja
void main (void){
TRISC = 0b00000000; // Posa el port C com a sortida
TRISA = 0b11111111; // Posa el port A com a entrada
OPTION_REG = 0b11000000; // Interrupció a l'activació
// I resistències de pull-up desactivades (valor per defecte)
ANSEL = 0; // Desactiva entrades analògiques
_delay(200000); // Fa un retard per evitar una mala lectura del polsador
Bloqueig = 0; // Inicialment el bloqueig està desactivat
Visualit = 0b00001000; // Activa el bit 3
INTCON = 0b00010000; // Activa la interrupció externa
// per poder despertar
while (1) { // Inici del bucle de programa
PORTC = Visualit; // Copiem el valor al port (als LED)
_delay(200000); // Retard
Visualit = (unsigned char) ((Visualit >> 1)|(Visualit << 7)); // Desplacem els bits a la dreta
if (Visualit == 128){ // Si hem rodat massa
Visualit = 0b00001000; // Activa el bit 3
}
if (RA3 == 0){ // Si es prem el polsador
Bloqueig = 1; // Activa el bloqueig
}
if (Bloqueig == 1){ // Si hi ha bloqueig
PORTC = 0; // Estalviem energia
SLEEP(); // Passa a mode espera
Bloqueig = 0; // Desactivem el bloqueig
INTCONbits.INTF = 0; // Desactivem l'indicador d'interrupció
}
}
}

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