Autor Tema: Menu 3 opciones con lcd 20x4  (Leído 3015 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Menu 3 opciones con lcd 20x4
« en: 27 de Mayo de 2023, 07:19:13 »
Hola , Estoy realizando un Menu de 3 opciones en pic c compiler con un lcd 20x4 y el pic 18f2550 .Soy bastante principiante.
Me ha surgido uno o varios problemas al visualizar en display cuando enciendo a veces me salen en todo el lcd un montón de caracteres aleatorios y no consigo ver el menú. Y otras veces puedo ver el menú pero solo visualiza el encabezado del menú y opción 1 .El resto no se ve nada y cuando me intento mover con el pulsador A1 no visualizo que se mueva el símbolo ">" hacia arriba o hacia abajo  y con el pulsador A2 selecciono la opción en la que quiero entrar. Y a veces entra pero solo en la opción 1 ,nunca en el resto de opciones.
La librería del LCD.C es la que utilizo ya que la del LCD420.c no he conseguido que me funcione. No se en que me estoy equivocando he probado de todo y no veo la solución . No se que hacer ... pongo el codigo hasta donde he llegado.

#include <18F2550.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)   // reloj a 4 MHz.
#define LCD_ENABLE_PIN PIN_C0 //
#define LCD_RS_PIN PIN_C1
#define LCD_RW_PIN PIN_C2
#define LCD_DATA4 PIN_B2
#define LCD_DATA5 PIN_B3
#define LCD_DATA6 PIN_B4
#define LCD_DATA7 PIN_B5
#include <LCD.C>
//#include <LCD420.C>
#use standard_io(A)
#define BUTTON_UP_PIN PIN_A1
#define BUTTON_ENTER_PIN PIN_A2

#define MENU_OPTION_COUNT 3

const char* menuOptions[MENU_OPTION_COUNT][3] = {"Opcion 1","Opción 2","Opcion 3"};

int selectedOption = 0;

void displayMenu() {
   lcd_putc('\f');  // Limpiar la pantalla
   
   lcd_gotoxy(1, 1);
   printf(lcd_putc, "Seleccione opcion:");
   
   lcd_gotoxy(1, 2);
   if (selectedOption == 0)
      printf(lcd_putc, "> %s", menuOptions[0]);
   else
      printf(lcd_putc, "  %s", menuOptions[0]);
   
  lcd_gotoxy(1, 3);
  if (selectedOption == 1)
    printf(lcd_putc, "> %s", menuOptions[1]);
  else
   printf(lcd_putc, "  %s", menuOptions[1]);
   
  lcd_gotoxy(1, 4);
  if (selectedOption == 2)
   printf(lcd_putc, "> %s", menuOptions[2]);
 else
  printf(lcd_putc, "  %s", menuOptions[2]);
}

void main() {
   lcd_init();
   lcd_putc('\f');  // Limpiar la pantalla inicialmente
   delay_ms(100);
   
   while (TRUE) {
      displayMenu();
     
      if (input(BUTTON_UP_PIN)) {
         delay_ms(200);  // Rebote
         
         selectedOption--;
         if (selectedOption < 0)
            selectedOption = MENU_OPTION_COUNT - 1;
      }
     
      if (input(BUTTON_ENTER_PIN)) {
         delay_ms(200);  // Rebote
         
         switch (selectedOption) {
            case 0:
               // Acciones para la opción 1
               lcd_putc('\f');
               lcd_gotoxy(1, 1);
               printf(lcd_putc, "Opcion 1 seleccion");
               delay_ms(2000);
               break;
               
            case 1:
               // Acciones para la opción 2
               lcd_putc('\f');
               lcd_gotoxy(1, 1);
               printf(lcd_putc, "Opcion 2 seleccion");
               delay_ms(2000);
               break;
               
            case 2:
               // Acciones para la opción 3
               lcd_putc('\f');
               lcd_gotoxy(1, 1);
               printf(lcd_putc, "Opcion 3 seleccion");
               delay_ms(2000);
               break;
               
            default:
               break;
         }
      }
   }
}

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
Re:Menu 3 opciones con lcd 20x4
« Respuesta #1 en: 27 de Mayo de 2023, 11:48:09 »
hola  genti
estas seguro que el controlador que usa tu lcd es el HD44780U

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Menu 3 opciones con lcd 20x4
« Respuesta #2 en: 27 de Mayo de 2023, 11:49:19 »
El error principal está en la declaración:
Código: [Seleccionar]
#define MENU_OPTION_COUNT 3
const char* menuOptions[MENU_OPTION_COUNT][3] = {"Opcion 1","Opción 2","Opcion 3"};
Al declararse const se guarda en la memoria de programa y ahí no se pueden usar punteros porque las variables se guardan de manera diferente.
Como printf internamente usa punteros ==> No va a andar.  Declaralo:
Código: [Seleccionar]
#define MENU_OPTION_COUNT 3
char* menuOptions[MENU_OPTION_COUNT] = {"Opcion 1","Opción 2","Opcion 3"};

Otro error es haber declarado int selectedOption , porque en CCS los int son unsigned por defecto, y cuando comparás:
Código: [Seleccionar]
if (selectedOption < 0)no se va a cumplir nunca.

Y otro es repetir inútilmente displayMenu() en cada ciclo del while (como si fuera una instrucción instantánea ) , solamente se debe ejecutar cuando se verifique alguno de los IFs.

Ah, en "Opción 2" , la o con acento no te la va a reconocer.
« Última modificación: 27 de Mayo de 2023, 12:36:10 por Eduardo2 »

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:Menu 3 opciones con lcd 20x4
« Respuesta #3 en: 27 de Mayo de 2023, 15:26:16 »
hola  genti
estas seguro que el controlador que usa tu lcd es el HD44780U
hola Sispic , no estoy seguro del controlador que utiliza porque por la ref. 2004A V1.1 y datasheet pone otro tipo de controlador ,pero lo he utilizado con otros programas y me funciona perfectamente .Al utilizar la libreria LCD.c . Cuando utilizo mas de 2 lineas la 3ª y 4ª linea engaño al lcd poniendo (21,1) y (21,2) . Este lo adquirí en aliexpress.

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:Menu 3 opciones con lcd 20x4
« Respuesta #4 en: 27 de Mayo de 2023, 15:37:10 »
El error principal está en la declaración:
Código: [Seleccionar]
#define MENU_OPTION_COUNT 3
const char* menuOptions[MENU_OPTION_COUNT][3] = {"Opcion 1","Opción 2","Opcion 3"};
Al declararse const se guarda en la memoria de programa y ahí no se pueden usar punteros porque las variables se guardan de manera diferente.
Como printf internamente usa punteros ==> No va a andar.  Declaralo:
Código: [Seleccionar]
#define MENU_OPTION_COUNT 3
char* menuOptions[MENU_OPTION_COUNT] = {"Opcion 1","Opción 2","Opcion 3"};

Otro error es haber declarado int selectedOption , porque en CCS los int son unsigned por defecto, y cuando comparás:
Código: [Seleccionar]
if (selectedOption < 0)no se va a cumplir nunca.

Y otro es repetir inútilmente displayMenu() en cada ciclo del while (como si fuera una instrucción instantánea ) , solamente se debe ejecutar cuando se verifique alguno de los IFs.

Ah, en "Opción 2" , la o con acento no te la va a reconocer.
Hola Eduardo2 ,
Bueno he corregido los errores que me indicas y ahora ya me sale el menu en pantalla con el puntero ">" y la opcion 1
                                                                                                                                                               opcion 2
                                                                                                                                                               opcion 3
Pero al pulsar boton A1 el puntero no se mueve se queda siempre quieto en opcion 1.  Y si pulso Boton A2(seleccion) , no entra en la opcion.
De lo que me indicas que he de corregir no he entendido :
int selectedOption[/b] , porque en CCS los int son unsigned por defecto, y cuando comparás:
Código: [Seleccionar]
if (selectedOption < 0)Ya que si elimino la declaracion de la variable : int selectedOption=0   .   me da error de compilacion .Osea que voy perdido. Y no se que he de modicar o quitar..

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Menu 3 opciones con lcd 20x4
« Respuesta #5 en: 27 de Mayo de 2023, 17:27:13 »
,,,
De lo que me indicas que he de corregir no he entendido :
int selectedOption[/b] , porque en CCS los int son unsigned por defecto, y cuando comparás:
Código: [Seleccionar]
if (selectedOption < 0)Ya que si elimino la declaracion de la variable : int selectedOption=0   .   me da error de compilacion .Osea que voy perdido. Y no se que he de modicar o quitar..
No, lo que tenías que hacer era declarar signed int selectedOption=0  ;

En entornos x86 et tipo int es signed por defecto, pero en microcontroladores suele ser al revés.

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:Menu 3 opciones con lcd 20x4
« Respuesta #6 en: 28 de Mayo de 2023, 18:17:31 »
,,,
De lo que me indicas que he de corregir no he entendido :
int selectedOption[/b] , porque en CCS los int son unsigned por defecto, y cuando comparás:
Código: [Seleccionar]
if (selectedOption < 0)Ya que si elimino la declaracion de la variable : int selectedOption=0   .   me da error de compilacion .Osea que voy perdido. Y no se que he de modicar o quitar..
No, lo que tenías que hacer era declarar signed int selectedOption=0  ;

En entornos x86 et tipo int es signed por defecto, pero en microcontroladores suele ser al revés.

Hola Eduardo2 , Bueno lo he declarado como Signed Int selectedOption=0 . Ahora el Menú se queda el símbolo ">" en la opción 1 y pulsando el A1 no se mueve hacia abajo ,pero si pulso botón A2( Select) , entra en la "Opcion 1" y desde hay si dejo pasar unos segundos si pulso Botón A1(UP/DOWN) y luego Botón A2 (select) salta a la opción 2 y 3 ( sin pasar por el Menú principal) .Pero no sale al Menú principal. Y claro lo que no se mueva el puntero en el menú principal no se a que debe ser y me gustaría que si entro en una opcion pudiera salir al menu principal pulsando por ejemplo el boton A2 (select) . He estado probando pero no consigo arreglarlo ...

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Menu 3 opciones con lcd 20x4
« Respuesta #7 en: 28 de Mayo de 2023, 18:21:05 »
Subí el código

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:Menu 3 opciones con lcd 20x4
« Respuesta #8 en: 29 de Mayo de 2023, 18:18:36 »
Subí el código

Hola ,
vuelvo a subir el código :

#include <18F2550.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)   // reloj a 4 MHz.
#define LCD_ENABLE_PIN PIN_C0
#define LCD_RS_PIN PIN_C1
#define LCD_RW_PIN PIN_C2
#define LCD_DATA4 PIN_B2
#define LCD_DATA5 PIN_B3
#define LCD_DATA6 PIN_B4
#define LCD_DATA7 PIN_B5
#include <LCD.C>
//#include <LCD420.C>
#use standard_io(A)
#define BUTTON_UP_PIN PIN_A1
#define BUTTON_ENTER_PIN PIN_A2
#define MENU_OPTION_COUNT 3

char* menuOptions[MENU_OPTION_COUNT] = {"Opcion 1","Opcion 2","Opcion 3"};

signed int selectedOption =0;

void displayMenu() {
   lcd_putc('\f');  // Limpiar la pantalla
    lcd_gotoxy(1, 1);
      printf(lcd_putc, "Seleccione opcion:");
 
   lcd_gotoxy(1, 2);
     if (selectedOption == 0)
      printf(lcd_putc, "> %s", menuOptions[0]);
   else
      printf(lcd_putc, "  %s", menuOptions[0]);
   
  lcd_gotoxy(21, 1);
    if (selectedOption == 1)
    printf(lcd_putc, "> %s", menuOptions[1]);
  else
    printf(lcd_putc, "  %s", menuOptions[1]);
   
  lcd_gotoxy(21, 2);
  if (selectedOption == 2)
   printf(lcd_putc, "> %s", menuOptions[2]);
 else
  printf(lcd_putc, "  %s", menuOptions[2]);
}

void main() {
   lcd_init();
    lcd_putc('\f');  // Limpiar la pantalla inicialmente
     delay_ms(100);
 
          displayMenu();
     
      if (input(BUTTON_UP_PIN)) {
         delay_ms(200);  // Rebote
         
         selectedOption--;
         if (selectedOption < 0)
            selectedOption = MENU_OPTION_COUNT - 1;
     
      }
     
      if (input(BUTTON_ENTER_PIN)) {
         delay_ms(200);  // Rebote
         
         switch (selectedOption) {
            case 0:
               // Acciones para la opción 1
               lcd_putc('\f');
               lcd_gotoxy(1, 1);
               printf(lcd_putc, "Opcion 1 seleccion");
             
             
              delay_ms(1000);
               break;
               
            case 1:
               // Acciones para la opción 2
               lcd_putc('\f');
               lcd_gotoxy(1, 1);
               printf(lcd_putc, "Opcion 2 seleccion");
               delay_ms(1000);
               break;
               
            case 2:
               // Acciones para la opción 3
               lcd_putc('\f');
               lcd_gotoxy(1, 1);
               printf(lcd_putc, "Opcion 3 seleccion");
         
              delay_ms(1000);
               break;
               
            default:
               break;
         }
     
      }
   }
}


Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Menu 3 opciones con lcd 20x4
« Respuesta #9 en: 29 de Mayo de 2023, 19:52:35 »
Subí el código

