	list	P=16F84A	
	include	P16F84A.INC	
			
	cblock	0x0C	
	ev		; estado de ventiladores
	el		; estado de luces
	endc		
			
	org	0	; en el arranque
	goto	inicio	; va a inicio
	org	4	; si hay interrupcion
	goto	interrpuertob	; va a interrpuertob
			
interrpuertob			; subrutina de interrupciones
	bcf	INTCON,7	; inhabilito momentaneamente las interrupciones, borrando el bit 7 de INTCON
	btfsc	INTCON,0	; no fue interrupcion por entrada en PUERTO B4-B7 (RBIF)? Salta un renglon
	call	sensores	; entonces como fue por interrupcion de RBIF (B4-B7), anda a sensores
	btfsc	INTCON,1	; no fue interrupcion por entrada en PUERTO B0 (RB0/INTF)? Salta un renglon
	call	botones	; entonces como fue por interrupcion de RB0/INTF (B0), anda a botones
fininit	btfsc	PORTB,0	; espero la liberacion del boton
	goto	finint	; vuelvo para seguir esperando la liberacion del boton RB0
	bsf	INTCON,7	; rehabilito las interrupciones, prendiendo el bit 7 de INTCON
	retfie		; salgo de las interrupciones
			
sensores			; subrutina de interrupcion por ingreso de sensores (RB4-RB7) para encender o apagar luces o ventiladores, según necesidad
	btfsc	PORTB,4	; no fue boton 4 del puerto B el presionado? Entonces salta un renglon
	call	luzautoon	; si, fue el 4. entonces anda a prender las luces
	btfsc	PORTB,5	; no fue boton 5 del puerto B el presionado? Entonces salta un renglon
	call	luzautooff	; si, fue el 5. entonces anda a apagar las luces
	btfsc	PORTB,6	; no fue boton 6 del puerto B el presionado? Entonces salta un renglon
	call	venautoon	; si, fue el 6. entonces anda a prender los ventiladores
	btfsc	PORTB,7	; no fue boton 7 del puerto B el presionado? Entonces salta un renglon
	call	venautooff	; si, fue el 7. entonces anda a apagar los ventiladores
	return		
			
botones			; subrutina de interrupcion por ingreso de boton RB0 (junto a RB2 o RB3), para alterar los estados de luces o ventiladores
	btfsc	PORTB,2	; no fue boton 2 del puerto B el presionado? Entonces salta un renglon
	call	luces	; si, fue el 2 (JUNTO AL 0 que llamo al PIC). entonces vamos a maniobrar las luces
	btfsc	PORTB,3	; no fue boton 3 del puerto B el presionado? Entonces salta un renglon
	call	ventis	; si, fue el 3 (JUNTO AL 0 que llamo al PIC). entonces vamos a maniobrar los ventiladores
	return		
			
luzautoon			; inicializacion modo automatico, con luces encendidas
	bsf	PORTA,4	; prendo las luces
	bsf	STATUS,RP0	; paso al banco 1
	bcf	TRISB,4	; pongo a la pata 4 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
	bsf	TRISB,5	; pongo a la pata 5 de B en 1 (entrada) para que active el sistema si hay que apagar las luces en modo automatico
	bcf	STATUS,RP0	; vuelvo al banco 0
	return		
			
luzautooff			; inicializacion modo automatico, con luces apagadas
	bcf	PORTA,4	; apago las luces
	bsf	STATUS,RP0	; paso al banco 1
	bsf	TRISB,4	; pongo a la pata 4 de B en 1 (entrada) para que active el sistema si hay que encender las luces en modo automatico
	bcf	TRISB,5	; pongo a la pata 5 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
	bcf	STATUS,RP0	; vuelvo al banco 0
	return		
			
venautoon			; inicializacion modo automatico, con ventiladores encendidos
	bsf	PORTB,1	; prendo los ventiladores
	bsf	STATUS,RP0	; paso al banco 1
	bcf	TRISB,6	; pongo a la pata 4 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
	bsf	TRISB,7	; pongo a la pata 5 de B en 1 (entrada) para que active el sistema si hay que apagar las luces en modo automatico
	bcf	STATUS,RP0	; vuelvo al banco 0
	return		
			
venaoutooff			; inicializacion modo automatico, con ventiladores apagados
	bcf	PORTB,1	; apago los ventiladores
	bsf	STATUS,RP0	; paso al banco 1
	bsf	TRISB,6	; pongo a la pata 4 de B en 1 (entrada) para que active el sistema si hay que encender las luces en modo automatico
	bcf	TRISB,7	; pongo a la pata 5 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
	bcf	STATUS,RP0	; vuelvo al banco 0
	return		
			
luces			; subrutinas de eventos según los estados de las luces
	incf	el,F	; paso al proximo estado de las luces
	movf	el,W	; paso el valor de el a W
	sublw	1	; resto 1-W (valor queda en W)
	btfsc	STATUS,2	; si la resta no fue cero, salto un renglon
	call	luzmanon	; la resta fue cero, va a la subrutina luces manual encendido
	movf	el,W	; paso el valor de el a W
	sublw	2	; resto 2-W (valor queda en W)
	btfsc	STATUS,2	; si la resta no fue cero, salto un renglon
	call	luzauto	; la resta fue cero, va a la subrutina luces automatico
	movf	el,W	; paso el valor de el a W
	sublw	3	; resto 1-W (valor queda en W)
	btfsc	STATUS,2	; si la resta no fue cero, salto un renglon
	call	luzmanoff	; la resta fue cero, va a la subrutina ventilador manual apagado
	return		
			
