Sistema di menu LCD con testo standard


10

Esiste un modello per un semplice sistema di menu in C per un LCD di testo. Mi ritrovo a riscrivere molto il codice per gestire semplici menu LCD di testo.

Trovo che la maggior parte dei sistemi abbia un menu principale e alcuni sottomenu che, se selezionati, consentono di impostare un parametro con un valore minimo e massimo.

Idealmente questo sistema di menu potrebbe essere navigato con 4 semplici tasti come invio, annullamento, su e giù.

Nella mia applicazione sto usando un LCD di testo a 2 righe x 16 caratteri, sebbene una soluzione ideale debba essere applicata a qualsiasi display NxM.


Niente a che vedere con il design elettronico! La domanda sarà chiusa
Leon Heller,

5
Ho avuto l'impressione che le domande sulla programmazione fossero applicabili anche ai sistemi embedded. Forse mi sbagliavo ...
mjh2007,

Anch'io avevo un'impressione simile. C'è una nota ufficiale a riguardo?
AndrejaKo

Solo cose di livello molto basso, secondo le FAQ. Questa domanda riguarda l'interfaccia utente.
Leon Heller,

3
+1 Anche io sarei interessato ... Li ho sempre fatti a mano. Stai usando un output di console o un display di caratteri NxM .... non che io abbia una risposta per entrambi :) Su diversi sistemi di display 2xN integrati, ho implementato due interfacce di pulsanti con la combinazione di Enter / Cancel e ho Next che è un ring buffer ed elimina la necessità di up / next & down / back.
Kenny,

Risposte:


5

Il modello che uso per i sistemi di menu in C è qualcosa del genere:

struct menuitem
{
  const char *name; // name to be rendered
  functionPointer handlerFunc; // handler for this leaf node (optionally NULL)
  struct menu *child; // pointer to child submenu (optionally NULL)
};

struct menu
{
  struct menu *parent; // pointer to parent menu
  struct **menuitem; // array of menu items, NULL terminated
};

Dichiaro quindi una matrice di menus ciascuno contenente menuitems e puntatori ai childsottomenu. Su e giù si spostano attraverso l'array di menuitems attualmente selezionato . Indietro si sposta nel parentmenu e avanti / seleziona si sposta su un childsottomenu o chiama a handlerFuncper un nodo foglia.

Il rendering di un menu implica solo l'iterazione dei suoi elementi.

Il vantaggio di questo schema è che è completamente guidato dai dati, le strutture dei menu possono essere dichiarate staticamente nella ROM indipendentemente dalle funzioni di rendering e gestore.


2

La risposta di Toby è un ottimo punto di partenza. Le strutture menzionate presumono che i menu siano statici e basta navigare attraverso di essi.

Se vuoi menu dinamici (es. Visualizzazione di determinati valori, come temperatura, tempo, ecc.), Devi essere in grado di generarlo.

Un modo potrebbe essere quello di avere una funzione per creare la tua stringa.

struct menuitem
{
  const char *name; // name to be rendered
  const char * (*builderFunc)( const char *name );  // callback to generate string, if not null.
  functionPointer handlerFunc; // handler for this leaf node (optionally NULL)
  struct menu *child; // pointer to child submenu (optionally NULL)
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.