Hola ,
vuelvo a subir el código :
.....

Ok, pero tratá de subir el que estabas usando.  A ése le sobra una "}"  y se ejecuta una sola vez porque le falta el while.

Además, si esa librería LCD.C es la que viene con el CCS no te va a funcionar porque es para displays  de 2 líneas.

Usá la LCD420.C que sí es para 4 líneas.  Eso si, acordate que las líneas de control y datos ya tienen un orden prefijado, no podés poner datos en un puerto y líneas de control en otro.

-----------------------------------------------------------------------------

Ejemplo:

http://

* LCD420.jpg
(56.02 kB, 909x359 - visto 311 veces)


Código: [Seleccionar]
#include <18F2550.h>
#FUSES XT,NOWDT
#use delay(crystal=4000000)     // reloj a 4 MHz.

#include <LCD420.C>

#use standard_io(A)
#define BUTTON_UP_PIN    PIN_A1
#define BUTTON_ENTER_PIN PIN_A2

#define MENU_OPTION_COUNT 3

signed int selectedOption = 0;

void displayMenu() {
    lcd_putc('\f');  // Limpiar la pantalla

    lcd_gotoxy(1, 1);  printf(lcd_putc, "Seleccione opcion:");

    for(int8 k=0;k<3;k++){
        lcd_gotoxy(1, k+2);
        if(selectedOption == k) printf(lcd_putc, ">") ;
        else                    printf(lcd_putc, " ");
        printf(lcd_putc, " Opcion %u", k+1);
    }
}

