; CONTROL LAVARROPAS AUTOMÁTICO REVISIÓN #2.1
; =========================================
;

; Rev. 02.1 // 05-MAR-2015 // Se agrega a Rev.02 salida para relé capacitor inversión giro Motor Lavado 
;
cprog   	equ 0x02        		;contador de programa (parte baja)
estado  	equ 0x03        		;Registro de estados del micro
ptoa    	equ 0x05        		;Puertos de E/S
ptob    	equ 0x06
ptoc    	equ 0x07
intcon  	equ 0x0B        		;Control de interrupciones
tiempo1 	equ 0x20        		;Usados para temporizar
tiempo2 	equ 0x21
tiempo3 	equ 0x22
veces   	equ 0x23
display 	equ 0x24        		;Resguarda el numero mostrado en el display
general 	equ 0x25
tout1   	equ 0x26        		;Usadas para el timeout de carga y descarga de agua
tout2   	equ 0x27
backw   	equ 0x28        		;Back-up de W al interrumpir

#define 	CERO    	estado, 2   ;Bit indicador de resultado cero
#define 	RP0 		estado, 5   ;Bit de selección de página de memoria
#define 	GIE 		intcon, 7   ;Bit de habilitación de las interrupciones
#define 	SELECT  	ptoa, 	0   ;Entrada de selección de programa
#define 	START   	ptoa, 	1   ;Entrada de inicio del proceso
#define 	MEDIA   	ptoa, 	2   ;Entrada de la llave de media carga
#define 	NOCENT  	ptoa, 	3   ;Entrada de la llave de exclusión de centrifugado
#define 	PRES50  	ptoa, 	4   ;Entrada del presostato a media carga
#define 	PRES100 	ptoa, 	5   ;Entrada del presostato a carga completa
#define 	BUZZER  	ptob, 	7   ;Control del parlante piezo
#define 	MOTFAST 	ptob, 	6   ;Motor a alta velocidad
#define 	RELECAPA 	ptob, 	5   ;Relé capacitor cambio giro
#define 	MOTSLOWD  	ptob, 	4   ;Motor a baja velocidad
#define 	VALVULA 	ptob, 	3   ;Entrada de agua (electroválvula)
#define 	BOMBA   	ptob, 	2   ;Bomba de desagote
#define 	SERVO   	ptob, 	1   ;Pulsos de control del servo selector de producto
#define 	PAUSA   	general,0  	;Indica que entre programa y programa haga una pausa
#define 	ENTRA   	general,1  	;Indica si esta en modo carga (1) /descarga (0) de agua

    		goto    	INICIO      ;Saltea la tabla del display

    		org 0x04        		;Vector de interrupcion
    		movwf   	backw       ;Guarda W
    		incfsz 		tout1, 1    ;Suma 1 a TimeOut 1
    		goto    	SALEINT     ;Si no llego a dar la vuelta sale
    		incf    	tout2, 1    ;Suma 1 a TimeOut 2
    		movf    	tout2, 0    ;Controla si llego a 17 (aprox. 10 min)
    		sublw   	d'34'
    		btfss   	CERO
    		goto    	SALEINT     ;Si no llego a cinco minutos sale
	 		bcf 		VALVULA     ;Apaga la electroválvula de entrada de agua
    		bcf 		BOMBA       ;Apaga la bomba de desagüe
    		bcf 		MOTFAST     ;Apaga el Motor Centrifugado
    		bcf 		RELECAPA    ;Apaga el Motor Lavado
			bcf			MOTSLOWD	;Apaga el Motor

FALLA   	movlw   	d'11'
    		call    	TABLA
   	 		movwf   	ptoc
    		bsf 		BUZZER
    		call    	DELOFF
    		bcf 		BUZZER
    		call    	DEL250
    		movlw   	d'1'        ;Muestra E2 en el display
    		btfss   	ENTRA
    		movlw   	d'2'        ;Muestra E2 en el display
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		BUZZER
    		call    	DELOFF
    		bcf 		BUZZER
    		call    	DEL250
    		goto    	FALLA

