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

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

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:Menu 3 opciones con lcd 20x4
« Respuesta #30 en: 19 de Julio de 2023, 19:16:58 »
Hola Eduardo2 ,

Estoy contemplando el añadir una opción mas al menú principal . Seria opción 4 y estoy intentando que en el menú el puntero ´>´ se mueva por las cuatro opciones , pero al añadir la 4 opción , resulta que la opción 3 me ha desaparecido del menú principal y en su lugar me ha puesto la opción 4. Pero curioso que cuando el puntero de elección desaparece y pulso entrar pues me entra en la opción 3 y luego salgo y vuelvo al menú principal y selecciono opción 4 y le cuesta mucho entrar en ella tengo que pulsar bastantes veces sino no entra. He modificado la parte del bucle donde realiza el movimiento del puntero ">"  y he añadido código para que se vea la opción 4. Pero no realiza bien la función .El titulo del Menú me interesa conservarlo . De hay que no ya utilizado esa linea para la cuarta opción .Ósea que la 4 opción debería verse cuando el puntero pase de la opción 3 a la opcion 4 y luego quedara fuera de pantalla cuando pase de opción 4 a opción 3. Y el problema es que no consigo que me funcione de esa manera. Que puedo estar haciendo mal ? Añado fichero con el código. Haber que esta mal. Gracias


Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Menu 3 opciones con lcd 20x4
« Respuesta #31 en: 20 de Julio de 2023, 00:24:28 »
Hola!

... pero al añadir la 4 opción , resulta que la opción 3 me ha desaparecido del menú principal y en su lugar me ha puesto la opción 4.
Ese display es de 4 líneas, cuando ingresás una 5ta no va a hacer scroll --> la escribe encima de la última , aunque en realidad esto es cosa del driver.

Citar
Pero curioso que cuando el puntero de elección desaparece y pulso entrar pues me entra en la opción 3
Es que la rutina de selección anda bien, lo que te falta son líneas de display.

Citar
y luego salgo y vuelvo al menú principal y selecciono opción 4 y le cuesta mucho entrar en ella tengo que pulsar bastantes veces sino no entra.
Eso es porque usás el mismo botón para entrar y salir --> Necesitás un retardo al entrar de 200ms...300ms para que te dé tiempo a soltarlo.
Opcion1 lo tiene y Opción2 y 3  lo tienen repartido en el bucle.

Citar
He modificado la parte del bucle donde realiza el movimiento del puntero ">"  y he añadido código para que se vea la opción 4. Pero no realiza bien la función .El titulo del Menú me interesa conservarlo . De hay que no ya utilizado esa linea para la cuarta opción .Ósea que la 4 opción debería verse cuando el puntero pase de la opción 3 a la opcion 4 y luego quedara fuera de pantalla cuando pase de opción 4 a opción 3. Y el problema es que no consigo que me funcione de esa manera. Que puedo estar haciendo mal ? Añado fichero con el código. Haber que esta mal.
No es que esté mal, es que no hay nada para que lo haga.
Ejemplo:
Código: [Seleccionar]
void displayMenu(int8 select) {

    lcd_putc('\f');  // Limpiar la pantalla   
    lcd_gotoxy(1, 1); printf(lcd_putc, "Selec.Opcion:");
               
    static int8 base=0 ;   
    if((select-base)>0x80)   base-- ;         
    else if((select-base)>2) base=select-2 ;
   
    for(int8 j=2,k=base ; j<5 ; j++,k++){
        lcd_gotoxy(1, j);
        if (select == k)
            printf(lcd_putc, "> %s", menuOptions[k]);
        else
            printf(lcd_putc, "  %s", menuOptions[k]);
    }       
}

No entiendo por qué recorrés las opciones en orden descendente cuando lo "natural" seré ascendente.
Si lo hicieras ascendente (vuelta a 0 después del máximo) tendrías que cambiar la comparación en displaymenu() por:
Código: [Seleccionar]
    if((select-base)>0x80)   base=0 ;         
    else if((select-base)>2) base++ ;

Adjunto el programa modificado para un menú de 7 opciones. La 5,6 y 7 es una sola "fantasma".


Ah!   Controlá si los archivos corresponden a lo que escribís en el mensaje.  En este no se correspondía el programa con el circuito en Proteus, tenía conectado el DS18B20 en otro pin y lógicamente se bloqueaba al inicio. Tengo que perder tiempo buscando un olvido  :5]

Desconectado genti

  • PIC10
  • *
  • Mensajes: 21