luzmanon			; inicializacion de encendido manual de luces
	bsf	PORTA,0	;
	bcf	PORTA,1	; junto al renglon anterior, enciendo uno de los colores de led de salida: estado encendido manual
	bsf	PORTA,4	; prendo las luces
	bsf	STATUS,RP0	; paso al banco 1
	bcf	TRISB,4	; pongo a la pata 4 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
	bcf	TRISB,5	; pongo a la pata 5 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
	bcf	STATUS,RP0	; vuelvo al banco 0
	return		
			
luzauto			; inicializacion de luces automaticas. Se fija en el estado en el que esta la solicitud de luz, y la enciende o apaga
	bcf	PORTA,0	;
	bsf	PORTA,1	; junto al renglon anterior, enciendo uno de los colores de led de salida: estado encendido automatico
	btfsc	PORTB,4	; solo me fijo si necesita luz, cualquier otro estado queda en automatico con las luces apagadas
	goto	luzonini	; si  necesita (pata 4 del puerto B esta en 1, pidiendo luz), salto la llamada a la subrutina de encendido
luzoffini	call	luzautooff	; voy a la subrutina de apagado, por estar la pata 4 del puerto B en 0 (no esta pidiendo luz)
	goto	salluzauto	; apagados las luces, salto el renglon, donde se hace la llamada a encendido de luces
luzonini	call	luzautoon	; llego hasta aca con el goto de 3 renglones arriba, para encender las luces
salluzauto	return		
			
			
luzmanoff			; inicializacion de apagado manual de luces
	bcf	PORTA,0	;
	bcf	PORTA,1	; junto al renglon anterior, apago el led bicolor: estado apagado manual
	bcf	PORTA,4	; apago las luces
	bsf	STATUS,RP0	; paso al banco 1
	bcf	TRISB,4	; pongo a la pata 4 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
	bcf	TRISB,5	; pongo a la pata 5 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
	bcf	STATUS,RP0	; vuelvo al banco 0
	return		
			
			
ventis			; subrutinas de eventos según los estados de los ventiladores
	incf	ev,F	; paso al proximo estado de las luces
	movf	ev,W	; paso el valor de ev a W
	sublw	1	; resto 1-W (valor queda en W)
	btfsc	STATUS,2	; si la resta no fue cero, salto un renglon
	call	venmanon	; la resta fue cero, va a la subrutina ventilador manual encendido
	movf	ev,W	; paso el valor de ev a W
	sublw	2	; resto 2-W (valor queda en W)
	btfsc	STATUS,2	; si la resta no fue cero, salto un renglon
	call	venauto	; la resta fue cero, va a la subrutina ventilador automatico
	movf	ev,W	; paso el valor de ev a W
	sublw	3	; resto 1-W (valor queda en W)
	btfsc	STATUS,2	; si la resta no fue cero, salto un renglon
	call	venmanoff	; la resta fue cero, va a la subrutina ventilador manual apagado
	return		
			
venmanon			; inicializacion de encendido manual de ventiladores
	bsf	PORTA,2	;
	bcf	PORTA,3	; junto al renglon anterior, enciendo uno de los colores de led de salida: estado encendido manual
	bsf	PORTB,1	; prendo los ventiladores
	bsf	STATUS,RP0	; paso al banco 1
	bcf	TRISB,6	; pongo a la pata 6 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
	bcf	TRISB,7	; pongo a la pata 7 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
	bcf	STATUS,RP0	; vuelvo al banco 0
	return		

venauto			; inicializacion de ventiladores automaticos. Se fija en el estado en el que esta la solicitud de ventilacion, y los enciende o apaga
	bcf	PORTA,2	;
	bsf	PORTA,3	; junto al renglon anterior, enciendo uno de los colores de led de salida: estado encendido automatico
	btfsc	PORTB,6	; solo me fijo si necesita ventilacion, cualquier otro estado queda en automatico con los ventiladores apagados
	goto	venonini	; si  necesita (pata 6 del puerto B esta en 1, pidiendo ventilacion), salto la llamada a la subrutina de encendido
venoffini	call	venaoutooff	; voy a la subrutina de apagado, por estar la pata 6 del puerto B en 0 (no esta pidiendo ventilacion)
	goto	salvenauto	; apagados los ventiladores, salto el renglon, donde se hace la llamada a encendido de ventiladores
venonini	call	venaoutoon	; llego hasta aca con el goto de 3 renglones arriba, para encender los ventiladores
salvenauto	return		

venmanoff			; inicializacion de apagado manual de ventiladores
	bcf	PORTA,2	;
	bcf	PORTA,3	; junto al renglon anterior, apago el led bicolor: estado apagado manual
	bcf	PORTB,1	; apago los ventiladores
	bsf	STATUS,RP0	; paso al banco 1
	bcf	TRISB,6	; pongo a la pata 4 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
	bcf	TRISB,7	; pongo a la pata 5 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
	bcf	STATUS,RP0	; vuelvo al banco 0
	return		
			
inicio	bsf	STATUS,RP0	; paso al banco 1
	movlw	b'11111101'	; configuro al puerto b:EEEEEESE
	movwf	TRISB	; configuro al puerto b
	clrf	TRISA	; configuro al puerto a todo de salida
	bcf	STATUS,RP0	; paso al banco 0
	clrf	PORTA	; pongo en 0 al puerto a
	clrf	PORTB	; pongo en 0 al puerto b
	movlw	b'10011000'	; configuracion interrupciones. Habilita general y habilita por RB0 y PORT B (4-7)
	movwf	INTCON	; configuracion interrupciones
	clrf	ev	; estado inicial de los ventiladores: 0, apagados
	clrf	el	; estado inicial de las luces: 0, apagadas
			
dormir	nop		; bucle esperando interrupciones
	goto	dormir	
