En aquest exemple fem servir cinc polsadors connectats a una sola entrada per encendre els LED de la placa. En aquest cas l'entrada és AN2 (RA2). Agafem un rang de 10 cap a cada costat del valor teòric que correspon a cada polsador. Cada polsador encén el LED que li correspon i el P5 els encén tots.
El programa serà el següent:
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 ; Variable que conté un bit per a cada polsador per saber si està premut Retard1 EQU 0x21 ; Variable per al bucle de retard Retard2 EQU 0x22
PSECT code, class=CODE, delta=2, abs 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 TRISB ; Posa tots els bits del port B com a sortida clrf TRISC ; Posa tots els bits del port C com a sortida movlw 00010000B movwf ADCON1 ; Posa el conversor a 1/8 de la freqüència bcf RP0 bsf RP1 ; Tria el banc 2 movlw 00000100B movwf ANSEL ; Posa AN2 com entrada analògica bcf RP0 bcf RP1 ; Tria el banc 0 movlw 00001001B ; activa el conversor A/D connectat a AN2 movwf ADCON0 ; amb el resultat justificat per l'esquerra Bucle: call Llegir ; Llegeix els polsadors movf Polsador,w xorlw 00010000B ; Mirem si s'ha premut el 5 btfss ZERO ; Si és el 5, salta goto Diferents ; No és el 5 movlw 00001111B ; Encén tots els LED goto Encendre Diferents: movf Polsador,w ; Agafa el polsador actiu Encendre: movwf PORTC ; Ho copia al port C call Rets ; Espera 1 s goto Bucle ; i repetim-ho...
;
; Funció que llegeix els polsadors
;
Llegir:
clrf Polsador ; Si aquest valor no es canvia és que no hi ha cap polsador premut
nop ; espera un microsegon
nop ; espera un microsegon
nop ; espera un microsegon
nop ; espera un microsegon
nop ; espera un microsegon
bsf GO_DONE ; Inicia la conversió
btfsc GO_DONE ; Quan el bit sigui 0 la conversió haurà acabat
goto $-1 ; repetim la línia fins que deixi de ser 0
; Comparació P1
movlw 220 ; Límit superior de P1
subwf ADRESH,w ; W = ADRESH - W
btfsc CARRY ; C = 1 si ADRESH >= W
goto NoEsP1 ; ADRESH >= W
movlw 200 ; Límit inferior de P1
subwf ADRESH,w ; W = ADRESH - W
btfss CARRY ; C = 1 si ADRESH >= W
goto NoEsP1 ; ADRESH < W
movlw 00000001B ; Polsador P1
movwf Polsador ; Ho copia a Polsador
goto NoEsP5
NoEsP1: ; Comparació P2
movlw 194 ; Límit superior de P2
subwf ADRESH,w ; W = ADRESH - W
btfsc CARRY ; C = 1 si ADRESH >= W
goto NoEsP2 ; ADRESH >= W
movlw 174 ; Límit inferior de P2
subwf ADRESH,w ; W = ADRESH - W
btfss CARRY ; C = 1 si ADRESH >= W
goto NoEsP2 ; ADRESH < W
movlw 00000010B ; Polsador P2
movwf Polsador ; Ho copia a Polsador
goto NoEsP5
NoEsP2: ; Comparació P3
movlw 163 ; Límit superior de P3
subwf ADRESH,w ; W = ADRESH - W
btfsc CARRY ; C = 1 si ADRESH >= W
goto NoEsP3 ; ADRESH >= W
movlw 143 ; Límit inferior de P3
subwf ADRESH,w ; W = ADRESH - W
btfss CARRY ; C = 1 si ADRESH >= W
goto NoEsP3 ; ADRESH < W
movlw 00000100B ; Polsador P3
movwf Polsador ; Ho copia a Polsador
goto NoEsP5
NoEsP3: ; Comparació P4
movlw 90 ; Límit superior de P4
subwf ADRESH,w ; W = ADRESH - W
btfsc CARRY ; C = 1 si ADRESH >= W
goto NoEsP4 ; ADRESH >= W
movlw 70 ; Límit inferior de P4
subwf ADRESH,w ; W = ADRESH - W
btfss CARRY ; C = 1 si ADRESH >= W
goto NoEsP4 ; ADRESH < W
movlw 00001000B ; Polsador P4
movwf Polsador ; Ho copia a Polsador
goto NoEsP5
NoEsP4: ; Comparació P5
movlw 55 ; Límit superior de P5
subwf ADRESH,w ; W = ADRESH - W
btfsc CARRY ; C = 1 si ADRESH >= W
goto NoEsP5 ; ADRESH >= W
movlw 35 ; Límit inferior de P5
subwf ADRESH,w ; W = ADRESH - W
btfss CARRY ; C = 1 si ADRESH >= W
goto NoEsP5 ; ADRESH < W
movlw 00010000B ; Polsador P5
movwf Polsador ; Ho copia a Polsador
NoEsP5:
return
Rets: ; Funció de retard d'1 s
Bucles:
decfsz Retard1,f
goto Bucles
decfsz Retard2,f
goto Bucles
return
END main

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