///////////////////////////////////////////////////////////////////////////////////////////
/// 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();
}