Domanda:
Problema di scorrimento LCD verso il basso
user730
2014-03-20 04:54:27 UTC
view on stackexchange narkive permalink

Ho un elenco di configurazioni e ho solo 2 righe nell'LCD, sto cercando di scorrere verso il basso per il momento e lo sto facendo cambiando la riga nella funzione setcursor su 0 o 1 .

Tuttavia, poiché avrò circa 10 configurazioni, ho usato un'equazione che cambierà le righe in 0 e una per quelle che voglio visualizzare e un numero negativo per quelle che indosso Il problema è che quando imposti la riga del cursore su -1 o 2, ignorerà quella con la riga uno (che è la seconda riga).

C'è un modo in cui posso superare questo problema? impostandolo su una riga che non apparirà sul mio LCD? Sto usando #include <LiquidCrystal.h> e ho già impostato lcd.begin (16, 2);

  int colom [5] = {0-goDown, 1-goDown, 2-goDown, 3-goDown, 4-goDown}; for (int i = 0; i < 4; i ++ ) {if (colom [i] > 1) colom [i] = -1;} lcd.setCursor (0, colom [0]); lcd.print ("scelta 1"); lcd.setCursor (0, colom [1]); lcd.print ("scelta 2"); lcd.setCursor (0, colom [2]); lcd.print ("scelta 3"); lcd.setCursor (0, colom [3]); lcd.print ("scelta 4"); lcd.setCursor (0, colom [4]); lcd.print ("choise 5");  

Quindi qui goDown è 0 quindi la scelta 1 e 2 dovrebbero apparire, ma ottengo solo la scelta 1 e nella seconda riga cambia rapidamente tra 2 e 5, non è costante.

Ho pensato di creare una condizione if per ogni scelta, ma sarà molto codice da scrivere e non sarà efficiente per la mia applicazione.

Qual è la libreria LCD che stai utilizzando?
#include
Modifica la tua domanda per includere un esempio di codice minimo, completo e verificabile, non solo frammenti. Minimo significa che hai rimosso le cose irrilevanti, lasciando solo ciò che è necessario per mostrare il problema. Completo significa che vengono mostrati tutti i nomi delle librerie, tutte le dichiarazioni di variabili e tutte le definizioni delle funzioni, così le persone non devono perdere tempo a indovinare cosa hai fatto o cosa intendevi. Verificabile significa che può essere compilato e testato, consentendo ad altre persone di testare le loro teorie sul problema
Due risposte:
Mud
2014-03-20 05:36:17 UTC
view on stackexchange narkive permalink

Questa è una cattiva strategia in generale. Non dovresti emettere chiamate di stampa per cose che non vuoi stampare e affidarti alla libreria lcd per filtrare per te perché sono fuori limite.

Chiama stampa solo per le scelte che desideri visualizzare.

  char * menu [] = {"choice 1", "choice 2", "choice 3", "choice 4", "choice 5" ,}; const int numMenuItems = sizeof menu / sizeof * menu; const int numLcdRows = 2; // inizia all'inizio del menuint scrollPos = 0; void drawMenu () {for (int i = 0; i < numLcdRows; ++ i) {lcd.setCursor (0, i); lcd.print (menu [i + scrollPos]); }}  

Per scorrere verso l'alto o verso il basso, regola semplicemente l'offset di scorrimento:

  inline void scrollUp () {if (scrollPos > 0) scrollPos-- ;} inline void scrollDown () {if (scrollPos < numMenuItems - numLcdRows) scrollPos ++;}  

Nota che questo è un codice non testato scritto per una libreria che non ho mai visto (solo inferendo come funziona dal tuo post); è solo a scopo illustrativo.

TheDoctor
2014-03-20 06:30:19 UTC
view on stackexchange narkive permalink

Ho scritto un codice di astrazione per la gestione dei menu LCD, che si trova qui: https://github.com/red-green/Arduino_Mobile_OS

Ecco lo snippet principale:

  menu byte (titolo stringa, stringhe const String *, lunghezza byte) {boolean select, esc; elemento byte statico, selezione; select = false; esc = false; articolo = 1; lcd.clear (); lcd.setCursor (0,0); lcd.print (titolo); lcd.print (":"); lcd.print (articolo); lcd.setCursor (0,1); lcd.print (stringhe [elemento]); ritardo (100); while (! select) {uint8_t buttons = lcd.readButtons (); if (pulsanti) {if (pulsanti & BUTTON_UP) {item--; } if (pulsanti & BUTTON_DOWN) {item ++; } if (pulsanti & BUTTON_LEFT) {esc = true; } if (pulsanti & BUTTON_SELECT) {selezione = elemento; select = true; } elemento = vincolo (elemento, 1, lunghezza - 1); lcd.clear (); lcd.setCursor (0,0); lcd.print (titolo); lcd.print (":"); lcd.print (articolo); lcd.setCursor (0,1); lcd.print (stringhe [elemento]); if (esc) {select = true; selezione = 0; } ritardo (100); }} return (selezione);}  

Potrebbe essere necessario modificare la gestione dei pulsanti per lavorare con la configurazione. Per chiamare, disporre di un array di elementi prima della configurazione, in questo modo:

  const String utilmenuitems [6] = {"back", "Random Numbers", "Uptime", "Device Info"} ;  

Puoi quindi chiamarlo come:

  byte return = menu ("Utilities", utilmenuitems, 4);  


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...