Re:Menu 3 opciones con lcd 20x4
« Respuesta #32 en: 24 de Julio de 2023, 18:36:25 »
Hola Eduardo2 ,

Ha tu comentario :

Ah!   Controlá si los archivos corresponden a lo que escribís en el mensaje.  En este no se correspondía el programa con el circuito en Proteus, tenía conectado el DS18B20 en otro pin y lógicamente se bloqueaba al inicio. Tengo que perder tiempo buscando un olvido  :5]

Perdón si no coincidía el fichero que puse con lo que tenias simulado en Proteus. Si que cambien el puerto de lectura del DS18B20 .Pensaba que ya lo tenias modificado ahora lo he dejado fijo : #define DS18B20_PIN PIN_B6  . :oops:
Ya que hice reestructuración en algún puerto para dejar puertos analógicos libres.

Por otra parte he probado el código del fichero adjunto he inicialmente no mostraba nada en el LCD. Me puse ha comprobar que podía pasar y  encontré una linea de código : #use STANDARD_IO( B ) ,
Esta linea hacia que no se viera nada en lcd .Al eliminarla volví a probar  y  ya se veía bien el lcd con el Menú funcionando correctamente . Esta linea verifique si estaba en codigo mas antiguo y no encontré nada . No se si al llamar esta sentencia entra en conflicto con las líneas del puerto que controlan la información que le llega al LCD.
Por otro lado el código funciona a la perfección , hasta donde lo he probado  ((:-))
Darte las gracias por ayudarme ya que de otro modo no hubiera podido conseguirlo.
Y ya que estoy aprendiendo me gustaría que me explicaras un poco como lo haces a la hora de utilizar :

void displayMenu(int8 select) {

    lcd_putc('\f');  // Limpiar la pantalla   
    lcd_gotoxy(1, 1); printf(lcd_putc, "Selec.Opcion:");
               
    static int8 base=0 ;   
    if((select-base)>0x80)   base-- ;         
    else if((select-base)>2) base=select-2 ;
   
    for(int8 j=2,k=base ; j<5 ; j++,k++){
        lcd_gotoxy(1, j);
        if (select == k)
            printf(lcd_putc, "> %s", menuOptions[k]);
        else
            printf(lcd_putc, "  %s", menuOptions[k]);
    }       
}

Ya que la sentencia base=0 ,  o la dirección 0x80. no entiendo a que hace referencia. Me gustaría entender como lo has estructurado.

Lo del menú ascendente o descendente . Es algo que siempre he visto en muchos programas que sea descendente y no a la inversa .Pero que no me importa el sentido . Aunque lo que dices que lo normal es Ascendente , en este caso a mi ya me vale y veo que as generado código por si quiero cambiarlo , todo un detalle por tu parte y es de agradecer . ((:-))

Te agradezco tu tiempo empleado en ayudarme .  :P
Saludos.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Menu 3 opciones con lcd 20x4
« Respuesta #33 en: 24 de Julio de 2023, 23:29:34 »
Los textos deben ir de la línea 2 a la 5 y en una de ellas debe estar incluido el '>' de la selección.
Esto es lo que hace el for():
Código: [Seleccionar]
    for(int8 j=2,k=base ; j<5 ; j++,k++){
        lcd_gotoxy(1, j);
        if (select == k)
            printf(lcd_putc, "> %s", menuOptions[k]);
        else
            printf(lcd_putc, "  %s", menuOptions[k]);
    }       
Lo que hace falta es un criterio para decidir el primer menú a mostrar (base)

Como el valor de select siempre se decrementa de a 1, cuando select-base sea negativo significa que hay que decrementar base.
Eso hace  if((select-base)>0x80)   base-- ;
lo que pasa es que al ser variables unsigned hago algo equivalente que es comparar con 0x80.
Se puede hacer comparando si negativo declarando como signed o usando un cast, es cuestión de gustos.

Pero cuando select pasó de 0 a MENU_OPTION_COUNT-1 la resta select-base es igual MENU_OPTION_COUNT-1 (base está valiendo 0)  --> en esa situación se hace  base=select-2 y te queda el menu máximo al final.

Saludos.

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

Usando el  operador ternario ?  el for queda mas bonito ;)
Código: [Seleccionar]
    for(int8 j=2,k=base ; j<5 ; j++,k++){
        lcd_gotoxy(1, j);
        lcd_putc( select==k ? '>' : ' ' )       ;
        printf(lcd_putc," %s", menuOptions[k] ) ;
    }
« Última modificación: 25 de Julio de 2023, 11:26:35 por Eduardo2 »