;*************************************************************************
;* 	                     Clever Lamp				 *
;*                         (c)Tolaemon 2003				 *
;*************************************************************************

;CALCULO DE LAS TEMPORIZACIONES
;PSA esta a '1' por lo que el preescaler esta asignado al WATCHDOG, asi el 
;contador de TIMER0 se incrementara en cada ciclo de instruccion. Como el Xtal 
;es de 3,6864Mhz y cada ciclo de instruccion son 4 ciclos de reloj, 1 ciclo de
;instruccion dura: Tinstr= 4 * (1/3,6864 E6) en seg. Como la fercuencia de 
;parpadeo de los leds ha de ser de 40Hz Tled=0,025 en seg. Cada ciclo de led ha de
;durar 0,025 seg. La interrupcion se generara cuando se desborde el contador
;del timer, es decir cuando hayan pasado 255 ciclos de instruccion. Asi cada
;cada ciclo de led requerira Tled / (Tinstr*255) = aprox 90 interrupciones de
;reloj. Es decir que cuando se hayan producido 90 llamadas de interrupcion,
;habran pasado aprox 0,025 seg.
;No sobrecargar la RSI del timer ya que si en el siguiente desboradmiento del
;contador todavia se esta ejecutando la RSI del timer, se perdera la interrupcion
;de este.

	list P=16F84

	#include p16f84a.inc


; se definen las variables

TICKS_C_MAX	equ 0x10
TICKS_C		equ 0x11
TICKS_UV	equ 0x12 
TICKS_RJ	equ 0x13
TICKS_VD	equ 0x14
TICKS_AZ	equ 0x15
TICKS_BL	equ 0x16

TICKS_UV_MAX	equ 0x17
TICKS_RJ_MAX	equ 0x18
TICKS_VD_MAX	equ 0x19
TICKS_AZ_MAX	equ 0x1A
TICKS_BL_MAX	equ 0x1B

C_PARPAD_MAX	equ 0x1C	;es el numero de CICLOS DE PARPADEO MAXIMO y controla la duracion del parpadeo
C_PARPAD	equ 0x1D	;es el contador de CICLOS DE PARPADEO y controla el tiempo de espera entre parpadeo y parpadeo
PARPAD_ACTIVO	equ 0x1E
AZAR_ACTIVO	equ 0x1F
HAY_TICK	equ 0x20

C_ANTIREB_MAX	equ 0x21
C_ANTIREB	equ 0x22
LECT_ACTUAL	equ 0x23	;valor leido del puerto de pulsadores, se usa para avaluar las pulsaciones de los diferentes pulsadores en un mismo instante, cosa que no se podria hacer si se leiera directamente del puerto
LECT_ANTERIOR	equ 0x24	;valor leido del puerto de pulsadores en el ultimo ciclo, sirve para saber si en el ultimo ciclo el pulsador estaba apretado o no y asi evitar coger 2 veces una misma pulsacion

SELECCION_MAX	equ 0x25
SELECCION	equ 0x26

MASCARA_SALIDA	equ 0x27	;mascara que se aplica a SALIDA para seleccionar que leds han de encenderse o no
MASCARA_PARPAD	equ 0x28	;mascara que se aplica a SALIDA para implementar el PARPADEO
MASCARA_AZAR	equ 0x29	;mascara que se aplica a SALIDA para implementar las variaciones al AZAR
SALIDA		equ 0x2A	;bits que se sacaran por el puerto de los LEDs es decir contiene el estado de los LEDs


; empieza el programa

	org 0 			;el codigo que hay a continuacion se situa a partir de la @ 0x00 (es el vector de RESET)
	goto inicializacion 	;saltamos a otra zona de codigo para no pisar la @ 0x04 donde esta el codigo de la RSI


; ******************************************
; *             RSI GENERAL                *
; ******************************************

	org 4			;el codigo que hay a continuacion se situa a partir de la @0x04 (es el vector de interrupcion GLOBAL) como a continuacion no hay ninguna otra direccion especial el codigo continua y no es necesario hacer ningun goto

	btfsc INTCON,T0IF	;se comprueba que la causa de interrupcion es el TIMER0
	call gestion_int_timer
	bcf	INTCON,T0IF	;resetea el bit de overflow de TIMER0	
	retfie             	;la propia instruccion RETFIE reactiva el GIE

; ******************************************
; *          PROGRAMA PRINCIPAL            *
; ******************************************
	
inicializacion
	