void main() {
   lcd_init();
   lcd_putc('\f');      // Limpiar la pantalla inicialmente
   delay_ms(100);

   displayMenu();
   while (TRUE) {

      if (input(BUTTON_UP_PIN)) {
         selectedOption--;
         if (selectedOption < 0)  selectedOption = MENU_OPTION_COUNT - 1;
         displayMenu();
         delay_ms(300);     // Rebote
      }

      if (input(BUTTON_ENTER_PIN)) {
         lcd_putc('\f');
         lcd_gotoxy(1, 1);
         printf(lcd_putc, "Opcion %u seleccion",selectedOption+1);
         delay_ms(1000);
         
         displayMenu();
      }
   }
}

« Última modificación: 30 de Mayo de 2023, 00:49:12 por Eduardo2 »

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:Menu 3 opciones con lcd 20x4
« Respuesta #10 en: 31 de Mayo de 2023, 15:05:08 »
Subí el código

Hola ,
vuelvo a subir el código :
.....

Ok, pero tratá de subir el que estabas usando.  A ése le sobra una "}"  y se ejecuta una sola vez porque le falta el while.

Además, si esa librería LCD.C es la que viene con el CCS no te va a funcionar porque es para displays  de 2 líneas.

Usá la LCD420.C que sí es para 4 líneas.  Eso si, acordate que las líneas de control y datos ya tienen un orden prefijado, no podés poner datos en un puerto y líneas de control en otro.

