La pota corresponent a l'entrada RA2 pot fer interrupcions si es configura convenientment. Cal, però, que la pota RA2 no estigui definida com a entrada analògica.
Per provar aquest exemple ens caldrà tenir un polsador convenientment connectat a l'entrada RA2. Si fem servir la placa de la matriu de vuit per vuit LED podem emprar els polsadors BTN1 o BTN2 per a aquesta aplicació.
Normalment es procura que les funcions d'interrupció siguin de ràpida execució. En aquest cas, però, hi posarem un retard per evitar que el microcontrolador detecti els rebots del polsador.
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 ; Zona de memòria de dades habitual Visualit ; Una variable on guardem el que mostraran els LED Retard1 ; Variable per al cicle de retard endc cblock 0x70 ; Zona de memòria de dades que no depèn del banc triat W_Copia ; Guardarà el contingut de W durant la interrupció ST_Copia ; Guardarà STATUS durant la interrupció 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
Interrup movwf W_Copia ; Copiem l'acumulador a W_Copia swapf STATUS,w ; Copiem STATUS a l'acumulador permutant els nibbles clrf STATUS ; Posa a 0 i així segur que el banc és el 0 movwf ST_Copia ; Guarda STATUS permutat a ST_Copia btfss INTCON,INTF ; Mira si la interrupció és externa ; Si hi ha arribat, no fa la instrucció següent goto FiInt ; Si la interrupció no és externa no fem res ; Només havíem activat les interrupcions externes ; Però, en general, és bo comprovar que l'origen ; de la interrupció és el que esperem Ext ; Programa corresponent a interrupció externa bcf INTCON,INTF ; Si ho és, desactivem el bit incf Visualit,f ; Incrementem Visualit btfsc Visualit,4 ; Mirem si s'ha activat el bit 4 clrf Visualit ; Posa Visualit a 0 call RetC ; Fa un retard per evitar rebots call RetC ; Fa un retard per evitar rebots call RetC ; Fa un retard per evitar rebots FiInt swapf ST_Copia,w ; Copia permutant ST_Copia a l'acumulador movwf STATUS ; I ho passa a STATUS recuperant el valor d'abans ; de la interrupció swapf W_Copia,f ; Permuta els bits de W_Copia swapf W_Copia,w ; Torna a permutar els bits de W_Copia ; i els guarda a l'acumulador sense variar STATUS retfie ; Torna al programa principal, on s'havia quedat
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 clrf Visualit ; Posa Visualit a 0 movlw b'10010000' ; Activem GIE i INTE movwf INTCON ; Activa les interrupcions globals i l'externa Bucle movf Visualit,w ; Copia Visualit a l'acumulador movwf PORTC ; I ho posa als LED goto Bucle ; Repetim-ho...
; ; Funció de retard de 0,8 ms ; RetC decfsz Retard1,f goto RetC return end
Quan provem el programa veurem que inicialment els LED estan apagats i van comptant cada cop que s'activa el polsador. Si posem a 0 el bit marcat en taronja el comptatge es farà quan es desactivi el polsador.

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