;DEFINICIONES RAM
			CBLOCK	0X20 
			N_POTE
			ENDC

#DEFINE		REG_POTEX	(N_POTE+.1)	;+1 QUE EL ULTIMO REGISTRO USADO ASI SE PUEDEN HACER TANATAS CONVERSIONES DIFERENTES COMO ESPACIOS DE RAM QUEDEN

;LA RUTINA CANAL_AD_X SE MANEJA INDICANDOLE EL CANAL DONDE SE QUIERE HACER LA CONVERSION
;DECLARACIONES DE LOS CANALAES,CH, ANALOGICOS,AN, NUMERO DE CANAL,_X
;CH_AN_X
#DEFINE		CH_AN_0		B'10000101'
#DEFINE		CH_AN_1		B'10001101'	
#DEFINE		CH_AN_2		B'10010101'
#DEFINE		CH_AN_3		B'10011101'
#DEFINE		CH_AN_4		B'10100101'	
#DEFINE		CH_AN_5		B'10101101'
#DEFINE		CH_AN_6		B'10110101'
#DEFINE		CH_AN_7		B'10111101'
EJEMPLO_DE_USO
	;-----------------------------CONFIGURAMOS EL CAD
CONFIG_ADCON1					;000000000 TODOS LOS CANALES ANALOGICOS
		BANKSEL	ADCON1		
		MOVLW	B'00000000'
		MOVWF	ADCON1
	;-----------------------------
BUCLE									;ANTES DE NADA HAY QUE LIMPIAR LOS REGISTROS N_POTE Y FSR PARA QUE GUARDE 
										;EL RESULTADO DE LA CONVERSION EN EL ARRAY DE MEMORIA RESERVADO PARA ELLO, A PARTIR DE LA POSICION DE MEMORIA, REG_POTEX
			BANKSEL	N_POTE
			CLRF	N_POTE				;POTES Nº 0
			MOVLW	REG_POTEX			;DIRECCION DE LA MEMORIA RAM EN LA QUE EMPIEZA A GUARDAR LAS CONVERSIONES
			MOVWF	FSR
;0
			MOVLW	CH_AN_0				;A W 
			CALL	CANAL_AD_X			;CANALx DEL CAD
;1										;Y GUARDA EL RESULTADO DE LA CONVERSION EN INDF ((REG_POTEX +.Nº DE VECES QUE SE LLAMA A LA RUTINA CANAL_ADX))
			MOVLW	CH_AN_1				;A W 
			CALL	CANAL_AD_X			;CANALx DEL CAD
			
			GOTO	BUCLE				;VUELVE A EMPEZAR
			
CANAL_AD_X								;SELECCIONA CANAL X DEL CAD NO INICIA LA CONVERSION
	BANKSEL	ADCON0
	MOVWF	ADCON0
	CALL	DEMORA_25uS					;EL TIEMPO DE ADQUISICION CORRECTO PARA CARGAR EL CONDENSADOR ANTES DE INICIAR LA CONVERSION  

	BANKSEL	N_POTE
	INCF	N_POTE,F					;SIGUIENTE POTE
	INCF	FSR,F						;CADA VEZ QUE SE LLAMA A LA RUTINA QUE LEE EL 
										;VALOR DEL POTE, SE INCREMENTA EL REGISTRO FSR, PARA QUE REALICE LAS OPERACIONES 
										;EN EL REGISTRO DEL SIGUIENTE POTENCIOMETRO
	BANKSEL ADCON0
	BSF		ADCON0,GO					;INICIA LA CONVERSION
ESPERA_CAD								;TESTEA HASTA QUE TERMINA LA CONVERSIÓN
	BTFSC	ADCON0,GO					;HASTA QUE SE PONE A CERO EL BIT GO/DONE
	GOTO	ESPERA_CAD					;VUELVE ATRAS HASTA QUE TERMINE
	MOVF	ADRESH,W
	BANKSEL	REG_DIVISOR	
	MOVWF	REG_DIVISOR	
