Ayuda para optimizar codigo de RTC con compilador Hi-Tech C18

Hola gente, como andan? hace unos dias subi un post en el que presentaba algunas dudas de como controlar el RTC DS1307. Hoy, ya con esas dudas aclaradas, se me presetan otras. Ahora no se como hacer para presentar de manera correcta la inforamcion en un lcd. Esto usando la libreria lcd.c que incorpora el Hi-Tech c18, la cual no se que tan buena es.

A continuacion les subo el codigo que estoy usando, si yo quiero ver solo los segundos funciona bien, el problema es que cuando pongo varias lineas de lcd_puts(variable) el lcd se queda sin mostrar nada.

Ademas, necesitaria saber si existe alguna forma de optimizar este codigo, ya que lo veo de forma muy paso a paso.

Ultima cosa, tengo entendido que el ds1307 devuelve sus datos en formato BCD. Yo de la unica forma que logre que los datos se mostraran de forma correcta fue haciendo un sprintf(seg,"%2.0x",s);. Por que si devuelve en BCD me funciona poniendo el sprintf en fomrato de hexadecimal.

Bueno eso es todo, abajo el codgo les dejo.
Saludos y muchas gracias.
Código:
void leer_ds1307(void)
{
	
	char s, m, h, d, D, M, A, seg[2], min[2], hrs[2], ndia[2], dia[2], mes[2], ano[2];

	
#ifdef I2C_MODULE
SSPMode(MASTER_MODE);
SSPEN = 1;
CKP = 1;
#else
SCL_DIR = I2C_OUTPUT;
SDA_DIR = I2C_OUTPUT;
SDA = 0;
SCL = 0;
#endif

	i2c_WriteTo(0xD0);// Setea par poder escribir el registro de posicion de memoria
	i2c_PutByte(0x00);// se posiciona el registro de posicion en los segundos
	
	i2c_ReadFrom(0xD1);
	
	s = i2c_GetByte(I2C_MORE);
	m = i2c_GetByte(I2C_MORE);
	h = i2c_GetByte(I2C_MORE);
	d = i2c_GetByte(I2C_MORE);
	D = i2c_GetByte(I2C_MORE);
	M = i2c_GetByte(I2C_MORE);
	A = i2c_GetByte(I2C_LAST);
	i2c_Stop();
	
	DelayMs(200);
	
	sprintf(seg,"%2.0x",s);
	sprintf(min,"%2.0x",m);
	sprintf(hrs,"%2.0x",h);
	sprintf(ndia,"%2.0x",d);
	sprintf(dia,"%2.0x",D);
	sprintf(mes,"%2.0x",M);
	sprintf(ano,"%2.0x",A);
	
	lcd_puts(seg); //	DE ESTA FORMA SI FUNCIONA. PERO CUANDO
	//~ lcd_puts(hrs);	DECOMENTO LAS SIGUIENTES LINEAS, EL LCD
	//~ lcd_puts(":");	DEJA DE MOSTRAR LA INFORMACION
	//~ lcd_puts(min);
	//~ lcd_puts(":");
	//~ lcd_puts(seg);
	
	
	DelayMs(200);
	lcd_clear();
	
	
	
}
 
Atrás
Arriba