-----------------------------------------------------------------------------

Ejemplo:

http:// - Tienes que ingresar para ver archivos adjuntos -

Código: [Seleccionar]
#include <18F2550.h>
#FUSES XT,NOWDT
#use delay(crystal=4000000)     // reloj a 4 MHz.

#include <LCD420.C>

#use standard_io(A)
#define BUTTON_UP_PIN    PIN_A1
#define BUTTON_ENTER_PIN PIN_A2

#define MENU_OPTION_COUNT 3

signed int selectedOption = 0;

void displayMenu() {
    lcd_putc('\f');  // Limpiar la pantalla

    lcd_gotoxy(1, 1);  printf(lcd_putc, "Seleccione opcion:");

    for(int8 k=0;k<3;k++){
        lcd_gotoxy(1, k+2);
        if(selectedOption == k) printf(lcd_putc, ">") ;
        else                    printf(lcd_putc, " ");
        printf(lcd_putc, " Opcion %u", k+1);
    }
}

void main() {
   lcd_init();
   lcd_putc('\f');      // Limpiar la pantalla inicialmente
   delay_ms(100);

   displayMenu();
   while (TRUE) {

      if (input(BUTTON_UP_PIN)) {
         selectedOption--;
         if (selectedOption < 0)  selectedOption = MENU_OPTION_COUNT - 1;
         displayMenu();
         delay_ms(300);     // Rebote
      }

      if (input(BUTTON_ENTER_PIN)) {
         lcd_putc('\f');
         lcd_gotoxy(1, 1);
         printf(lcd_putc, "Opcion %u seleccion",selectedOption+1);
         delay_ms(1000);
         
         displayMenu();
      }
   }
}

