En aquest exemple volem implementar un comptador (que serà la variable Visualit) que incrementarem amb el polsador que porta la placa (entrada RA3). Els quatre bits inferiors del valor del comptador els mostrarem als LED; per tant els LED mostraran un nombre binari que s'anirà incrementant quan es premi el polsador.
Com farem un bucle que vagi mirant el polsador, no n'hi ha prou en mirar si el polsador està activat per incrementar el valor ja que el bucle és tan ràpid que el polsador podria estar premut en unes quantes iteracions seguides i el valor canviaria a salts. Per això en el programa següent esperem que es deixi anar el polsador per continuar.
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 ; Variable per al comptador que canvia els LED
PSECT code, class=CODE, delta=2, abs ; A l'inici de la memòria
main:
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
bcf RP0
clrf Visualit ; Posa la variable a valor zero
movf Visualit,w ; Copia el comptador a l'acumulador
movwf PORTC ; I ho posa als LED
Bucle:
btfsc PORTA,3 ; Mira si està desactivada l'entrada A3
; Si està desactivada, no fa la instrucció següent
; Fa la instrucció si l'entrada està activada
goto Bucle ; Si no està premut, ja estem
incf Visualit,f ; Si ho està, incrementa el valor del comptador
movf Visualit,w ; Copia el comptador a l'acumulador
movwf PORTC ; I ho posa als LED
btfss PORTA,3 ; Mira si està activada l'entrada A3
goto $-1 ; repetim la línia fins que es deixi el polsador
goto Bucle ; Repetim-ho...
END main
Si heu provat aquest programa, pot ser que en algun moment us hagi fallat i hagi saltat dos o tres valors de cop. Els polsadors i els interruptors tenen el problema que quan canvien d'estat els contactes reboten i, per això, sovint el microcontrolador no veu només una activació entrada sinó unes quantes. En el nostre cas, el polsador de la placa és força bo i rebota molt poc.
El que cal fer és assegurar-nos que l'estat és estable. El programa que hi ha més avall incorpora un filtre per no veure els rebots del polsador.
Si el polsador no funciona, assegureu-vos que heu marcat 3-State on 'Release from Reset' a la finestra de propietats del PICkit 2:

Quan activem aquesta casella li estem dient al programador que es desconnecti del microcontrolador quan acabi de programar. Aquesta desconnexió, però, no és instantània i això pot produir funcionaments inesperats en aquells programes que comprovin l'estat del polsador poc després de que s'iniciï el programa. Per evitar aquests problemes podem posar un retard (per exemple, un segon) entre les inicialitzacions i el tros del programa on es mira el polsador.
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
Polsador EQU 0x20 ; Una variable amb l'estat del polsador (1 = premut) Previ EQU 0x21 ; I una amb l'estat previ del polsador Visualit EQU 0x22 ; Una variable on guardem el que mostraran els LED Compta EQU 0x23 ; Una variable per comptar iteracions Retard1 EQU 0x24 ; Variable per al bucle de retard
PSECT code, class=CODE, delta=2, abs ; A l'inici de la memòria main: 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 bcf RP0 clrf Compta ; Posa el comptador d'iteracions a valor zero clrf Visualit ; Posa el comptador dels LED a valor zero clrf Previ ; L'estat previ del polsador és no premut clrf PORTC ; Comencem amb els LED apagats Bucle: movlw 00000001B movwf Polsador ; Activem polsador abans de comprovar btfsc PORTA,3 ; Mira si està desactivada l'entrada A3 ; Si desactivat (premut), no fa la instrucció següent clrf Polsador ; Si no està premut, desactiva polsador movf Previ,w ; Copia Previ a l'acumulador xorwf Polsador,w ; Compara Previ amb Polsador, si són iguals s'activa Z btfsc ZERO ; Si són iguals va a Final goto Esborra incf Compta,f ; Si són iguals, incrementa el valor de Compta movf Compta,w ; Copia Compta a l'acumulador xorlw 4 ; Comprova si val 4, si ho val s'activa Z btfss ZERO ; Si val 4 no fa la instrucció següent goto Final ; Si no era 4 va a Final movf Polsador,w ; Copia Polsador a W, si val 0 s'activa Z btfsc ZERO ; Si Polsador valia 1 (Z=0) no fa la instrucció següent goto Invert ; Si no està premut, ja estem incf Visualit,f ; Si ho està, incrementa el valor de Visualit movf Visualit,w ; Copia Visualit a l'acumulador movwf PORTC ; I ho posa als LED Invert: movf Previ,w ; Copia Previ a l'acumulador xorlw 00000001B ; Inverteix el valor movwf Previ ; I ho guarda a Previ Esborra: clrf Compta ; Posa el comptador d'iteracions a valor zero Final: ; Funció de retard 1 ms nop decfsz Retard1,f goto Final goto Bucle ; Repetim-ho... END main

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