	#include<p16f628a.inc>

			__CONFIG 3F10

AUXW		EQU		0X20
AUXSTATUS	EQU		0X21
POSCABINA	EQU		0X22
PISO		EQU 	0X23


		
		ORG 0X00

		goto	inicio
;****************control de puerta******************

		ORG 0X04
		bcf	    INTCON,GIE		;Deshabilitamos Interrupciones		
		bcf		INTCON,INTF		;Avisamos al pic que atendemos la interrupcion por RB0
		movwf   AUXW           	;Guardamos en una variable Auxiliar el valor de W
		movf	STATUS,W
		movwf	AUXSTATUS  
		
		bsf		PORTB,1			;apagamos el motor
		
pta		btfsc	PORTB,0			;Verificamos si la puerta de cabina esta abierta
		goto	pta				;1 puerta abierta, 0 puerta cerrada
	
		bcf		PORTB,1			;Prendemos motor
		bsf		INTCON,GIE
		movf    AUXSTATUS,w 	  
		movwf	STATUS            
		movf	AUXW,w
		  retfie

;*******************************************************

inicio

		clrf	AUXW			; Inicializamos las variables
		clrf	AUXSTATUS	
		clrf	POSCABINA	
		clrf	PISO		
				
			

		bsf 	INTCON,GIE		;Habilitacion de Interrupciones Globales
		bsf     INTCON,INTE		;Habilita interrupcion por por RB0
		bsf 	STATUS, RP0		;Accedemos al Banco 1
	
		movlw	b'01110001'		;
		movwf	TRISB			;RB0 Puerta de cabina (Entrada)
								;RB1 Energia Motor (Salida) 0 Prende, 1 apaga
								;RB2 Direccion Motor (Salida) 0 SUBE, 1 BAJA
								;RB4 Pulsador Planta Baja (Entrada)
								;RB5 Pulsador Primer Piso (Entrada)
								;RB6 Pulsador Segundo Piso (Entrada)
		movlw	b'11111111'
		movlw	TRISA			;RA0 Sensor Planta Baja	(Entrada)
								;RA1 Sensor Primer Piso	(Entrada)
								;RA2 Puerta de Cabina (Entrada)
		
		bcf		STATUS, RP0		;Volvemos al Banco 0
		goto 	start
;***************************************************************************
;Subrutina que al comenzar a funcionar el pic, envia la cabina a planta baja
;***************************************************************************
start
		bsf		PORTB,2 	   ;Direccion bajar
		bcf		PORTB,1		   ;Prendemos Motor
comienzo
		btfss 	PORTA,0        ;Comprobamos si llego a planta baja

		goto	comienzo
	
		bsf		PORTB,1		   ;Apagamos motor
	
		clrf	POSCABINA
		clrf	PISO	
		goto	pulsadores

;*************Pulsadores************************

pulsadores	
		btfsc	PORTB,4			;Preguntamos por los pulsadores de Piso
		call	rebote			;Introducimos un delay para evitar el rebote
		btfsc	PORTB,4			;
		call	plantabaja		;
		btfsc	PORTB,5		
		call	rebote
		btfsc	PORTB,5	
		call 	primerpiso
		btfsc	PORTB,6
		call	rebote
		btfsc   PORTB,6
		call	segundopiso
		goto	pulsadores

;*************Planta Baja********************
plantabaja
		bsf		PORTB,2		;Direccion 1 baja
		bcf		PORTB,1		;Prendemos motor

pb		btfss	PORTA,0 	;Verificamos si esta en planta baja
		goto	pb
	
	
		bcf		PORTB,2		;Dejamos la direccion en subir
		bsf		PORTB,1		;Apagamor motor
		clrf	POSCABINA
		clrf	PISO

		return				

;************Primer Piso**********************		
		
primerpiso
		movlw	0x01	
		movwf	PISO		;Cargamos con 1 a la variable PISO
	
		call 	direccion

pp		btfss	PORTA,1		;Llego a Destino?
		goto	pp

		bsf		PORTB,1		;Apagamos motor
		clrf	PISO		
		movlw	0x01
		movwf	POSCABINA		;Cargamos la cabina con el numero del piso en el que esta
		return

;*************Segundo Piso********************
segundopiso		
		movlw	0x02
		movwf	PISO		;Cargamos con 2 a la variable PISO
	
		call 	direccion

sp		btfss	PORTA,2		;Llego a Destino?
		goto	sp
	
		bsf		PORTB,1		;Apagamos motor
		clrf	PISO
		movlw	.2
		movwf	POSCABINA		;Cargamos CABINA con la posicion del piso
		return 

;************Direccion**********************

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		;Direccion Baja
		bcf		PORTB,1		;Prendemos motor
		return

sube		
		bcf		PORTB,2		;Direccion Sube
		bcf		PORTB,1 	;Prendemos motor
		return


;*******************************************************
;		ANTI REBOTE 
;*******************************************************
rebote	clrf	T1CON		;prescaler 1:1,osc:off,reloj interno:on,stop.
		movlw	0xb1		;configura el timer1 a 20ms
		movwf	TMR1H		
		movlw	0xdf		
		movwf	TMR1L
		bsf		T1CON,0		;arranca el timer
nada	btfss	PIR1,0		;verifica bandera de desbordamiento
		goto	nada			
		bcf		T1CON,0		;apaga el timer
		bcf		PIR1,0		;borro bandera de desbordamiento
		return	
			end