# Problema Libreria LCD de MikroC



## codemaker22 (Abr 17, 2010)

Hola...

Alguien se ha dado cuenta del problema de utilizar una LCD en MikroC al hacer lo sgte:

Si por ejemplo queremos visualizar un simple contador en la LCD de 00-99. Entonces se crea el sgte codigo:

-Se crea una varia tipo char y una de tipo entero para el contador
-Se imprime en la LCD el valor del contador utilizando una conversión: ShortToString o IntToString, por ejemplo en la FILA 1, COL1
-Se incrementa el contador.

El problema resulta que si quiero imprimir en la FILA 1, COL1 (ej: LcdOut(1,1,txt)) el contador aparece en una columna mas delante(por ejemplo FIL1,COL5).

Lo he probado tanto en la nueva version de MikroC con en la vieja....alguien que le halla pasado esto POR FAVOR COMENTE o realicen el ejercicio.

De antemano gracias....FPAEZ


----------



## iDan (Abr 17, 2010)

Hola codemaker22


A ver... podrias postear tu codigo y el PIC que usas...??


----------



## ByAxel (Abr 17, 2010)

En realidad no es un problema ya que por ejemplo si usa el IntToString necesita de un array con 7 char de longitud y lo que hace es imprimir los 7 char en el LCD. Aquellos que no sean símbolos ascii simplemente no se visualizaran en el LCD es por eso que deja espacios en blanco pero realmente está escribiendo desde FILA1, COL1.

Pero claro esa es una molestia, por lo que la única forma es hacerlo manualmente e incluso varios de sus ejemplos no usan sus propias librerías para ese tipo de conversiones, lo hacen todo manual.


----------



## iDan (Abr 17, 2010)

Vaya respuesta Carlos Alexis...


Sinceramente me entro la duda cuando puso la conversion ShortToString o IntToString ya que nunca la habia usado... entonces siempre e estado realizando todo manualmente... algo por lo cual sea util utilizar este tipo de conversiones en un momento determinado??


----------



## ByAxel (Abr 17, 2010)

Eso depende del caso o si es necesario usarlo para reducir ciertos trabajos; en un ejemplo

```
int dt; 
char txt[7];

void main() {
   dt = 826;
   IntToStr(dt, txt);
}
```

El resultado es:

Podría usar solo las posiciones 4 y 5 del array para usarlos en un determinado trabajo, pero como digo eso depende.

En la imagen se aprecia como es el resultado de la conversión y al mandarlo directamente al LCD lo hace a todo el array incluyendo los espacios.
Es por eso que digo, mejor hacerlo manualmente o usar un bucle for para enviar solo los que son números pero eso ya seria usar más código.


----------



## iDan (Abr 17, 2010)

Seeee... siempre hay un truco, y supongamos que se quisieran eliminar esos espacios en blanco de la cadena (algo asi como Java) si no los llegaramos a necesitar?? se podria hacer eso?? es que yo cuando tenia que hacer un contador no usando este tipo de conversion hacia lo siguiente:


```
char *txt[10]={"0","1","2","3","4","5","6","7","8","9"};
//...
t++;
u=t%10;
d=t/10;
delay_ms(500);
Lcd_Out(1,1,txt[d]);
Lcd_Out(1,2,txt[u]);
```

digo para resumir el programa... ya que con menos lineas es mas facil entender un programa...


----------



## ByAxel (Abr 17, 2010)

No hay forma ya que si se logra extraer esos espacios del array seguiría teniendo 7 bytes y al usar "Lcd_Out" enviaría igual los 7 bytes del array por lo que, lo aconsejable en este caso seria extraer solo los números del array grande y ponerlo en un array más pequeño (no es nada cómodo)...
Lo peor es que el valor convertido a string nunca tendría la misma longitud (1 dígito, 2 dígitos, 3 dígitos, signo, 4 dígitos, etc)... entonces la idea de pasar del array grande al pequeño se pone más compleja...

Una solución seria:

```
dt = 826;
   IntToStr(dt, txt);

   for(a=0 ; a<strlen(txt) ; a++){
      if(txt[a]>='0' && txt[a]<='9'){
         Lcd_Chr(1,a+1,txt[a]);
      }
   }
```

De esa manera solo escribiría los números en el LCD y en la posición deseada.
Tan solo es una idea que pude ser usada en un sub o función; corrígeme si me equivoco.


----------



## iDan (Abr 17, 2010)

Si... la verdad no quedando de otra (no poder borrar los espacios), extraer el dato requerido por medio de ciclos como el for seria la mejor forma... media vez no sea una cadena muy grande... de otra manera solo quedaria hacerlo manualmente...


Saludos Carlos Alexis


----------



## codemaker22 (Abr 18, 2010)

Bueno siguiendo con el tema, por aca encontre una solución. La probre y funciona de lujo...

// Remove leading blanks
//
j=0;
for(i=0;i<=11;i++)
{
if(op_ != ' ') // If a blank
{
lcd[j]=op;
j++;
}
}
//
// Display result on LCD
//
Lcd_Out(1,6,lcd); // Output to LCD

La pueden probar y se daran cuenta que si funciona.

F.PAEZ _


----------

