///////////////////////////////////////////////////////////////////////////////////////////
///		VsZeNeR'06								///
///	        22/Mayo/06								///
///	    vszener@gmail.com								///
///											///
///	Libreria: vs_saa1064M.c 	Compilador: CCS					///
///	Version: 1.0									///
///											///
///  	Notas: Controlador para manejo del dispositivo saa1064   			///
///            de Philips.                                       	 		///
///  	       Este dispositivo se encarga, mediante I2C, del tratamiento de    	///
///	       display's de 7segmentos, lo puede hacer en modo 'estatico' donde 	///
///	       simplemente manejara 2 display's o en modo 'dinamico' donde      	///
///	       puede manipular cuatro display's de 7segmentos mediante la       	///
///	       multiplexacion de los mismos.						///
/// 											///
///	Funciones:  saa1064_init(int address)-> inicializa dispositivo, hay que 	///
///						la direccion del saa1064 a usar, la	///
///						direccion en hex!!!			///
///											///
///						Direcciones:(ADR=address)		///
///						¨¨¨¨¨¨¨¨¨¨¨¨				///
///						· 0x70 -> GND				///
///						· 0x72 -> 3/8 Vcc			///
///						· 0x74 -> 5/8 Vcc			///				
///						· 0x76 -> Vcc				///
///											///
///		    saa1064_conf(int X_C6_C5_C4_C3_C2_C1_C0)				///
///				       -> Configura dispositivo	                	///
///											///
///		    saa1064_putc(int D2,INT D1) -> Modo 'ESTATICO' 			///
///					·D1 -> Digito primero (codigo 7seg!!!)       	///
///					·D2 -> Digito segundo (codigo 7seg!!!)		///
///											///
///		    saa1064_putc(int D4,int D3,int D2,INT D1) -> Modo 'DINAMICO'	///
///					·D1 -> Digito primero (codigo 7seg!!!)  	///
///					·D2 -> Digito segundo (codigo 7seg!!!)		///
///					·D3 -> Digito tercero (codigo 7seg!!!)      	///
///					·D4 -> Digito cuarto  (codigo 7seg!!!)		///
///											///
///		    saa1064_subaddress(int address,int digito) -> cambio rapido del 	///
///					valor de un digito.Antes de llamar a esta	///
///					funcion,debemos guardar el valor de los demas	///
///					digitos previamente.				///
///					·address -> SC_SB_SA (digito 1 al digito 4) Din	///
///					·address -> SC_SB_SA (digito 1 al digito 2) Est	///
///					·digito  -> nuevo valor				///
///											///
///	Para que el dispositivo funcione correctamente debemos inicializarlo con una 	///
///	direccion correcta y configurarlo, una vez realizado estos pasos podremos 	///
///	escribir en él sin problemas.							///
///											///
///	Subdirecciones:									///
///     ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨                                                   		///       
///		SC SB SA  FUNCION							///
///	 	0  0  0  registro de control						///
///	 	0  0  1  digito 1							///
///	 	0  1  0  digito 2							///
///	 	0  1  1  digito 3							///
///	 	1  0  0  digito 4							///
///	 	1  0  1  no usado(reservado)						///
///	 	1  1  0  no usado(reservado)						///
///	 	1  1  1  no usado(reservado)						///
///											///
///	Bits de control:    X C6 C5 C4 C3 C2 C1 C0					///
///	¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨								///
///		C0=0	modo estatico->digitos 1 y 2					///
///		C0=1	modo dinamico->digitos 1&3 y 2&4 alternativamente		///
///		C1=0/1	digitos 1&3 no parpadep/parpadeo				///
///		C2=0/1	digitos 2&4 no parpadep/parpadeo				///
///		C3=1	test segmentos							///
///		C4=1	+3mA de salida							///
///		C5=1	+6mA de salida							///
///		C6=1	+12mA de salida							///
///											///
///	·Libreria solamente provada en simulador PROTEUS				///
///////////////////////////////////////////////////////////////////////////////////////////

// Para usar modo 'DINAMICO' poner la siguiente declaracion en el programa principal(antes de incluir la libreria!)
// #define SAA1064_DINAMICO

#ifndef SAA1064_SCL		//para definir los pines de manejo del saa1064...
#define SAA1064_SCL PIN_B0
#define SAA1064_SDA PIN_B1
#endif				//...en caso de no ser definidos en el programa principal

#use i2c(master,sda=SAA1064_SDA, scl=SAA1064_SCL)	//i2c

int control,ADR;					//control:variable que almacena la configuracion ; ADR:almacena dir.

void saa1064_subaddress(int address,int digito){	//funcion subdirecciones de digitos
   address=(0x07 & address);				//me quedo con los 3bit's menos significativos de la direccion

#if defined SAA1064_DINAMICO	//modo DINAMICO para cambiar digitos   
   if(address>0x00 && address<0x05){			//solo direcciones permitidas
   	i2c_start();					
   	i2c_write(ADR);					//direccion esclavo
   	i2c_write(address);				//la direccion del digito a cambiar
   	i2c_write(digito);				//cambia digito
   	i2c_stop();
   }
#else				//modo ESTATICO para cambiar digitos
   if(address==0x02)					//direccion del digito 2 en modo estatico
	address=0x03;

   if(address==0x01 || address==0x03){			//solo direcciones permitidas 0(digito 1) y 3(digito2)
   	i2c_start();					
   	i2c_write(ADR);					//direccion esclavo
   	i2c_write(address);				//la direccion del digito a cambiar
   	i2c_write(digito);				//cambia digito
   	i2c_stop();
   }
#endif
}

void saa1064_conf(int X_C6_C5_C4_C3_C2_C1_C0){		//funcion para configurar el saa1064
   control=X_C6_C5_C4_C3_C2_C1_C0;       
}

#if defined SAA1064_DINAMICO	//modo DINAMICO para escribir los digitos

	void saa1064_putc(int D4,int D3,int D2,int D1){	
	control=(control | 0b00000001);	//me aseguro modo dinamico
        i2c_start();
   	i2c_write(ADR);		//direccion esclavo
   	i2c_write(0x00);	//instruction byte -> registro de control
   	i2c_write(control);	//control byte	

   	i2c_write(D1);		//escribe digito 1
   	i2c_write(D2);		//escribe digito 2
   	i2c_write(D3);		//escribe digito 3
   	i2c_write(D4);		//escribe digito 4	
   	i2c_stop();
	}
#else				//modo ESTATICO para escribir los digitos

	void saa1064_putc(int D2,int D1){
	control=(control & 0b01111110);	//me aseguro modo estatico
        i2c_start();
   	i2c_write(ADR);		//direccion esclavo
   	i2c_write(0x00);	//instruction byte -> registro de control
   	i2c_write(control);	//control byte

   	i2c_write(D1);		//escribe digito 1
	i2c_write(0);		//libre
   	i2c_write(D2);		//escribe digito 2
	i2c_write(0);		//libre
   	i2c_stop();
	}
#endif

void saa1064_init(int address){		//funcion para inicializar saa1064
   ADR=address;				//almaceno la direccion
}

void saa1064_stop(void){
   i2c_stop();
}