list p=16F873
include "P16F873.INC"
ORG 0
goto INICIO
ORG 4
goto INTERRUPCION
ORG 5
CONT EQU 0x21;creamos un contador para la puerta a la hora de abrirla
UP_DOWN EQU 0x22; registro de referencia subida
ESPERA EQU 0x23;para el tiempo que esta arriba
AUX EQU 0X24
;10001110111111
INICIO:
; CONFIGURACION DE LA ENTRADAS, SALIDAS y TMRs
bsf STATUS,RP0
bcf STATUS,RP1; banco 1
movlw b'10000110'
movwf ADCON1;Todas las entradas digitales
movlw b'11000000'
movwf TRISA; PUERTA A SALIDAS (RA0-RA4, 5 LEDs) y RA5 Entrada sin usar
movlw 0xFF
movwf TRISB; PUERTA B ENTRADA (RB0, pulsador, RB1-RB4, interruptores, RB5 optoacoplador)
movwf TRISC; PUERTA C Entradas sin usar
movlw .5
movwf CONT;inicializamos el valor del contador el valor de referencia máximo
movlw b'11000111'
movwf OPTION_REG
; INICIO DEL PROGRAMA
movlw b'00010000';configuramos las interrupciones
movwf INTCON
clrf PIE1
clrf PIR1
clrf PIE2
clrf PIR2
bcf STATUS,RP0; banco 0
movlw b'11000000'
movwf ADCON0;Modulo A/D desactivado
movlw b'00110000'
movwf T1CON
movlw b'01111111'
bsf T2CON,0
movwf T2CON
movlw .30; configuramos una espera de la puerta 30s arriba
movwf ESPERA
clrf PORTA
;bsf PORTA,5
;tras cargar la puerta entramos en modo sleep a la espera de la interrupción del pulsador RB0 q indica el inicio del proceso de apertura
bsf INTCON,GIE
DORMIR:
SLEEP
goto DORMIR
; BUCLE COMPROBACION DE LA CLAVE CORRECTA
BUCLE_CLAVE:
bcf INTCON,GIE
movf PORTC,0; Lleva lo que hay en los interruptores a W para comprobar si se ha introducido la clave correctamente
andlw b'00001111'
sublw b'00001100'; Comprueba la clave correcta 1100.(Introducir la clave correcta xxxx)
btfss STATUS,Z; bit 2 del registro STATUS
goto BUCLE_CLAVE
goto SUBIENDO; pasamos al encendido del motor y apertura de la puerta
SUBIENDO:
bsf PORTA,1
bcf PORTA,0;este es el codigo de apertura "10"
call DEC
ARRIBA:
bsf PORTA,0;codigo arriba "11"
bsf PORTA,4; encendemos la luz del garage
bsf PORTA,3;encendemos la luz verde del semáforo
bsf PORTA,5
call TIEMPO
BAJANDO:
bcf PORTA,1;codigo bajando "01"
bcf PORTA,3
call DEC
ABAJO:
clrf PORTA
; bsf PORTA,5
bcf INTCON,0
bcf INTCON,1
bcf INTCON,2
bsf INTCON,GIE
retfie;cuando ya ha bajado la ponemos en modo sleep
;estara un tiempo subiendo hasta el tope, eso lo simularemos mediante el decremento de un auxiliar que simboliza la cadena de la puerta, hasta que llega a 0
TIEMPO:
call DELAY1S
decfsz ESPERA,1
goto TIEMPO
return
DEC:
call PARPADEO_ON
decf CONT,1;decrementamos uno por uno el contador llamando despues al método de parpadeo del semáforo(led) con T=1s
call PARPADEO_ON
btfss STATUS,Z;chequeamos que el resultado del decremento sea 0
goto DEC; volvemos a decrementar si no es cero
movf UP_DOWN,0
return
; BUCLE PARPADEO DE LEDs 1seg ENCENDIDO 1seg APAGADO
PARPADEO_ON:
bsf PORTA,2; El led amarillo del semaforo encendido (LED ON)
call DELAY1S
bcf PORTA,2; El led amarillo del semaforo apagado (LED OFF)
call DELAY1S
return
DELAY1S:
movlw .100
movwf AUX
DELAY10ms:
movlw .40
bsf STATUS,RP0;banco 1
movwf PR2
bcf PIR1,TMR2IF
clrf TMR2
DELAY_AUX:
btfss PIR1,TMR2IF
goto DELAY_AUX
decfsz AUX
goto DELAY10ms
return
INTERRUPCION:
btfsc INTCON,INTF
goto BUCLE_CLAVE
retfie
END