RESTA
	BANKSEL	REG_POTEX
	BCF		STATUS,Z
	SUBWF	INDF,W
	BTFSC	STATUS,Z
	RETURN
ENVIA_DATOS	
	BANKSEL	REG_DIVISOR	
	MOVWF	INDF
	;aqui hace algo si el resultado de la conversion no es cero
	RETURN								;Y VUELVE AL PROGRAMA

;ESTAS SON LAS RUTINAS PARA R/W LA EEPROM
;SOLO HAY QUE INDICARLES EL DATO A GUARDAR EN REG_MUESTRA
;Y LA DIRECCION DE LA EEPROM 0-256 POSICIONES ANTES DE USARLAS
;DEFINICIONES RAM
			CBLOCK	0X20 
			REG_MUESTRA
			N_POTE
			ENDC

#DEFINE		N_REG_EEPROM_POTES	.0	;POSICION DE LA EEPROM PARA LOS DATOS A GUARDAR

R_W_EEPROM		MACRO
CONTINUA_ESCRITURA	
		BCF		STATUS,RP0
		BCF		STATUS,RP1
		MOVF 	REG_MUESTRA,W 	
		BSF		STATUS,RP1	
		MOVWF 	EEDATA 			
		BSF 	STATUS,RP0 		
		BCF 	EECON1,EEPGD 	
								
		BSF 	EECON1,WREN 	
		MOVLW 	0X55 ;
		MOVWF 	EECON2 			
		MOVLW 	0XAA ;
		MOVWF 	EECON2 			
		BSF 	EECON1,WR 		
		BTFSC 	EECON1,WR 		
		GOTO 	$-1 			
		BCF 	EECON1,WREN 	
		BCF		STATUS,RP0
		BCF		STATUS,RP1
		RETURN
		;---------------------------
CONTINUA_LECTURA
		BANKSEL	EECON1
		BCF 	EECON1,EEPGD 		
		BSF 	EECON1,RD 			
		BANKSEL	EEDATA
		MOVF 	EEDATA,W 			;;Y DEPOSITAMOS EN W, EL VALOR RECOGIDO DE LA TABLA ESCRITA EN LA EEPROM ;)
		BCF		STATUS,RP0	
		BCF		STATUS,RP1	
		RETURN

;YO POR EJEMPLO UTILIZO EL MARCADOR DE LAS RUTINAS ANTERIORES DEL CAD, N_POTE.
;SUMANDOSELO A LA DIRECCION DONDE COMIENZA SU ARRAY DE MEMORIA N_REG_EEPROM_POTES, EN ESTE CASO VALE CERO.
LECTURA_EEPROM_POTES
		BANKSEL	N_POTE
		MOVF 	N_POTE,W 		
		BANKSEL	EEADR
		MOVWF	EEADR 			
		MOVLW	N_REG_EEPROM_POTES	;MUEVE UNA CONSTANTE A W 
		ADDWF	EEADR,F				;Y LO SUMA A LA POSICION DE N_POTE 
		GOTO	CONTINUA_LECTURA
ESCRITURA_EEPROM_POTES
		BCF 	STATUS,RP0 	
		BCF		STATUS,RP1
		MOVF 	N_POTE,W 	
		BSF		STATUS,RP1		
		MOVWF 	EEADR 			
		MOVLW	N_REG_EEPROM_POTES
		ADDWF	EEADR,F 			
		GOTO	CONTINUA_ESCRITURA

		ENDM

		CBLOCK	0X20
		CENT
		MSD
		LSD		
		ENDC
CONVERTIDORES	MACRO	
B2_BCD_7_SEGMENT 
  		CLRF CENT       		;CENTENAS 
 	 	clrf MSD        		;DECENAS 
  		movwf LSD       		;UNIDADES 