SALEINT 	movlw   	b'10100000' ;Restablece las interrupciones
    		movwf   	intcon
    		movf    	backw, 0    ;Restablece W
    		retfie
    
TABLA   	addwf   	cprog, 1    ;Genera los números y caracteres en el display
    		retlw   	b'00111111' ; 0
    		retlw   	b'00000110' ; 1
    		retlw   	b'01011011' ; 2
    		retlw   	b'01001111' ; 3
    		retlw  	 	b'01100110' ; 4
    		retlw   	b'01101101' ; 5
    		retlw   	b'01111101' ; 6
    		retlw   	b'00000111' ; 7
    		retlw   	b'01111111' ; 8
    		retlw   	b'01101111' ; 9
    		retlw   	b'01000000' ; - (10)
    		retlw   	b'01111001' ; E (11)
    		retlw   	b'01110001' ; F (12)
    		retlw   	b'01110011' ; P (13)
    
INICIO  	clrf    	ptoa        ;Arranca con todo apagado
    		clrf    	ptob
    		clrf    	ptoc
    		clrf    	general     ;Flags en cero
    
    		bsf 		RP0     ;configura los pines de E/S
    		movlw   	b'00000110'
    		movwf   	0x1F
    		movlw   	b'00111111'
    		movwf   	ptoa
    		clrf    	ptob
    		clrf    	ptoc
    		movlw   	b'00100000' ;Establece las interrupciones
    		movwf   	intcon
    		movlw   	b'11010111' ;Asigna a TMR0 el predivisor a 256 y toma osc. desde XT
    		movwf   	0x01
    		bcf 		RP0

    		movlw   	d'10'       ;Coloca el '-' en el display durante 5 segundos
    		call    	TABLA
    		movwf   	ptoc
    		movlw   	d'10'
    		movwf   	tiempo3
    		bsf 		ptoc, 7     ;Hace destellar el punto del display
    		call    	DEL250
    		bcf 		ptoc, 7     ;Hace destellar el punto del display
    		call    	DEL250
    		btfss   	START       ;Entra en modo pausa al presionar cualquier pulsador durante el -
    		goto    	SETPAP      ;Acciona el mecanismo paso a paso
    		btfss   	SELECT
    		goto    	SETPAP      ;Acciona el mecanismo paso a paso
    		decfsz  	tiempo3, 1
    		goto    	$ -9
    		goto    	AUTOM       ;Saltea la sección donde coloca la 'P'
    
SETPAP  	movlw   	d'13'       ;Coloca la P en el display
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		PAUSA       ;Acciona el flag de Paso a Paso
    		call    	BEEP
    		call    	DEL250
    		btfss   	SELECT      ;Espera que suelte ambos pulsadores
    		goto    	$ -2
    		btfss   	START
    		goto    	$ -4
    
AUTOM   	bsf 		GIE     ;Activa el sistema de time-out de descarga
    		bcf 		ENTRA
    		clrf    	tout1       ;Inicializa los contadores de timeout
    		clrf    	tout2
    		btfsc   	PRES50      ;Si hay agua en el tanque desagota totalmente
    		goto    	SEL1C
    		movlw   	d'11'       ;Coloca el 'E' en el display
    		call    	TABLA
    		movwf   	ptoc
    		call    	BEEP
    		call    	DEL250
    		call    	BEEP
    		call    	DEL250
    		call    	BEEP
    		bsf 		BOMBA       ;Enciende la bomba de desagote
    		btfss   	PRES50      ;Espera que el presostato indique tanque vacío
    		goto    	$ -1
    		call    	DIEZSEG
    		call    	DIEZSEG
    		bcf 		BOMBA       ;Desconecta la bomba
    		bcf 		GIE     ;Desactiva el sistema de timeout
    
SEL1C   	movlw   	d'1'        ;Arranca en programa corto 1
    		call    	TABLA
    		movwf   	ptoc
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL2C
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START1C
    		goto    	$ -4