bsf STATUS,RP0; BANCO1 es activado

	; Configuración general

	; RBPU   (7) = 0 : pull-up activados
	; INTEDG (6)
	; TOCS   (5) = 0 : seleccionamos timer
	; TOSE   (4) = 0 : incremento en transicion low-high
	; PSA    (3) = 1 : prescaler asignado al WATCHDOG
	; PS2    (2) = 0 : 
	; PS1    (1) = 0 : PS2:PS0 (1/2)
	; PS0    (0) = 0 :

	movlw	b'01011000' 	; division de frecuencia de (1/2)
	movwf	OPTION_REG

	bcf 	STATUS,RP0 	; BANCO0 es activado
	clrf	PORTB 
	clrf	PORTA

	bsf 	STATUS,RP0 	;BANCO1 es activado
	movlw   b'00000000'	;se carga en el registro W: 00000000  0: Salida 1:Entrada
	movwf   TRISA		;se configuran los pins de E/S del puerto A	
	movlw   b'00000011'	;se carga en el registro W: 00000111  0: Salida 1:Entrada
	movwf   TRISB		;se configuran los pins de E/S del puerto B
	
	bcf 	STATUS,RP0 	;BANCO0 es activado
	bsf     INTCON,T0IE  	;activa interrupción del TIMER0
	bcf	INTCON,T0IF	;resetea el bit de overflow de TIMER0
	bcf	INTCON,EEIE	;activa la interrupcion por escritura en la EEPROM
	bsf 	INTCON,GIE   	;activa las interrupciones 

	
	movlw	0x5A
	movwf   TICKS_RJ
	movwf	TICKS_RJ_MAX
	movwf	TICKS_VD
	movwf	TICKS_VD_MAX
	movwf	TICKS_AZ
	movwf	TICKS_AZ_MAX
	movwf	TICKS_BL
	movwf	TICKS_BL_MAX
	movwf	TICKS_UV
	movwf	TICKS_UV_MAX

	movlw 0x5A		;cada 90 llamadas de interrupcion habra pasado un ciclo de LED,esto da una freq de actualizacion de 40Hz
	movwf TICKS_C_MAX
	movwf TICKS_C
	
	movlw 0x01
	movwf C_PARPAD_MAX
	movwf C_PARPAD
	movlw 0x00
	movwf PARPAD_ACTIVO	;0x01 PRARPADEO ACTIVO 	0x00 PARPADEO NO ACTIVO
	movwf AZAR_ACTIVO	;0x01 AZAR ACTIVO 	0x00 AZAR NO ACTIVO

	movlw 0x14		;el numero de opciones de seleccion es de 14
	movwf SELECCION_MAX	
	movlw 0x01		;el programa se incia en la opcion de seleccion 1
	movwf SELECCION

	movlw 0xFF		;se ponen todas las MASCARAS a '11111111'
	movwf MASCARA_SALIDA
	movwf MASCARA_PARPAD
	movwf MASCARA_AZAR

	movlw 0x00
	movwf SALIDA 

	movwf HAY_TICK
	
	movlw 0x1A		;despues de apretar un pulsador no volvera a ser escuchado
	movwf C_ANTIREB_MAX	;hasta que hayan pasado C_ANTIREB_MAX ciclos de LED y ademas
	movwf C_ANTIREB		;no se haya soltado el pulsador (se sabe con LECT_ANTERIOR)
	movlw b'00000011'	;se inicializa la variable de lectura anterior del filtro de los
	movwf LECT_ANTERIOR	;pulsadores. Hay que tener en cuenta que llevan pull-up por lo que al no estar presionados dan un 1 y al presionarlos un 0.

bucle
	movfw SALIDA 		
	andwf MASCARA_SALIDA,0	;se aplica la MASCARA de SALIDA	a SALIDA la cual permite seleccionar que leds se encienden
	andwf MASCARA_PARPAD,0	;se aplica la MASCARA DE PARPADEO que decide si los leds estan encendidos o apagados
	andwf MASCARA_AZAR,0	;se aplica la MASCARA DE AZAR que modifica aleatoriamente los leds que se han de encender
	movwf PORTA 	 	
	call gestion_timer
	call gestion_pulsadores

	goto bucle


; **********************************
; *    RUTINAS DE INTERRUPCION     *
; **********************************

; RUTINA DE INTERRUPCION DEL TIMER

gestion_int_timer
	bsf HAY_TICK,0
	return

; **********************************
; *         PROCEDIMIENTOS         *
; **********************************