gtenth 
		movlw .10 
  		subwf LSD,W 
  		BTFSS STATUS,C 
  		goto OVERHAUL 
  		movwf LSD 
  		incf MSD, F 
  		goto gtenth 
OVERHAUL 
  		MOVLW .10 
  		SUBWF MSD,W 
  		BTFSS STATUS,C 
  		GOTO OVER 
  		MOVWF MSD 
  		INCF CENT,F 
  		GOTO OVERHAUL 
OVER 
		MOVF	CENT,W
		CALL	S_SEGMENT
		MOVWF	CENT

		MOVF	MSD,W
		CALL	S_SEGMENT
		MOVWF	MSD

		MOVF	LSD,W
		CALL	S_SEGMENT
		MOVWF	LSD
  		RETLW 0

	
S_SEGMENT	;PASA A CODE 7 SEGMENTOS
			ADDWF	PCL,F	
			RETLW	B'11000000'
			RETLW	B'11111001'				
			RETLW	B'10100100'
			RETLW	B'10110000'
			RETLW	B'10011001'
			RETLW	B'10010010'
			RETLW	B'10000010'
			RETLW	B'11111000'
			RETLW	B'10000000'
			RETLW	B'10010000'
			ENDM
	;---------------------------------

	OUT_SHIFT_REGISTER	MACRO
	cblock	0X20
	REG_ENV_SPI
	N_DIGITOS
	FSR_TEMP2
	REG_MEM_DISPLAYS		;ATENCION QUE SON TRES DESPUES E ESTE PARA MSD LSD CENT
	ENDC
#DEFINE		LSD	 		REG_MEM_DISPLAYS
#DEFINE		MSD			(REG_MEM_DISPLAYS+.1)
#DEFINE		CENT		(REG_MEM_DISPLAYS+.2)

#DEFINE		LATCHX	PORTD,0					
#DEFINE		CLOKX	PORTD,3
#DEFINE		DATOX	PORTD,2
#DEFINE		N_REG_OUT	.3


ENVIO_POSICIONES
			CALL	B2_BCD_7_SEGMENT	;PASA W DE BINARIO A BCD Y DESPUES A 7 SEGMENTOS, Y LO PONE EN EL ARRAY PARA SALIR		
ENVIA_TEXTOS						;ENVIA LO QUE HAYA EN EL ARRAY DE REGISTROS PARA LAS SALIDAS LSD,MSD,CENT
		BCF		STATUS,RP0			;PAGE 0
		MOVF	FSR,W
		MOVWF	FSR_TEMP2
		MOVLW	N_REG_OUT			;Nº DE REGISTROS A LA SALIDA
		MOVWF	N_DIGITOS
		MOVLW	REG_MEM_DISPLAYS	;DONDE ESTA EL PRIMER BYTE A SACAR EN SERIE
		MOVWF	FSR		
ENVIAR_SPI
		MOVF	INDF,W
LETRA
		MOVWF	REG_ENV_SPI			;DE W A REG_ENV_SPI
		MOVLW	.9					;Nº DE BITS DEL REGISTRO A W 
		MOVWF	N_BITS				;DE W A N_BITS
REMONT		
		DECFSZ	N_BITS,F			;DECREMENTA Nº DE BITS 8-0
		GOTO	ENVIA_BIT			;SALTA A ENVIA_BIT
   		GOTO	COMPLETA			;RETORNA, NO QUEDAN MAS BITS A ENVIAR

ENVIA_BIT
		RLF		REG_ENV_SPI,F		;ROTA A LA IZQUIERDA Y EL BIT DE MAS PESO VA AL CARRY, A LA SIGUIENTE 
									;ESTE VUELVE A ENTRAR POR EL CARRY;Y CUANDO PASAN 8 BITS VUELVE A DEJAR EL QUE ESTABA
		BTFSC	STATUS,C			;TESTEA SI ES CERO O UNO
		GOTO	ENVIA_UNO			;SI FUE CERO NO SALTA Y VA A ENVIA _UNO
			;--------------ENVIA CERO Y ESPERA NUEVO BIT------------------------------------