SEL2C   	movlw   	d'2'        ;Programa corto 2
    		call    	TABLA
    		movwf   	ptoc
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL3C
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START2C
    		goto    	$ -4
SEL3C   	movlw   	d'3'        ;Programa corto 3
    		call    	TABLA
    		movwf   	ptoc
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL4C
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START3C
    		goto    	$ -4
SEL4C   	movlw   	d'4'        ;Programa corto 4
    		call    	TABLA
   			movwf   	ptoc
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL5C
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START4C
    		goto    	$ -4
SEL5C  		movlw   	d'5'        ;Programa corto 5
    		call    	TABLA
    		movwf   	ptoc
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL6C
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START5C
    		goto    	$ -4
SEL6C   	movlw   	d'6'        ;Programa corto 6
    		call    	TABLA
    		movwf   	ptoc
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL1L
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START6C
    		goto    	$ -4

SEL1L   	movlw   	d'1'        ;Programa largo 1
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto decimal del display
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL2L
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START1L
    		goto    	$ -4
SEL2L   	movlw   	d'2'        ;Programa largo 2
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto decimal del display
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL3L
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START2L
    		goto    	$ -4
SEL3L   	movlw   	d'3'        ;Programa largo 3
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto decimal del display
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL4L
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START3L
    		goto    	$ -4
SEL4L   	movlw   	d'4'        ;Programa largo 4
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto decimal del display
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL5L
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START4L
    		goto    	$ -4
SEL5L   	movlw   	d'5'        ;Programa largo 5
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto decimal del display
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL6L
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START5L
    		goto    	$ -4
SEL6L   	movlw   	d'6'        ;Programa largo 6
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto decimal del display
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL7L
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START6L
    		goto    	$ -4
SEL7L   	movlw   	d'7'        ;Programa largo 7
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto decimal del display
    		call    	BEEP
    		call    	DEL250      ;Evita repeticiones por pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		btfss   	SELECT      ;Controla el pulsador para cambiar de programa
    		goto    	SEL1C
    		btfss   	START       ;Controla el pulsador para iniciar el programa
    		goto    	START7L
    		goto    	$ -4

START1C 	call    	BEEP
    		call    	BOX1        ;Selecciona la carga de agua por el box 1 jabón
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'38'        ;Ejecuta un ciclo de lavado de 12 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START2C 	call    	BEEP
    		movlw   	d'2'        ;Muestra el 2 en el display
    		call    	TABLA
    		movwf   	ptoc
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE2C
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -7
SIGUE2C 	call    	BOX2        ;Selecciona la carga de agua por el box 4 jabón
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'38'        ;Ejecuta un ciclo de lavado de 12 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START3C 	call    	BEEP
    		movlw   	d'3'        ;Muestra el 3 en el display
    		call    	TABLA
    		movwf   	ptoc
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE3C
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -7
SIGUE3C 	call    	BOX2        ;Selecciona la carga de agua por el box 2 jabón
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'38'        ;Ejecuta un ciclo de lavado de 12 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START4C 	call    	BEEP
    		movlw   	d'4'        ;Muestra el 4 en el display
    		call    	TABLA
    		movwf  	 	ptoc
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE4C
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -7
SIGUE4C 	call    	BOX3        ;Selecciona la carga de agua por el box 2 jabón
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'24'       ;Ejecuta un ciclo de lavado de 8 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START5C 	call    	BEEP
    		movlw   	d'5'        ;Muestra el 5 en el display
    		call    	TABLA
    		movwf   	ptoc
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE5C
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -7
SIGUE5C 	call    	BOX4        ;Selecciona la carga de agua por el box 3 enjuagüe
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'38'       ;Ejecuta un ciclo de lavado de 12 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START6C 	call    	BEEP
    		movlw   	d'6'        ;Muestra el 6 en el display
    		call    	TABLA
    		movwf   	ptoc
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE6C
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -7
SIGUE6C 	call    	CENTRIF     ;Centrifugado
    		movlw   	d'12'       ;Coloca la 'F' en el display
    		call    	TABLA
    		movwf   	ptoc
    		call    	BEEPFIN     ;Hace tres beep's largos
    		btfsc   	SELECT      ;Espera que presione el pulsador
    		goto    	$ -1
    		movlw   	d'10'       ;Coloca el '-' en el display
    		call    	TABLA
    		movwf   	ptoc
    		call    	DEL250      ;Previene rebotes en pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		goto    	SEL1C       ;Vuelve al comienzo del programa 1 corto