gestion_timer		
	btfss HAY_TICK,0			;se mira si HAY_TICK esta activo y si esta a 0 
	goto fin_gestion_timer			;(no hay ticks) entonces se ejecuta el goto 
		bcf	HAY_TICK,0		;se desactiva HAY_TICKS
	
		decfsz	TICKS_C	,1		;se mira si el contador de ciclo de leds se ha puesto a 0, si es asi se reinicializa el ciclo
		goto    decrementa_ticks
			movfw TICKS_C_MAX	;se recarga el contador de ciclo con el numero de llamadas de RSI por ciclo de LEDs
			movwf TICKS_C 	

			movfw TICKS_RJ_MAX	;se reinicializa el contador de ticks de RJ
			movwf TICKS_RJ
			movfw TICKS_VD_MAX	;se reinicializa el contador de ticks de VD
			movwf TICKS_VD
			movfw TICKS_AZ_MAX	;se reinicializa el contador de ticks de AZ
			movwf TICKS_AZ
			movfw TICKS_BL_MAX	;se reinicializa el contador de ticks de BL
			movwf TICKS_BL
			movfw TICKS_UV_MAX	;se reinicializa el contador de ticks de UV
			movwf TICKS_UV
			movlw 0xFF		;se ponen todos los bits de salida a 1
			movwf SALIDA

	control_parpadeo
		btfss PARPAD_ACTIVO,0		;si el bit de PARPADEO ACTIVO esta a 0 se ejecuta el goto
		goto azar			
			decfsz C_PARPAD,1
			goto azar
				movfw C_PARPAD_MAX
				movwf C_PARPAD
				movlw 0xFF	; se hace una XOR de la MASCARA con b'11111111'
				xorwf MASCARA_PARPAD,1 ; para invertir todos los bits de esta

	azar
		btfss AZAR_ACTIVO,0		;si el bit de AZAR ACTIVO esta a 0 se ejecuta el goto
		goto antirebotes
			incf MASCARA_AZAR,1
			rlf MASCARA_AZAR,1

	antirebotes
		decfsz C_ANTIREB,1		;se decrementa el temporizador ANTIREBOTE y si ya
		goto fin_gestion_timer		;esta a 1 (al decrementar da 0) no se tiene que decrementar
			movlw 0x01		;asi que como se ja decrementado y no era necesario se 
			movwf C_ANTIREB 	;deja como estaba antes de decrementar, es decir a 1
			goto fin_gestion_timer
				
	decrementa_ticks		

	decrementa_rj
		decfsz TICKS_RJ,1		
		goto decrementa_vd		;si el resultado vale >=1 se ejecuta el goto
			movlw	0x01		;se pone la variable de nuevo a 1 para que
			movwf	TICKS_RJ	;en el siguiente decremnto vuelva a valer 0
			bcf	SALIDA,0	;se pone a 0 el pin del rojo
	decrementa_vd
		decfsz TICKS_VD,1
		goto decrementa_az		;si el resultado vale >=1 se ejecuta el goto
			movlw	0x01		;se pone la variable de nuevo a 1 para que
			movwf	TICKS_VD	;en el siguiente decremnto vuelva a valer 0
			bcf	SALIDA,1	;se pone a 0 el pin del verde
	decrementa_az
		decfsz TICKS_AZ,1
		goto decrementa_bl		;si el resultado vale >=1 se ejecuta el goto
			movlw	0x01		;se pone la variable de nuevo a 1 para que
			movwf	TICKS_AZ	;en el siguiente decremnto vuelva a valer 0
			bcf	SALIDA,2	;se pone a 0 el pin del azul
	decrementa_bl
		decfsz TICKS_BL,1
		goto decrementa_uv		;si el resultado vale >=1 se ejecuta el goto
			movlw	0x01		;se pone la variable de nuevo a 1 para que
			movwf	TICKS_BL	;en el siguiente decremnto vuelva a valer 0
			bcf	SALIDA,3	;se pone a 0 el pin del blanco
	decrementa_uv
		decfsz TICKS_UV,1		
		goto fin_gestion_timer		;si el resultado vale >=1 se ejecuta el goto
			movlw	0x01		;se pone la variable de nuevo a 1 para que
			movwf	TICKS_UV	;en el siguiente decremnto vuelva a valer 0
			bcf	SALIDA,4	;se pone a 0 el pin de ultra violetas
	fin_gestion_timer				

	return