ENVIA_CERO							;SI FUE CERO SALTA PARA ENVIAR CERO POR EL SPI
		BCF		DATOX				;PONE A CERO RA0
		NOP							;ESPERA PARA ESTABILIZAR
		NOP							;ESPERA PARA ESTABILIZAR
		BSF		CLOKX				;CLOCK EN ALTO RA1 PARA ENVIAR DATO
		NOP							;ESPERA PARA ESTABILIZAR
		NOP							;ESPERA PARA ESTABILIZAR
		BCF		DATOX				;PONE A CERO RA0
		NOP							;ESPERA PARA ESTABILIZAR
		NOP							;ESPERA PARA ESTABILIZAR
		BCF		CLOKX				;PONE A CERO CLOCK PARA ESPERAR NUEVO DATO
		NOP							;ESPERA PARA ESTABILIZAR
		NOP							;ESPERA PARA ESTABILIZAR
		GOTO	REMONT				;RETORNA PARA ENVIAR NUEVO BIT
			;--------------ENVIA UNO Y ESPERA NUEVO BIT-----------------------------------
ENVIA_UNO							;SI EL CARRY ESTABA A UNO, NO SALTÓ 
		BSF		DATOX				;1 EN DATO
		NOP							;ESPERA PARA ESTABILIZAR
		NOP							;ESPERA PARA ESTABILIZAR
		BSF		CLOKX				;CLOCK A UNO PARA ENVIAR DATO
		NOP							;ESPERA PARA ESTABILIZAR
		NOP							;ESPERA PARA ESTABILIZAR
		BCF		DATOX				;PONE A CERO PARA ESPERAR NUEVO DATO
		NOP							;ESPERA PARA ESTABILIZAR
		NOP							;ESPERA PARA ESTABILIZAR
		BCF		CLOKX				;PONE A CERO PARA ESPERAR NUEVO DATO
		NOP							;ESPERA PARA ESTABILIZAR
		NOP							;ESPERA PARA ESTABILIZAR
		GOTO	REMONT				;RETORNA PARA ENVIAR NUEVO BIT
COMPLETA
		DECFSZ	N_DIGITOS,F
		GOTO	OTRO_MAS
		RETURN
LATCH		
		BSF		LATCHX				;SACA LOS DATOS DEL CARRIL SERIE DE LOS 74595 A LAS SALIDAS PARALELO
		NOP
		NOP
		BCF		LATCHX
		NOP
		NOP
		MOVF	FSR_TEMP2,W
		MOVWF	FSR
		RETURN
OTRO_MAS
		INCF	FSR,F
		GOTO	ENVIAR_SPI
		
		ENDM	

EJEMPLO1
		MOVLW	.37		
		CALL	ENVIO_POSICIONES
		CALL	LATCH
EJEMPLO2	; oLE
		MOVLW	S_O
		MOVWF	CENT
		MOVLW	S_L
		MOVWF	MSD
		MOVLW	S_E
		MOVWF	LSD
		CALL	ENVIA_TEXTO
		CALL	LATCH
;LETRAS EN 7 SEGMENTOS
#DEFINE		S_A			B'10001000';a
#DEFINE		S_H			B'10001001';h
#DEFINE		S_O			B'10100011';o
#DEFINE		S_L			B'11000111';l
#DEFINE		S_M			B'10101011';m
#DEFINE		S_U			B'11000001';u
#DEFINE		S_N			B'10101011';n
#DEFINE		S_D			B'10100001';d
#DEFINE		S_E			B'10000110';e
#DEFINE		S_G			B'11000010';g

EJEMPLO3
		MOVLW	B'11011111'		;COLUMNAS PARA TECLADO
		MOVWF	REG_ENV_SPI	
		CLRF	N_DIGITOS
		CALL	LETRA	
		CALL	LATCH