START1L 	call    	BEEP
    		call    	BOX1        ;Selecciona la carga de agua por el box 1 jabón
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'38'        ;Ejecuta un ciclo de lavado de 12 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START2L 	call    	BEEP
    		movlw   	d'2'        ;Muestra el 2 en el display
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto del display
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE2L
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -8
SIGUE2L 	call    	BOX1        ;Selecciona la carga de agua por el box 1 jabón
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'38'       ;Ejecuta un ciclo de lavado de 12 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START3L 	call    	BEEP
    		movlw   	d'3'        ;Muestra el 3 en el display
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto del display
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE3L
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -8
SIGUE3L 	call    	BOX2        ;Selecciona la carga de agua por el box 2 jabón
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'38'       ;Ejecuta un ciclo de lavado de 12 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START4L 	call    	BEEP
    		movlw   	d'4'        ;Muestra el 4 en el display
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto del display
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE4L
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -8
SIGUE4L 	call    	BOX2        ;Selecciona la carga de agua por el box 2 jabón
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'24'       ;Ejecuta un ciclo de lavado de 8 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START5L 	call    	BEEP
    		movlw   	d'5'        ;Muestra el 5 en el display
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto del display
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE5L
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -8
SIGUE5L 	call    	BOX3        ;Selecciona la carga de agua por el box 2 jabón
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'38'       ;Ejecuta un ciclo de lavado de 15 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START6L 	call    	BEEP
    		movlw   	d'6'        ;Muestra el 5 en el display
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto del display
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE6L
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -8
SIGUE6L 	call    	BOX4        ;Selecciona la carga de agua por el box 3 enjuagüe
    		call    	CARGAR      ;Carga agua en el tanque
    		movlw   	d'38'       ;Ejecuta un ciclo de lavado de 12 min.
    		call    	LAVAR
    		call    	VACIAR      ;Desagota el tanque

START7L 	call    	BEEP
    		movlw   	d'7'        ;Muestra el 7 en el display
    		call    	TABLA
    		movwf   	ptoc
    		bsf 		ptoc, 7     ;Enciende el punto del display
    		btfss   	PAUSA       ;Si esta pausado...
    		goto    	SIGUE7L
    		btfsc   	START       ;Espera que presione el pulsador
    		goto    	$ -8
SIGUE7L 	call    	CENTRIF     ;Centrifugado
    		movlw   	d'12'       ;Coloca la 'F' en el display
    		call    	TABLA
    		movwf   	ptoc
    		call    	BEEPFIN     ;Hace tres beep's largos
    		btfsc   	SELECT      ;Espera que presione el pulsador
    		goto    	$ -1
    		movlw   	d'10'       ;Coloca el '-' en el display
    		call    	TABLA
    		movwf   	ptoc
    		call    	DEL250      ;Previene rebotes en pulsadores garcha
    		btfss   	SELECT      ;Espera que suelte el pulsador
    		goto    	$ -2
    		goto    	SEL1L       ;Vuelve al comienzo del programa 1 corto

BOX1    	movlw   	d'40'       ;Selecciona el casillero 1 de jabón
    		movwf   	tiempo3
    		bsf 		SERVO
    		movlw   	d'115'
    		call    	DELON
    		bcf 		SERVO
    		call    	DELOFF
    		decfsz  	tiempo3, 1
    		goto    	$ -6
    		return

BOX2    	movlw   	d'40'       ;Selecciona el casillero 2 de jabón
    		movwf   	tiempo3
    		bsf 		SERVO
    		movlw   	d'100'
    		call    	DELON
    		bcf 		SERVO
    		call    	DELOFF
    		decfsz  	tiempo3, 1
    		goto    	$ -6
    		return

