
#include<p16f628a.inc>
__CONFIG 3F10


;***************************************************************************
; Declaración de variables
;***************************************************************************

AUXW		EQU		0X20
AUXSTATUS	EQU		0X21
POSCABINA	EQU		0X22
PISO		EQU	 	0X23
CONT1	   	EQU		0X24
CONT2	   	EQU		0X25

ORG 0X00	goto		inicio   ;Inicio del programa 
ORG 0X04

;***************************************************************************
; Control de puerta 
;***************************************************************************
bcf	   	 INTCON,GIE	;Deshabilitamos Interrupciones		
bcf	   	 INTCON,INTF	;Avisamos al pic que atendemos la interrupción por RB0
movwf   	 AUXW        	;Guardamos en una variable Auxiliar el valor de W
movf		 STATUS,W   	;Cargamos el contenido del registro STATUS en W


movwf		 AUXSTATUS  	;Movemos el contenido de W al registro AUXSTATUS
bcf	    	 PORTB,1	;apagamos el motor
		
pta	
btfsc		 PORTB,0     	;Verificamos si la puerta de cabina está abierta 
goto		 pta		;1 puerta abierta, 0 puerta cerrada
bsf		 PORTB,1	;Prendemos motor
bsf		 INTCON,GIE     ;Concedemos el permiso de interrupciones 
movf   		 AUXSTATUS,W	;Cargamos el contenido del registro AUXSTATUS en W
movwf		 STATUS     	;Movemos el contenido de W al registro STATUS
movf		 AUXW,W     	;Cargamos el contenido del registro AUXW en W
retfie

;***************************************************************************
; Inicio del programa
;***************************************************************************

inicio
clrf	AUXW			; Inicializamos las variables
clrf	AUXSTATUS	    
clrf	POSCABINA	
clrf	PISO		
clrf	CONT1		
clrf	CONT2		

bsf 	INTCON,GIE		;Habilitación de Interrupciones Globales
bsf     INTCON,INTE		;Habilita interrupción por RB0
bsf 	STATUS, RP0		;Accedemos al Banco 1


movlw	b'01110001'		;
movwf	TRISB			; RB0 Puerta de cabina (Entrada)
				; RB1 Energía Motor (Salida)	1 Prende, 0 apaga
			        ; RB2 Dirección Motor (Salida) 1 SUBE, 0 BAJA
			        ; RB4 Pulsador Planta Baja (Entrada)
			        ; RB5 Pulsador Primer Piso (Entrada)
			        ; RB6 Pulsador Segundo Piso (Entrada)

movlw	b'00001110'             ;
movlw	TRISA			; RA1 Sensor Planta Baja(Entrada)
			        ; RA2 Sensor Primer Piso (Entrada)
				; RA3 Puerta de Cabina (Entrada)
bcf	STATUS, RP0	    	; Volvemos al Banco 0

;***************************************************************************
; Subrutina que al comenzar a funcionar el pic, envía la cabina a planta baja
;***************************************************************************

Comienzo 
btfsc 		PORTA, 1   	;Comprobamos si llego a planta baja
goto		parar
bsf       	PORTB,2         ;Dirección bajar
bsf      	PORTB,1         ;Prendemos Motor
goto		comienzo

parar	
bcf      	PORTB,1         ;Apagamos motor
movlw		.0              ;Cargo W con 0
movwf		POSCABINA       ;Muevo el contenido de W al registro POSCABINA



movlw		.0	        ;Cargo W con 0
movwf		PISO            ;Muevo el contenido de W al registro PISO
goto 		pulsadores



;***************************************************************************
; Pulsadores 
;***************************************************************************

pulsadores	
btfsc		PORTB,4		;Preguntamos por los pulsadores de Piso
call		delay		;Introducimos un delay para evitar el rebote
btfsc		PORTB,4			
call		plantabaja		
btfsc		PORTB,5		
call		delay
btfsc		PORTB,5	
call 		primerpiso
btfsc		PORTB,6
call		delay
btfsc   	PORTB,6
call		segundopiso
goto		pulsadores


;***************************************************************************
;Planta baja
;***************************************************************************

plantabaja

btfsc		PORTA,1 	;Verificamos si esta en planta baja
goto		pb
bsf    		PORTB,2		;Dirección 1 baja
bsf   		PORTB,1		;Prendemos motor

pb	
btfss		PORTA,1           ;Llego a destino?
goto		pb
bcf	  	PORTB,2	          ;Dejamos la dirección en subir
bcf	  	PORTB,1	          ;Apagamos motor
movlw		.0                ;Cargo W con 0
movwf		POSCABINA         ;Muevo el contenido de W al registro POSCABINA
movlw		.0	          ;Cargo W con 0
movwf		PISO              ;Muevo el contenido de W al registro PISO
return				

;***************************************************************************
;Primer piso
;***************************************************************************

primerpiso
movlw		.1	        ;Cargo W con 1
movwf		PISO        	;Cargamos con 1 a la variable PISO



btfsc		PORTA,2	   	 ;Verificamos si esta en primer piso
goto		pp
call 		direccion
pp		btfss PORTA,2 	;Llego a Destino?
gotopp
bcf     	PORTB,1  	 ;Apagamos motor
clrf		PISO		
movlw		0x01        	 ;Cargo W con 1
movwf		POSCABINA	 ;Cargamos la cabina con el numero del piso en el que esta
return

;***************************************************************************
; Segundo piso 
;***************************************************************************


segundopiso		
movlw		.2              ;Cargo W con 2
movwf		PISO	      	;Cargamos con 2 a la variable PISO
btfsc		PORTA,3   	;Verificamos si esta en Segundo Piso
goto 		sp
call 		direccion
sp		btfss PORTA,3   ;Llego a Destino?
goto 		sp
bcf		PORTB,1  	;Apagamos motor
clrf		PISO        
movlw		.2         	;Cargo W con 2
movwf		POSCABINA	;Cargamos CABINA con la posición del piso
return 


;***************************************************************************
; Dirección
;***************************************************************************

direccion
movfw		POSCABINA
subwf		PISO,W  	;Hacemos la resta entre piso y cabina
		         	; Si Z=1, la cabina esta en el mismo piso desde que se la llamo
btfsc		STATUS,Z
return
btfsc		STATUS,C	;Verificamos bit de carry
		           	; Si C=1, Piso es mayor que Cabina
                                ; Si C=0, Piso es menor que Cabina
goto		baja
goto		sube

baja	
bsf		PORTB,2	;Dirección Baja
bsf		PORTB,1	;Prendemos motor
return

sube		
bcf		PORTB,2	;Dirección Sube
bsf		PORTB,1 ;Prendemos motor
return



;***************************************************************************
;Delay anti-rebote 
;***************************************************************************

delay_1ms	
movlw 		.255  		 ;Cargo W con 255
movwf		CONT1  		 ;Muevo el contenido de W al registro CONT1
loop		decfsz 	CONT1,1  ;Decrementamos CONT1
goto		loop
return
delay
movlw 		.150       	 ;Cargo W con 150
movwf		CONT2 		 ;Muevo el contenido de W al registro CONT2

loop2
call		delay_1ms
decfsz		CONT2,1 	 ;Decrementamos CONT2
goto		loop2	
return
end