gestion_pulsadores

	movlw b'00000001'		;para hacer la comparacion de si C_ANTIREB es igual a 0 se hace
	xorwf C_ANTIREB,0		;una XOR con '0000000' y si el resultado es 0 es que los valores
	btfss STATUS,2			;son iguales. Mediante el bit Z del status register se sabe
	goto fin_gestion_pulsadores	;si la operacion ha dado como resultado 0 o !=0
		bcf PORTB,2 			;pasado el tiempo de espera antirebotes se apaga el led indicador de pulsadores no disponibles, lo que indica que estos vuelven a ser "escuchados"
		movfw PORTB			;se lee el contenido del puerto y se deja en la variable de lectura de los pulsadores
		movwf LECT_ACTUAL		;esta variable se usa para evitar leer en instantes diferentes del puerto de pulsadores lo que podria provocar algun problema, hacer esto equivale a consultar los pulsadores en un mismo intervalo de tiempo

	mira_pulsador1		
		btfsc LECT_ACTUAL,0			;se consulta si el pulsador 1 (bit0) esta apretado. Si el bit vale 1 (recordar que los pulsadores van con pull-up) no lo esta 
		goto mira_pulsador2			;entonces se ejecuta el goto y se mira el siguiente pulsador
			btfss LECT_ANTERIOR,0		;si el pulsador esta apretado, se mira que anteriormente haya estado desapretado (LECT_ANTERIOR) 
			goto mira_pulsador2		;y si no lo ha estado se mira el siguiente pulsador. Esto es util para diferenciar pulsaciones consecutivas y evitar leer 2 veces la misma pulsacion. Sino se hiciera esto manteniendo el pulsador apretado todo el rato las variables se irian incrementando lo que podria se un poco incomodo
				call gestion_seleccion	
				goto ini_antirebote		
	mira_pulsador2		
		btfsc LECT_ACTUAL,1			;se consulta si el pulsador 2 esta apretado. Si el bit vale 1 no lo esta 
		goto fin_gestion_pulsadores		;entonces se ejecuta el goto
			btfss LECT_ANTERIOR,1		;si esta apretado el pulsador, se mira que anteriormente haya estado desapretado (LECT_ANTERIOR) 
			goto fin_gestion_pulsadores	;si no lo ha estado se ejecuta el goto. Esto es util para diferenciar pulsaciones consecutivas y evitar leer 2 veces la misma pulsacion. Sino se hiciera esto manteniendo el pulsador apretado todo el rato las variables se irian incrementando lo que podria se un poco incomodo
				incf SELECCION,1	;como se ha presionado el pulsador 2 se incrementa la variable de seleccion pero hay que mirar que no nos pasemos del maximo
				movfw SELECCION		;para hacer la comparacion de si SELECCION es igual a SELECCION_MAX
				xorwf SELECCION_MAX,0	;se hace una XOR y si el resultado es 0 es que los valores son 
	     			btfss STATUS,2		;iguales. Mediante el bit Z del status register se sabe si 
				goto ini_antirebote	;la XOR ha dado 00000000 o no. Si no da, Z=0 y se ejecuta el goto			
					movlw 0x01	;si efectivamente se ha llegado al maximo de vuelve otra vez al inicio
					movwf SELECCION
					goto ini_antirebote		
	ini_antirebote
		movfw C_ANTIREB_MAX		;se carga el tiempo de espera maximo (en ciclos de led)
		movwf C_ANTIREB
		bsf PORTB,2			;se enciende el LED que indica que se oido la pulsacion y que los pulsadores no se encuentran disponibles, es decir que no se escucharan hasta que pase le tiempo C_ANTIREB_MAX
						
	fin_gestion_pulsadores			
		movfw LECT_ACTUAL
		movwf LECT_ANTERIOR	
	
	return

