Holaaaa!!!bueno, no podia dormi en un viaje que tuve que hacer, asi que empece a escribir esta libreria....bien, para los que utilicen display"s de 7 segmentos multiplexados les sera de gran ayuda y utilidad dicha libreria, ya que este dispositivo, el SAA1064, se encarga de el manejo de display"s de 7segmentos.
Lo interesante de dicho dispositivo, es que el manejo de los display"s es mediante el bus I2C, es decir dos pines simplemente!!!, hacer cuentas y vereis que es una ventaja, digamos que tenemos que usar 4 display"s de 7seg, ahorrando patitas del micro, le mandaremos los datos en bcd asi solo usamos 4 pines, a esos cuatro se le añaden los de control de los display"s, con dos pines y un decodificador se pueden manejar, eso hace una suma total de 6 pines!, en cambio si usamos el SAA1064 simplemente tendremos que usar dos pines!!!.
El manejo del dispositivo es facil, mandamos la informacion que queremos visualizar en los display"s y en cuanto se la enviemos nos podemos olvidar ya de los display"s ya que el saa1064 se encarga de su correcta visualizacion.
Bien, no es mi intencion en este post realizar una explicacion detallada del dispositivo, aconsejo que mireis su data sheet, aqui el espacio que dedica Philips al
SAA1064, pero resaltar que el SAA1064 puede funconar en modo dinamico( es decir multiplexando los display"s -> un total de 4 display"s) o en modo estatico(manejo de dos display"s), tambien podremos configurar la iluminosidad de los digitos configurando previamente el dispositivo.
Bueno aqui la libreria:
BR]///////////////////////////////////////////////////////////////////////////////////////////
/// VsZeNeR"06 ///
/// 29/Enero/06 ///
/// ///
/// Libreria: vs_saa1064.c Compilador: CCS ///
/// Version: 0.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() -> inicializacion del dispositivo ///
/// ///
/// 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 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; //variable que almacena la configuracion
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(0b01110000); //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(0b01110000); //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(0b01110000); //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(0b01110000); //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(){ //funcion para inicializar saa1064
output_float(SAA1064_SDA);
output_float(SAA1064_SCL);
}
Suerte!!!