Hola Eduardo2 ,

El código que subí quizás tenia algún error ya que estuve haciendo pruebas previamente para intentar solucionarlo. Pero no lo conseguí por eso tenia algún corchete de mas. Por otra parte he probado tu código y bueno solo consigo ver 2 líneas en el LCD. Por lo que no puedo verificar correctamente tu código al 100 % . Pero si veo que la opción 1 entra y luego creo que pulsando botón(enter sale de la opción). Entiendo por la captura de imagen que lo has probado en PROTEUS . Claro hay la librería LCD420.C la interpreta bien y si que se ve el menú al completo. Yo estoy realizando las pruebas en REAL con lcd 4x20 y una placa PCB con un diseño que ya tiene la configuración del LCD preestablecida con los puertos de datos y RS,RW Y ENABLE preestablecidos . Tal y como te envié en mi código ,hasta el momento con la librería LCD.c (Displays 2x16....) .He podido engañar al display 20x4 diciéndole que en la linea 3 vendría a ser posición 21(x) y 1(Y) y me imprime lo que quiera en la tercera linea y en la cuarta linea especifico 21(x) 2(Y) y asi puedo visionarlo en un lcd 20x4 .De hay que el codigo si te fijas lo especifico y siempre me ha funcionado bien. Por otro lado se que las librerías de LCD.C y LCD420.C se pueden modificar para que entre otras cosas cambiar los puertos por los que quieres comunicarte con el PIC .Y si no me equivoco en este u otro foro ha habido gente han querido modificarlos para adaptarlos a sus proyectos. Cambiando los puertos de comunicación entre el PIC y el LCD. Yo todavía no he probado a cambiar esas configuraciones ya que con la libreria LCD.c y el truco de la 3ª y 4 ª linea que utilizo voy haciendo mis códigos. Aunque me queda mucho que aprender y  me estas echando una mano para tirar esto adelante.
Revisando tu codigo no encuentro la manera de poder decirle que me imprima en la 3 y 4 linea (21,1) y (21,2) atreves del bucle que creaste para que vaya moviéndose el símbolo ">" . No se si podrías darme una pista . Y la duda que tengo ahora es como añado dentro de las opciones lo que quiero que haga si ya no tengo las sentencias schict y Case ?
Gracias de antemano por la ayuda que me prestas. 

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Menu 3 opciones con lcd 20x4
« Respuesta #11 en: 01 de Junio de 2023, 16:35:46 »
....
Por otra parte he probado tu código y bueno solo consigo ver 2 líneas en el LCD. Por lo que no puedo verificar correctamente tu código al 100 % . Pero si veo que la opción 1 entra y luego creo que pulsando botón(enter sale de la opción). Entiendo por la captura de imagen que lo has probado en PROTEUS . Claro hay la librería LCD420.C la interpreta bien y si que se ve el menú al completo. Yo estoy realizando las pruebas en REAL con lcd 4x20 y una placa PCB con un diseño que ya tiene la configuración del LCD preestablecida con los puertos de datos y RS,RW Y ENABLE preestablecidos .