gestion_seleccion

	compara_1
		movfw SELECCION			;para hacer la comparacion de si SELECCION es igual a 1
		xorlw b'00000001'		;se hace una XOR y si el resultado es 0 es que los valores
		btfss STATUS,2			;son iguales. Mediante el bit Z del status register se sabe
		goto compara_2			;si la operacion ha dado como resultado 0 o !=0
			movfw TICKS_C_MAX	;se asigna el numero de ticks de ciclo de led maximo al 
			movwf TICKS_RJ_MAX	;numero de ticks de los diferentes colores
			movwf TICKS_VD_MAX
			movwf TICKS_AZ_MAX
			movwf TICKS_BL_MAX		
			movwf TICKS_UV_MAX
			movlw 0xFF
			movwf MASCARA_SALIDA	;se activan todos los leds
			movwf MASCARA_PARPAD	;se activan todos los leds de la MASCARA DE PARPADEO
			movwf MASCARA_AZAR	;se activan todos los leds de la MASCARA DE AZAR
			movlw 0x00
			movwf PARPAD_ACTIVO	;se desactiva el parpadeo
			movwf AZAR_ACTIVO	;se desactiva el ciclo aleatorio
			goto fin_gestion_seleccion
	compara_2
		movfw SELECCION			;para hacer la comparacion de si SELECCION es igual a 2
		xorlw b'0000010'		;se hace una XOR y si el resultado es 0 es que los valores
		btfss STATUS,2			;son iguales. Mediante el bit Z del status register se sabe
		goto compara_3			;si la operacion ha dado como resultado 0 o !=0
			movlw 0x2D			
			movwf TICKS_RJ_MAX
			movwf TICKS_VD_MAX
			movwf TICKS_AZ_MAX
			movwf TICKS_BL_MAX		
			movwf TICKS_UV_MAX
			movlw 0xFF
			movwf MASCARA_SALIDA	;se activan todos los leds
			movwf MASCARA_PARPAD	;se activan todos los leds de la MASCARA DE PARPADEO
			movwf MASCARA_AZAR	;se activan todos los leds de la MASCARA DE AZAR
			movlw 0x00	
			movwf PARPAD_ACTIVO	;se desactiva el parpadeo
			movwf AZAR_ACTIVO	;se desactiva el ciclo aleatorio
			goto fin_gestion_seleccion
	compara_3			
		movfw SELECCION			;para hacer la comparacion de si SELECCION es igual a 3
		xorlw b'00000011'		;se hace una XOR y si el resultado es 0 es que los valores
		btfss STATUS,2			;son iguales. Mediante el bit Z del status register se sabe
		goto compara_4			;si la operacion ha dado como resultado 0 o !=0
			movlw 0x01			
			movwf TICKS_RJ_MAX
			movwf TICKS_VD_MAX
			movwf TICKS_AZ_MAX
			movwf TICKS_BL_MAX		
			movwf TICKS_UV_MAX
			movlw 0xFF
			movwf MASCARA_SALIDA	;se activan todos los leds de la MASCARA DE SALIDA
			movwf MASCARA_PARPAD	;se activan todos los leds de la MASCARA DE PARPADEO
			movwf MASCARA_AZAR	;se activan todos los leds de la MASCARA DE AZAR
			movlw 0x00
			movwf PARPAD_ACTIVO	;se desactiva el parpadeo
			movwf AZAR_ACTIVO	;se desactiva el ciclo aleatorio
			goto fin_gestion_seleccion
	compara_4
		movfw SELECCION		;para hacer la comparacion de si SELECCION es igual a 4
		xorlw b'00000100'	;se hace una XOR y si el resultado es 0 es que los valores
		btfss STATUS,2		;son iguales. Mediante el bit Z del status register se sabe
		goto compara_5		;si la operacion ha dado como resultado 0 o !=0
			movfw TICKS_C_MAX
			movwf TICKS_RJ_MAX
			movlw b'00000001'
			movwf MASCARA_SALIDA			
			movlw 0xFF
			movwf MASCARA_PARPAD	;se activan todos los leds de la MASCARA DE PARPADEO
			movwf MASCARA_AZAR	;se activan todos los leds de la MASCARA DE AZAR
			movlw 0x00
			movwf PARPAD_ACTIVO	;se desactiva el parpadeo
			movwf AZAR_ACTIVO	;se desactiva el ciclo aleatorio
			goto fin_gestion_seleccion
	compara_5
		movfw SELECCION		;para hacer la comparacion de si SELECCION es igual a 5
		xorlw b'00000101'	;se hace una XOR y si el resultado es 0 es que los valores
		btfss STATUS,2		;son iguales. Mediante el bit Z del status register se sabe
		goto compara_6		;si la operacion ha dado como resultado 0 o !=0
			movfw TICKS_C_MAX
			movwf TICKS_VD_MAX
			movlw b'00000010'
			movwf MASCARA_SALIDA
			movlw 0xFF
			movwf MASCARA_PARPAD	;se activan todos los leds de la MASCARA DE PARPADEO
			movwf MASCARA_AZAR	;se activan todos los leds de la MASCARA DE AZAR
			movlw 0x00
			movwf PARPAD_ACTIVO	;se desactiva el parpadeo
			movwf AZAR_ACTIVO	;se desactiva el ciclo aleatorio
			goto fin_gestion_seleccion
	compara_6				
		movfw SELECCION		;para hacer la comparacion de si SELECCION es igual a 6
		xorlw b'00000110'	;se hace una XOR y si el resultado es 0 es que los valores
		btfss STATUS,2		;son iguales. Mediante el bit Z del status register se sabe
		goto compara_7		;si la operacion ha dado como resultado 0 o !=0
			movfw TICKS_C_MAX
			movwf TICKS_AZ_MAX
			movlw b'00000100'
			movwf MASCARA_SALIDA
			movlw 0xFF
			movwf MASCARA_PARPAD	;se activan todos los leds de la MASCARA DE PARPADEO
			movwf MASCARA_AZAR	;se activan todos los leds de la MASCARA DE AZAR
			movlw 0x00
			movwf PARPAD_ACTIVO	;se desactiva el parpadeo
			movwf AZAR_ACTIVO	;se desactiva el ciclo aleatorio
			goto fin_gestion_seleccion
	compara_7
		movfw SELECCION		;para hacer la comparacion de si SELECCION es igual a 7
		xorlw b'00000111'	;se hace una XOR y si el resultado es 0 es que los valores
	     	btfss STATUS,2		;son iguales. Mediante el bit Z del status register se sabe
		goto compara_8		;si la operacion ha dado como resultado 0 o !=0
			movfw TICKS_C_MAX
			movwf TICKS_BL_MAX		
			movlw b'00001000'
			movwf MASCARA_SALIDA
			movlw 0xFF
			movwf MASCARA_PARPAD	;se activan todos los leds de la MASCARA DE PARPADEO
			movwf MASCARA_AZAR	;se activan todos los leds de la MASCARA DE AZAR
			movlw 0x00
			movwf PARPAD_ACTIVO	;se desactiva el parpadeo
			movwf AZAR_ACTIVO	;se desactiva el ciclo aleatorio
			goto fin_gestion_seleccion
	compara_8
		movfw SELECCION		;para hacer la comparacion de si SELECCION es igual a 8
		xorlw b'00001000'	;se hace una XOR y si el resultado es 0 es que los valores
	     	btfss STATUS,2		;son iguales. Mediante el bit Z del status register se sabe
		goto compara_9		;si la operacion ha dado como resultado 0 o !=0
			movfw TICKS_C_MAX
			movwf TICKS_UV_MAX		
			movlw b'00010000'
			movwf MASCARA_SALIDA
			movlw 0xFF
			movwf MASCARA_PARPAD	;se activan todos los leds de la MASCARA DE PARPADEO
			movwf MASCARA_AZAR	;se activan todos los leds de la MASCARA DE AZAR
			movlw 0x00
			movwf PARPAD_ACTIVO	;se desactiva el parpadeo
			movwf AZAR_ACTIVO	;se desactiva el ciclo aleatorio
			goto fin_gestion_seleccion
	compara_9
		movfw SELECCION
		xorlw b'00001001'
		btfss STATUS,2
		goto compara_10
			movlw 0x00		;se desactivan todos los bits de la MASCARA de SALIDA menos el BLANCO que hace de piloto ya que sino no sabriamos si la Clever Lamp esta o no encendida
			movwf MASCARA_SALIDA
			movlw 0x01		;se ponen todos los colores al minimo	
			movwf TICKS_RJ_MAX
			movwf TICKS_VD_MAX
			movwf TICKS_AZ_MAX
			movwf TICKS_BL_MAX		
			movwf TICKS_UV_MAX

			goto fin_gestion_seleccion
	compara_10
		movfw SELECCION
		xorlw b'00001010'
		btfss STATUS,2
		goto compara_11
			bsf MASCARA_SALIDA,0
			movlw 0x05
			addwf TICKS_RJ_MAX,1	
			goto fin_gestion_seleccion
	compara_11
		movfw SELECCION
		xorlw b'00001011'
		btfss STATUS,2
		goto compara_12
			bsf MASCARA_SALIDA,1
			movlw 0x05
			addwf TICKS_VD_MAX,1	
			goto fin_gestion_seleccion
	compara_12
		movfw SELECCION
		xorlw b'00001100'
		btfss STATUS,2
		goto compara_13
			bsf MASCARA_SALIDA,2
			movlw 0x05
			addwf TICKS_AZ_MAX,1	
			goto fin_gestion_seleccion
	compara_13
		movfw SELECCION
		xorlw b'00001101'
		btfss STATUS,2
		goto compara_14
			bsf MASCARA_SALIDA,3
			movlw 0x05
			addwf TICKS_BL_MAX,1	
			goto fin_gestion_seleccion
	compara_14
		movfw SELECCION
		xorlw b'00001110'
		btfss STATUS,2
		goto compara_15
			bsf MASCARA_SALIDA,4
			movlw 0x05
			addwf TICKS_UV_MAX,1	
			goto fin_gestion_seleccion
	compara_15
		movfw SELECCION
		xorlw b'00001111'
		btfss STATUS,2
		goto compara_16

			;SE GUARDA EL ROJO
			bcf STATUS,RP0 		;BANCO0 es activado
			movlw 0x00		;se carga en EEADR la direccion donde se va a escribir
			movwf EEADR
			movfw TICKS_RJ_MAX	;se carga en EEDATA el valor que se va a guardar
			movwf EEDATA		
			bsf STATUS,RP0 		;BANCO1 es activado
			bcf INTCON, GIE		;se desactivan todas las interrupciones
			bsf EECON1, WREN	;se activa el flag de permsio de escritura
			movlw 0x55		;se realiza la secuencia de seguridad:
			movwf EECON2		;	1->se escribe 0x55 en EECON2
			movlw 0xAA
			movwf EECON2		;	2->se escribe 0xAA en EECON2
			bsf EECON1,WR		;comienza la escritura
		espera1
			btfss EECON1, EEIF    	;antes de continuar con la siguiente escritura hay que dejar que termine esta, para
			goto espera1		;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura
			bcf EECON1,EEIF		;se limpia el flag indicador de escritura completa

			;SE GUARDA EL VERDE
			bcf STATUS,RP0 		;BANCO0 es activado
			movlw 0x01		;se carga en EEADR la direccion donde se va a escribir
			movwf EEADR
			movfw TICKS_VD_MAX	;se carga en EEDATA el valor que se va a guardar
			movwf EEDATA		
			bsf STATUS,RP0 		;BANCO1 es activado
			bcf INTCON, GIE		;se desactivan todas las interrupciones
			bsf EECON1, WREN	;se activa el flag de permsio de escritura
			movlw 0x55		;se realiza la secuencia de seguridad:
			movwf EECON2		;	1->se escribe 0x55 en EECON2
			movlw 0xAA
			movwf EECON2		;	2->se escribe 0xAA en EECON2
			bsf EECON1,WR		;comienza la escritura
		espera2
			btfss EECON1, EEIF    	;antes de continuar con la siguiente escritura hay que dejar que termine esta, para
			goto espera2		;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura
			bcf EECON1,EEIF		;se limpia el flag indicador de escritura completa

			;SE GUARDA EL AZUL
			bcf STATUS,RP0 		;BANCO0 es activado
			movlw 0x02		;se carga en EEADR la direccion donde se va a escribir
			movwf EEADR
			movfw TICKS_AZ_MAX	;se carga en EEDATA el valor que se va a guardar
			movwf EEDATA		
			bsf STATUS,RP0 		;BANCO1 es activado
			bcf INTCON, GIE		;se desactivan todas las interrupciones
			bsf EECON1, WREN	;se activa el flag de permsio de escritura
			movlw 0x55		;se realiza la secuencia de seguridad:
			movwf EECON2		;	1->se escribe 0x55 en EECON2
			movlw 0xAA
			movwf EECON2		;	2->se escribe 0xAA en EECON2
			bsf EECON1,WR		;comienza la escritura
		espera3
			btfss EECON1, EEIF    	;antes de continuar con la siguiente escritura hay que dejar que termine esta, para
			goto espera3		;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura
			bcf EECON1,EEIF		;se limpia el flag indicador de escritura completa

			;SE GUARDA EL BLANCO
			bcf STATUS,RP0 		;BANCO0 es activado
			movlw 0x03		;se carga en EEADR la direccion donde se va a escribir
			movwf EEADR
			movfw TICKS_BL_MAX	;se carga en EEDATA el valor que se va a guardar
			movwf EEDATA		
			bsf STATUS,RP0 		;BANCO1 es activado
			bcf INTCON, GIE		;se desactivan todas las interrupciones
			bsf EECON1, WREN	;se activa el flag de permsio de escritura
			movlw 0x55		;se realiza la secuencia de seguridad:
			movwf EECON2		;	1->se escribe 0x55 en EECON2
			movlw 0xAA
			movwf EECON2		;	2->se escribe 0xAA en EECON2
			bsf EECON1,WR		;comienza la escritura
		espera4
			btfss EECON1, EEIF    	;antes de continuar con la siguiente escritura hay que dejar que termine esta, para
			goto espera4		;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura
			bcf EECON1,EEIF		;se limpia el flag indicador de escritura completa

			;SE GUARDA EL UV
			bcf STATUS,RP0 		;BANCO0 es activado
			movlw 0x04		;se carga en EEADR la direccion donde se va a escribir
			movwf EEADR
			movfw TICKS_UV_MAX	;se carga en EEDATA el valor que se va a guardar
			movwf EEDATA		
			bsf STATUS,RP0 		;BANCO1 es activado
			bcf INTCON, GIE		;se desactivan todas las interrupciones
			bsf EECON1, WREN	;se activa el flag de permsio de escritura
			movlw 0x55		;se realiza la secuencia de seguridad:
			movwf EECON2		;	1->se escribe 0x55 en EECON2
			movlw 0xAA
			movwf EECON2		;	2->se escribe 0xAA en EECON2
			bsf EECON1,WR		;comienza la escritura
		espera5
			btfss EECON1, EEIF    	;antes de continuar con la siguiente escritura hay que dejar que termine esta, para
			goto espera5		;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura
			bcf EECON1,EEIF		;se limpia el flag indicador de escritura completa

			;SE GUARDA LA MASCARA DE SALIDA
			bcf STATUS,RP0 		;BANCO0 es activado
			movlw 0x05		;se carga en EEADR la direccion donde se va a escribir
			movwf EEADR
			movfw MASCARA_SALIDA	;se carga en EEDATA el valor que se va a guardar
			movwf EEDATA		
			bsf STATUS,RP0 		;BANCO1 es activado
			bcf INTCON, GIE		;se desactivan todas las interrupciones
			bsf EECON1, WREN	;se activa el flag de permsio de escritura
			movlw 0x55		;se realiza la secuencia de seguridad:
			movwf EECON2		;	1->se escribe 0x55 en EECON2
			movlw 0xAA
			movwf EECON2		;	2->se escribe 0xAA en EECON2
			bsf EECON1,WR		;comienza la escritura
		espera6
			btfss EECON1, EEIF    	;antes de continuar con la siguiente escritura hay que dejar que termine esta, para
			goto espera6		;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura
			bcf EECON1,EEIF		;se limpia el flag indicador de escritura completa
			
			bcf EECON1, WREN	;se desactiva el flag de permsio de escritura		
			bsf INTCON, GIE		;se reactivan todas las interrupciones					
			bcf STATUS,RP0 		;BANCO0 es activado
			goto fin_gestion_seleccion
	compara_16
		movfw SELECCION
		xorlw b'00010000'
		btfss STATUS,2
		goto compara_17
			
			;SE LEE EL ROJO
			bcf STATUS,RP0		;BANCO0 es activado
			movlw 0x00		;se carga en EEADR la direccion de donde se quiere leer
			movwf EEADR
			bsf STATUS,RP0		;BANCO1 es activado
			bsf EECON1,RD		;comienza la lectura
			bcf STATUS,RP0		;BANCO0 es activado
			movfw EEDATA		;se carga el valor leido en la correspondiente variable
			movwf TICKS_RJ_MAX

			;SE LEE EL VERDE
			bcf STATUS,RP0		;BANCO0 es activado
			movlw 0x01		;se carga en EEADR la direccion de donde se quiere leer
			movwf EEADR
			bsf STATUS,RP0		;BANCO1 es activado
			bsf EECON1,RD		;comienza la lectura
			bcf STATUS,RP0		;BANCO0 es activado
			movfw EEDATA		;se carga el valor leido en la correspondiente variable
			movwf TICKS_VD_MAX

			;SE LEE EL AZUL
			bcf STATUS,RP0		;BANCO0 es activado
			movlw 0x02		;se carga en EEADR la direccion de donde se quiere leer
			movwf EEADR
			bsf STATUS,RP0		;BANCO1 es activado
			bsf EECON1,RD		;comienza la lectura
			bcf STATUS,RP0		;BANCO0 es activado
			movfw EEDATA		;se carga el valor leido en la correspondiente variable
			movwf TICKS_AZ_MAX

			;SE LEE EL BLANCO
			bcf STATUS,RP0		;BANCO0 es activado
			movlw 0x03		;se carga en EEADR la direccion de donde se quiere leer
			movwf EEADR
			bsf STATUS,RP0		;BANCO1 es activado
			bsf EECON1,RD		;comienza la lectura
			bcf STATUS,RP0		;BANCO0 es activado
			movfw EEDATA		;se carga el valor leido en la correspondiente variable
			movwf TICKS_BL_MAX

			;SE LEE EL UV
			bcf STATUS,RP0		;BANCO0 es activado
			movlw 0x04		;se carga en EEADR la direccion de donde se quiere leer
			movwf EEADR
			bsf STATUS,RP0		;BANCO1 es activado
			bsf EECON1,RD		;comienza la lectura
			bcf STATUS,RP0		;BANCO0 es activado
			movfw EEDATA		;se carga el valor leido en la correspondiente variable
			movwf TICKS_UV_MAX

			;SE LEE LA MASCARA DE SALIDA
			bcf STATUS,RP0		;BANCO0 es activado
			movlw 0x05
			movwf EEADR
			bsf STATUS,RP0		;BANCO1 es activado
			bsf EECON1,RD		;comienza la lectura
			bcf STATUS,RP0		;BANCO0 es activado
			movfw EEDATA		;se carga el valor leido en la correspondiente variable
			movwf MASCARA_SALIDA

			goto fin_gestion_seleccion
	compara_17
		movfw SELECCION		;para hacer la comparacion de si SELECCION es igual a 9
		xorlw b'00010001'	;se hace una XOR y si el resultado es 0 es que los valores
	     	btfss STATUS,2		;son iguales. Mediante el bit Z del status register se sabe
		goto compara_18		;si la operacion ha dado como resultado 0 o !=0
			movlw 0x01			;se hace una XOR entre PARPAD_ACTIVO y b'00000001'
			xorwf PARPAD_ACTIVO,1		;por tal de invertir su estado
			btfsc PARPAD_ACTIVO,0		;si el bit de AZAR ACTIVO ha pasado a 0 entonces se reinicializan las mascaras
			goto compara_18
				movlw 0xFF
				movwf MASCARA_PARPAD	
				goto fin_gestion_seleccion
	compara_18
		movfw SELECCION		;para hacer la comparacion de si SELECCION es igual a 10
		xorlw b'00010010'	;se hace una XOR y si el resultado es 0 es que los valores
	     	btfss STATUS,2		;son iguales. Mediante el bit Z del status register se sabe
		goto compara_19		;si la operacion ha dado como resultado 0 o !=0
			movlw 0x02		;el periodo de ciclo de parpadeo se incrementara en 2 tras cada pulsacion
			addwf C_PARPAD_MAX,1	
			goto fin_gestion_seleccion
	compara_19
		movfw SELECCION		;para hacer la comparacion de si SELECCION es igual a 11
		xorlw b'00010011'	;se hace una XOR y si el resultado es 0 es que los valores
	     	btfss STATUS,2		;son iguales. Mediante el bit Z del status register se sabe
		goto fin_gestion_seleccion		;si la operacion ha dado como resultado 0 o !=0
			movlw 0x01			;se hace una XOR entre AZAR_ACTIVO y b'00000001'
			xorwf AZAR_ACTIVO,1		;por tal de invertir su estado
			btfsc AZAR_ACTIVO,0		;si el bit de AZAR ACTIVO ha pasado a 0 entonces se reinicializan las mascaras
			goto fin_gestion_seleccion
				movlw 0xFF
				movwf MASCARA_PARPAD	
				movwf MASCARA_AZAR
				movlw 0x01
				movwf C_PARPAD_MAX	;se reinicializa la variable de CICLOS DE PARPADEO MAXIMOS que controla la duracion del parpadeo
				goto fin_gestion_seleccion

	fin_gestion_seleccion

	return

	END

 
	movwf TICKS_RJ_MAX

