Autor Tema: Problema con desplegado de elementos de cadena en Lcd  (Leído 2166 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado charlosh

  • PIC10
  • *
  • Mensajes: 12
Problema con desplegado de elementos de cadena en Lcd
« en: 11 de Marzo de 2010, 04:32:32 »
Buenas noches, estoy trabajando en un proyecto en el que utilizo cadenas de dos dimensiones en el PCWHD, para desplegar mensajes en un LCD 2x16 segun sea el caso.
En el programa en la seccion de declaraciones globales tengo

const char valorp1[20][16]={"uno","dos","tres",........,"dieciseis","diecisiete","dieciocho","diecinueve","veinte"};

El asunto es que cuando lo simulo en el Proteus, y mando en un Void a desplegar en el Lcd los mensajes incrementando el puntero, me los despliega bien hasta llegar al elemento dieciseis,  despues del cual continua deplegandome el elementoo "uno"  , luego el elemento "dos" y asi sucesivamente  se hace un loop, pero nunca me despliega los elementos "diecisiete","dieciocho","diecinueve"y"veinte" aunque el puntero si incremente su valor a 17,18,19 y 20 (visualizado en la watch windows del Proteus).

No se si sea cuestion de que las matrices esten limitadas a un valor maximo de elementos o  la declaracion de alguna variable,de hecho valor ya lo he declarado como int y como int16 y no ha habido cambio., he buscado algo de información acerca de esto pero no he encontrado  donde venga este dato, o tal vez no la he sabido interpretar correctamente.

Por si alguien me puede ayudar o si tiene conocimiento acerca de esto.

Saludos.

Desconectado charlosh

  • PIC10
  • *
  • Mensajes: 12
Re: Problema con desplegado de elementos de cadena en Lcd
« Respuesta #1 en: 11 de Marzo de 2010, 04:44:18 »
sorry,se me olvido poner que estoy utilizando un 16F877A, con un teclado matricial 4x4 y Lcd 2x16.

saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con desplegado de elementos de cadena en Lcd
« Respuesta #2 en: 11 de Marzo de 2010, 08:30:28 »
En CCS el array constante no puede ser mayor a 256 datos, por eso que solo te muestra hasta la fila 256. Es raro que no te haya mostrado un error al compilar, que yo recuerde, en mi caso me lo indico  :?

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con desplegado de elementos de cadena en Lcd
« Respuesta #3 en: 11 de Marzo de 2010, 09:32:14 »
Tiene bastante lógica ese "problema" de CCS, ya que seguramente se debe a como está implementada la lectura de la tabla de los caracteres.

¿Probaste directamente con un puntero.... aunque no creo que haya mayores diferencias?

Código: C
  1. const char *Texto[20] = {"uno","dos","tres"........};
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado charlosh

  • PIC10
  • *
  • Mensajes: 12
Re: Problema con desplegado de elementos de cadena en Lcd
« Respuesta #4 en: 11 de Marzo de 2010, 13:36:04 »
Buenos dias Suky, el programa compila sin error, pero creo que el asunto viene por ahi ya que hice una prueba y modifique las cadenas (le borre 4 caracteres a cada una y en vez de enviar a desplegar (16) le envio a desplegar en cada caso (12)) y ya con esto si me llego a desplegar hasta el elemento 20. Cuando me apareció este problema yo me fui por pensar que era un problema de tipo declaracion de variable. ¿Ahi algun  truco para tratar de poner cadenas mas largas ?


const char valorp1[20][12]={"uno","dos","tres",........,"dieciseis","diecisiete","dieciocho","diecinueve","veinte"};


AngelGris si probe con punteros y paso el mismo problema.

Gracias y hasta luego.


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con desplegado de elementos de cadena en Lcd
« Respuesta #5 en: 11 de Marzo de 2010, 13:50:14 »
Hay que dividir en varios buffer  :( No queda otra.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado charlosh

  • PIC10
  • *
  • Mensajes: 12
Re: Problema con desplegado de elementos de cadena en Lcd
« Respuesta #6 en: 13 de Marzo de 2010, 09:44:03 »
Buenos dias, basandome en un tutorial de Migsantiago, trate de dividir mi buffer en varias secciones (8 diferentes arreglos para cubrir los 60 diferentes numeros de parte),  despues desde un Void tratar de enviarlos al Lcd  segun sea el valor de la variable Cadena direccionando previamente el menu (8 diferentes) en el cual se encuentra el elemento a deplegar con una instruccióon IF.

Me trabaja bien, hace exactamenmte lo que quiero, me imprime el valor del elemento que yo quiero de las diferentes cadenas ,pero me consume hasta el 60 % de memoria ROM   y como pienso dejar el programa preparado para en el futuro cubrir hasat 100 numeros de parte pues hice algunas pruebas, como verán (mas abajo pongo esa parte del codigo) yo utilizo 4 instrucciones IF (menu<=a un contador) y cada una lleva cuatro instrucciones : dos lcd_goto y dos prinf.

Ahora bien haciendo una prueba y dejando activas todas las cadenas y solo la primera seccion del Void :la  primer instruccion  IF(menu<=15)(dos lcd_goto y dos prinf) y poniendo como comentario todo el bloque cubriendo las otras tres situaciones cubiertas por las otras instrucciones IF. Mando a compilar y el programa y me consume 38% de ROM.
Y si yo sigo haciendo pruebas y le deshabilito esa unica instruccion If (no mandar a deplegar datos al Lcd), me consume solo el 30%.

Por lo que veo que el uso de las cuatro instrucciones en cada seccion de los IF en este programa me consumen muchos recursos . Hace tiempo desarrollé un programa en el que tambien  use  varias veces grupos de 4 instrucciones (dos lcd_goto y 2 prinf) y en ese programa con las pruebas que hice semejantes a las realizadas esta vez: deshabilitando esa seccion del programa, se me traduzco a solo 1% de ahorro de ROM) en aquel caso no estaban utilizando pointers y cadenas para la selección de lo que se iba a imprimir.

Por lo que no se si dependiendo del tipo de  datos que se manden a desplegar ( int, charts,char constant, elementos de cadenas,  etc) sea del consumo de recursos.

Mi pregunta es si  ¿acaso existe alguna forma de utilizar en mi caso solo una sola vez las instrucciones que estan en el primer IF (2 lcd-goto y dos prinf ) para imprimir todas las otras cadenas tambien? Explicado de otra forma, como puedo hacer que el valor de menup0 adopte el nombre de menup1, o el de menup2, etc, para asi yo mandar a llamar en el programa a la cadena de una forma general   menu(numero pointer a utilizar)   y ya solo preocuparme por asignarle el valor a: (numero de pointer a utilizar).  Y no hacer llamados individuales de cada cadena menup1, menup2, menup3, menup4, etc. lo cual implica el uso de mas veces de las instrucciones prinf.

O sea como ir variando el nombre de menup1 por el nombre de menup2, etc, ya que se tratan de pinters.

Hasta luego y espero su ayuda.

Void ImprimeLCD(int x, int y, int menu, int cadena)
{
//lcd_gotoxy(1,2);
cadena=CNT;

IF (MENU<=15){
        lcd_gotoxy(1,1);                                         //para imprimir en la primeroa linea del Lcd
        printf(lcd_putc, "%s", menup0[cadena]);      //imprime el valor del elemento (cadena) del menup0
       
        lcd_gotoxy(1,2);                                         //para imprimir en la segunda linea del Lcd
         printf(lcd_putc, "%s", menup6[cadena]);}    //imprime el valor del elemento (cadena) del menup0
/*
IF ((MENU>15)&&(MENU<=31)){

        lcd_gotoxy(1,1);
        printf(lcd_putc, "%s", menup1[cadena]);      //imprime el valor del elemento (cadena) del menup1
 
        lcd_gotoxy(1,2);
         printf(lcd_putc, "%s", menup7[cadena]);}    //imprime el valor del elemento (cadena) del menup7
     

IF ((MENU>31)&&(MENU<=47)){
        lcd_gotoxy(1,1);
        printf(lcd_putc, "%s", menup2[cadena]);       //imprime el valor del elemento (cadena) del menup2
       
        lcd_gotoxy(1,2);
         printf(lcd_putc, "%s", menup8[cadena]);}    //imprime el valor del elemento (cadena) del menup8
       
IF ((MENU>47)&&(MENU<=59)){
        lcd_gotoxy(1,1);
        printf(lcd_putc, "%s", menup3[cadena]);       //imprime el valor del elemento (cadena) del menup3
       
        lcd_gotoxy(1,2);
         printf(lcd_putc, "%s", menup9[cadena]);}     //imprime el valor del elemento (cadena) del menup9




NOTA: los menus: menup4,menup5 no los tengo declarados ,  y no los utilizo por el momento, porque los deje de reserva para en el futuro meter mas numeros de parte en esas cadenas,