Con los pines tal como están en el PCB no va a funcionar no LCD420 ni LCD.c en versión standard. Una porque no trabaja con esos pines y la otra porque es para 2 líneas.

Citar
... Por otro lado se que las librerías de LCD.C y LCD420.C se pueden modificar para que entre otras cosas cambiar los puertos por los que quieres comunicarte con el PIC .Y si no me equivoco en este u otro foro ha habido gente han querido modificarlos para adaptarlos a sus proyectos. Cambiando los puertos de comunicación entre el PIC y el LCD. Yo todavía no he probado a cambiar esas configuraciones ya que con la libreria LCD.c y el truco de la 3ª y 4 ª linea que utilizo voy haciendo mis códigos.

Subí un ejemplo modificado de la librería LCD420.C (LCD_420_v2.C).  Tiene que estar en el mismo directorio que el programa y hay escribir la definición de TRIS_LCD_WRITE_MASK
y TRIS_LCD_READ_MASK  de acuerdo al resto de los pines (si entradas o salidas)

Citar
Revisando tu codigo no encuentro la manera de poder decirle que me imprima en la 3 y 4 linea (21,1) y (21,2) atreves del bucle que creaste para que vaya moviéndose el símbolo ">" . No se si podrías darme una pista . Y la duda que tengo ahora es como añado dentro de las opciones lo que quiero que haga si ya no tengo las sentencias schict y Case ?

Es volver a hacerlo mas o menos como antes, como en el ejemplo.


--------------------------------------------------------------------------

