Programació en pic-as del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Exemple PA - Diversos polsadors connectats a una sola entrada

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

 

 

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