BOX3    	movlw   	d'40'       ;Selecciona el casillero de enjuague
    		movwf   	tiempo3
    		bsf 		SERVO
    		movlw   	d'81'
    		call    	DELON
    		bcf 		SERVO
    		call    	DELOFF
    		decfsz  	tiempo3, 1
    		goto    	$ -6
    		return

BOX4    	movlw   	d'40'       ;(Selecciona el casillero de lavandina
    		movwf   	tiempo3
    		bsf 		SERVO
    		movlw   	d'55'
    		call    	DELON
    		bcf 		SERVO
    		call    	DELOFF
    		decfsz  	tiempo3, 1
    		goto    	$ -6
    		return

CARGAR  	bsf 		GIE     ;Activa el sistema de time-out de carga
    		bsf 		ENTRA
    		clrf    	tout1       ;Inicializa los contadores de timeout
    		clrf    	tout2
CARGA   	bsf 		VALVULA     ;Conecta la electroválvula
    		btfsc   	MEDIA       ;Verifica si debe cargar a media o completo
    		goto    	MITAD
    		btfss   	PRES100     ;Mira el presostato a 100%
    		goto    	LLENO       ;Si se lleno termina la carga
    		goto    	CARGA       ;Si no se lleno espera que termine la carga
MITAD   	btfss   	PRES50      ;Mira el presostato al 50%
    		goto    	LLENO       ;Si alcanzó el nivel termina la carga
    		goto    	CARGA       ;Si no alcanzó el nivel espera que llegue
LLENO   	bcf 		VALVULA     ;Desconecta la electroválvula
    		bcf 		GIE     ;Desactiva el sistema de time-out
    		return

;////////////////////////////////////////////////////////////////////////////////////////
;PROCESO DE LAVADO
;Demora 6 minutos en cargar el agua y dos minutos mas en descargarla
;Por lo que el tiempo total del lavado es igual a 8 min + (W * 20 seg)
;Lavado de 10 min -> W = 6
;Lavado de 15 min -> W = 21
;Lavado de 16 min -> W = 24
;Lavado de 25 min -> W = 51
;Lavado de 38 min -> W = 90
;////////////////////////////////////////////////////////////////////////////////////////
LAVAR   	movwf   	veces       	;Utiliza W para condicionar la cant. de ciclos de lavado
LAVAMAS 	bsf 		MOTSLOWD     	;Enciende el motor en baja velocidad durante 10 segundos
    		movf    	ptoc, 0     	;Resguarda el numero mostrado en el display
   			movwf   	display
    		call    	DIEZANI
    		bcf 		MOTSLOWD     	;Apaga el motor durante 10 segundos
    		movf    	display, 0  	;restaura el display a su estado normal
    		movwf   	ptoc
    		call    	DIEZSEG
    		decfsz  	veces, 1
    		bsf			RELECAPA		;Enciende el motor en baja velocidad durante 10 segundos
			call		DEL250
			bsf 		MOTSLOWD
			movf		ptoc, 0			;Resguarda el numero mostrado en el display
			movwf		display
			call		DIEZANI
			bcf			MOTSLOWD		;Apaga el motor durante 10 segundos
			bcf 		RELECAPA
			movf		display, 0		;restaura el display a su estado normal
			movwf		ptoc
			call		DIEZSEG
			decfsz		veces, 1
			goto		LAVAMAS
			return
    
VACIAR  	bsf 		GIE     ;Activa el sistema de time-out de descarga
    		bcf 		ENTRA
    		clrf    	tout1       ;Inicializa los contadores de timeout
    		clrf    	tout2
    		bsf 		BOMBA       ;Acciona la bomba de desagote
    		btfss   	PRES50      ;Espera que se vacíe completamente el tanque
    		goto    	$ -1
    		call    	DIEZSEG     ;Espera 20 segundos extra
    		call    	DIEZSEG
    		bcf 		BOMBA       ;Desconecta la bomba
    		bcf 		GIE     ;Desactiva el sistema de timeout
    		return

CENTRIF 	btfsc   	NOCENT      ;Si esta en modo no-centrifugar
    		return          ;Evita hacerlo
    		btfsc   	PRES50      ;Mira si hay agua en el tanque
    		goto    	CENT2       ;Si no hay agua va directamente a centrifugar
    		bsf 		BOMBA       ;Enciende la bomba de desague
    		btfss   	PRES50
    		goto    	$ -1
    		call    	DIEZSEG
    		call    	DIEZSEG
    		bcf 		BOMBA       ;Una vez que se vacia el tanque apaga la bomba
CENT2   	bsf 		MOTFAST     ;Enciende el motor a alta velocidad
    		bsf 		BOMBA       ;Activa el desagote (por si con suerte escurre algo)
    		call    	DIEZSEG     ;Un minuto con bomba a pleno
    		call    	DIEZSEG
    		call    	DIEZSEG
    		call    	DIEZSEG
    		call    	DIEZSEG
    		call    	DIEZSEG
    		movlw   	d'4'        ;Espera 2 minutos y monedas con la bomba intermitente
    		movwf   	veces
    		bsf 		BOMBA       ;Enciende la bomba de desagote
    		call    	DIEZSEG
    		bcf 		BOMBA       ;Apaga la bomba
    		call    	DIEZSEG
    		call    	DIEZSEG
    		call    	DIEZSEG
    		decfsz  	veces, 1
    		goto    	$ -7
    		bcf 		MOTFAST     ;Apaga el motor
    		return

DIEZANI 	movlw   	d'10'
    		movwf   	tiempo3
    		call    	ANIM
    		decfsz  	tiempo3, 1
    		goto    	$ -2
    		return
    
ANIM    	movlw   	b'00100000'
    		movwf   	ptoc
    		call    	DEL250
    		movlw   	b'00000001'
    		movwf   	ptoc
    		call    	DEL250
    		movlw   	b'00000010'
    		movwf   	ptoc
    		call    	DEL250
    		movlw   	b'01000000'
    		movwf   	ptoc
    		call    	DEL250
    		return

DIEZSEG 	movlw   	d'40'       ;Demora de 10 segundos
    		goto    	$ +2
UNSEG   	movlw   	d'4'        ;Demora de 1 segundo
    		movwf   	tiempo3
    		call    	DEL250
    		decfsz  	tiempo3, 1
    		goto    	$ -2
    		return

BEEPFIN 	bsf 		BUZZER      ;Hace tres beep's largos
    		call    	DEL250
    		call    	DEL250
    		bcf 		BUZZER
    		call    	DEL250
    		call    	DEL250
    		bsf 		BUZZER
    		call    	DEL250
    		call    	DEL250
    		bcf 		BUZZER
    		call    	DEL250
    		call    	DEL250
    		bsf 		BUZZER
    		call    	DEL250
    		call    	DEL250
    		bcf 		BUZZER
    		call    	DEL250
    		call    	DEL250
    		return
    
BEEP    	bsf 		BUZZER
    		call    	DELOFF
    		bcf 		BUZZER
    		call    	DELOFF
    		return
    
DELON   	movwf   	tiempo1
    		nop
    		nop
    		nop
    		nop
    		nop
    		nop
    		nop
    		decfsz  	tiempo1, 1
    		goto    	$ -8
    		return

DEL250  	movlw   	d'250'      ;Demora de 1/4 de segundo
    		goto    	$ +2
DELOFF  	movlw   	d'50'       ;Demora de 50ms
    		movwf   	tiempo2
TOP2    	movlw   	d'110'
    		movwf   	tiempo1
TOP1    	nop
    		nop
    		nop
    		nop
    		nop
    		nop
    		decfsz  	tiempo1, 1
    		goto    	TOP1
    		decfsz  	tiempo2, 1
    		goto    	TOP2
    		return
    
    		end