Edito:  Adjunté archivos equivocados.
« Última modificación: 02 de Junio de 2023, 13:57:08 por Eduardo2 »

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:Menu 3 opciones con lcd 20x4
« Respuesta #12 en: 04 de Junio de 2023, 14:19:45 »
Hola Eduardo2 ,
Gracias por modificar la librería LCD420.c , para adaptarla a los pines que utilizo en el programa. Ahora puedo visionar bien el lcd420 y es el que utilizo a partir de ahora. Y también por adaptar el código para que me funcione el Menú. He tardado en escribir porque he estado revisando el funcionamiento del ultimo ejemplo(3) que colgaste y he empezado a implementar opciones . Bueno antes que una opción es una función que es la de pulsar un botón y que se ilumine el LCD durante unos segundos o minutos y luego este apagado en reposo esto debería funcionar independientemente de en que parte del Menú este ,he realizo una funcion(void) y llamo a esta "funcion" desde el menú principal o desde cualquier opción , solo pulsando un botón en este caso a nivel hardware lo tengo asignado en puerto" B7 " (input) y puerto "A5" (Output) hacia pines LCD. La duración del tiempo que permanece encendido el lcd la he puesto en 20 segundos y luego se apague pero por alguna razón no me realiza bien el bucle de temporización ya que me mantiene el lcd encendido (cronometrado mas de 3 minutos) y lo he parado porque creo que esta en modo infinito. Y no lo entiendo porque este código lo he probado solo sin nada y me ha funcionado correctamente . No se donde me estoy equivocando lo he repasado una y otra vez y no encuentro el error. Y me surge una duda y quizás me puedas aconsejar seria correcto el realizar este "Void funcion ilumina lcd" , para después hacer una llamada desde cualquier punto del código?.

Y luego he empezado a implementar en la "Opcion 1" , el codigo del  RTC DS3231 ,para visionar hora, calendario y temperatura. Pues aquí si se me esta haciendo difícil avanzar llevo varios días intentando que me funcione pero no domino el tema de I2C, ya que trabaja con SCL y SDA que lo tengo asignado por hardware al Pin B0 y B1 del pic18f2550 . He estado buscando información en este foro y hay ejemplos pero no consigo adaptarlo al Menú con opciones y tengo errores por todos los sitios y cuando compilo siempre sale error i2c start() ... entre otros podrías decirme en que estoy fallando ?

Subo el código tal y como lo tengo ahora.
* 18F2550_LCD-420_opcion.zip
(1.84 kB - descargado 66 veces)
 
* 18F2550_LCD-420_opcion.zip
(1.84 kB - descargado 66 veces)

 
* 18F2550_LCD-420_opcion.zip
(1.84 kB - descargado 66 veces)
 
* 18F2550_LCD-420_opcion.zip
(1.84 kB - descargado 66 veces)
 
* 18F2550_LCD-420_opcion.zip
(1.84 kB - descargado 66 veces)
 
* 18F2550_LCD-420_opcion.zip
(1.84 kB - descargado 66 veces)
 
* 18F2550_LCD-420_opcion.zip
(1.84 kB - descargado 66 veces)
 
* 18F2550_LCD-420_opcion.zip
(1.84 kB - descargado 66 veces)

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:Menu 3 opciones con lcd 20x4
« Respuesta #13 en: 04 de Junio de 2023, 14:23:07 »
Perdón por todos los ficheros que he subido ,son todos iguales cualquiera de ellos vale .Pensaba que no lo había subido y como veis he repetido la operación varias veces  :(  :shock:  :mrgreen:  :-)

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Menu 3 opciones con lcd 20x4
« Respuesta #14 en: 04 de Junio de 2023, 21:48:34 »
Perdón por todos los ficheros que he subido ,son todos iguales cualquiera de ellos vale .Pensaba que no lo había subido y como veis he repetido la operación varias veces  :(  :shock:  :mrgreen:  :-)

Podés editar tu mensaje y eliminar los adjuntos sobrantes.

Preferiblemente, siempre subí algo "compilable" , es decir con todos los archivos necesarios.  Acá en particular no tengo ni el DS3231.C ni el I2C.C  que estás usando.  También el archivo en Proteus.

Es mas fácil buscar errores debuggeando un código que analizándolo.


 

anything