lcd: andare oltre 40 chr

premessa:
la maggior parte degli lcd contengono a livello hardware 40 caratteri per righa, quindi quando li pilotiamo ad esempio con la libreria ufficiale se stampiamo una stringa di 41 caratteri il 41° se ne va sul secondo rigo, oppure sul 4, oppure dove diavolo vuole lui in base all'hardware, alle righe, ecc.

Domanda (e qui rientriamo nella sezione SW):
Come andare oltre i 40 char ?
Logicamente non avendo lo spazio fisico dei caratteri si deve far scorrere la scritta, il comando di scorrimento e' gia' presente nella libreria, fa scorrere tutto il display, ma sempre di 40 caratteri si parla.
1: Come fare per far scorrere 100, 200, 2000 caratteri ? (credo non sia possibile 2000 per la ram aduinica)
2: Il comando scorrimento shifta tutto il display, come fare per tenere una riga ferma ed una riga in scorrimento ?

credo siano cose difficili, specialmente per un non programmatore come me, esiste forse una libreria ?
Grazie

Testato:
la maggior parte degli lcd contengono a livello hardware 40 caratteri per righa, quindi quando li pilotiamo ad esempio con la libreria ufficiale se stampiamo una stringa di 41 caratteri il 41° se ne va sul secondo rigo, oppure sul 4, oppure dove diavolo vuole lui in base all'hardware, alle righe, ecc.

Non è così, gli LCD Hitachi compatible hanno 80 byte di ram contigua, è il buffer dei caratteri, e viene scritta consecutivamente ogni volta che introduci un nuovo carattere a meno che non usi gli appositi comandi per spostarti lungo questa memoria.
In pratica è possibile ottenere qualunque geometria del display che comporta un massimo di 80 caratteri, p.e. il classico 2x20 che ne usa solo 40, oppure il 4x20 che li usa tutti 80, ma nulla vieta di realizzare un display 8x10, ed esistono fatti così, a seconda della geometria ogni riga usa una certa sezione del buffer e questo può creare problemi perché solitamente vengono usati i primi 40 byte per le righe dispari e i secondi 40 byte per le righe pari, non mi chiedere il motivo perché non lo so.
Esempio pratico, il classico display 20x2 usa i primi 20 byte della ram per la prima riga e 20 byte a partire dal quarantesimo per la seconda riga.

Come andare oltre i 40 char ?

Non puoi, almeno a livello di display perché la ram quella è quella rimane.

1: Come fare per far scorrere 100, 200, 2000 caratteri ? (credo non sia possibile 2000 per la ram aduinica)
2: Il comando scorrimento shifta tutto il display, come fare per tenere una riga ferma ed una riga in scorrimento ?

Queste cose vanno gestite da software, nel tuo programma avrai un buffer (stringhe) con le scritte da far scorrere, poi devi aggiornare il display ogni tot shiftando il contenuto della sua ram di quanto serve e solo per locazioni interessate, ti dico subito che non è una cosa semplice da fare, esistono delle librerie pronte che lo fanno, però quelle che conosco sono tutte a pagamento, sicuramente ne esistono di free per Arduino.

ti memorizzi in una stringa tutto il testo da stampare..ogni 1000ms(o altro valore) esegui un pezzo di codice che stampi sul display la stringa che parte dall'iesimo carattere e va fino all'(i+n)-esimo carattere,dove i viene incrementato di 1 a ogni stampa,mentre n è la lunghezza della stringa stampabile dal display..devi gestire anche il fatto che,arrivato alla fine della stringa,devi ripartire da capo..

astrobeed:
solitamente vengono usati i primi 40 byte per le righe dispari e i secondi 40 byte per le righe pari

Perche' dici c he non e' come dico io ? Stiamo dicendo la stessa cosa, il tuo "Solitamente" io l'ho scritto "la maggior parte degli lcd" :slight_smile:
sono 80 caratteri, e vengono usati 40 per riga, logicamente anche se io ho ragione tu lo spieghi meglio :stuck_out_tongue_closed_eyes:

il mio carinissimo 2x8 appunto messo in scorrimento fa vedere solo 40chr su primo righo e 40 sul secondo

Queste cose vanno gestite da software, nel tuo programma avrai un buffer (stringhe) con le scritte da far scorrere, poi devi aggiornare il display ogni tot shiftando il contenuto della sua ram di quanto serve e solo per locazioni interessate, ti dico subito che non è una cosa semplice da fare, esistono delle librerie pronte che lo fanno, però quelle che conosco sono tutte a pagamento, sicuramente ne esistono di free per Arduino.

Quindi avevo intuito giusto sulla complessita' della cosa, mi metto alla ricerca di qualcosa, se la trovo posto, se qualcuno la trova prima di me meglio ancora.
grazie dell'intervento :slight_smile:

Tanto per darne notizia, sembra che esistano display a 80 caratteri fisici, poi bisogna vedere se ci sono le LIB per Arduino

m_ri:
ti memorizzi in una stringa tutto il testo da stampare..ogni 1000ms(o altro valore) esegui un pezzo di codice che stampi sul display la stringa che parte dall'iesimo carattere e va fino all'(i+n)-esimo carattere,dove i viene incrementato di 1 a ogni stampa,mentre n è la lunghezza della stringa stampabile dal display..devi gestire anche il fatto che,arrivato alla fine della stringa,devi ripartire da capo..

Sembra un compito fatto apposta per il leOS :wink:

diciamo piuttosto per il looper..se no per cosa t'avrei stressato per fartelo scrivere? :smiley:

#define LUNGHEZZA_DISPLAY 30

void stampaParziale(char[] stringa,short lungString,short posPartenza){
char strDisplay[LUNGHEZZA_DISPLAY+1];
strDisplay[LUNGHEZZA_DISPLAY]=0;

for(short i=0;i<LUNGHEZZA_DISPLAY;i++)
  strDisplay[i]=stringa[(posPartenza+i)%lungStringa];

display.stampa(strDisplay);//qua usa i metodo per stampare una stringa sul display...eventualmente prima cancella ciò che c'era sul diaply

}

a ogni ciclo,incrementi di uno posPartenza e lo resetti quando è uguale a LUNGHEZZA_DISPLAY

Anche, ma il looper è legato al codice e se qualcosa rallenta il loop, anche il looper s'inceppa. Meglio il leOS, così sei sicuro che ogni X il display verrà aggiornato sempre e comunque.

x menniti: 80x4 mai visti, deve avere 4 controller, la cosa interessante non sarebbe tanto il fatto di avere display giganti da 80chr (cioe' caratteri fisici), cosa che probabilmente serve in pochissimi casi, ma averne di piccoli che pero' indirizzano tutti e 80chr su un solo rigo, cosa che non si puo' fare su nessun display che conosco, al massimo si e' limitati a 40 chr sia su piccoli 8x2 che su grandi 40x2, forse potrebbero esistere dei display su un solo rigo da 80chr tipo 8x1, 16x1

per m_ri: ma il tuo codice prevede lo scorrimento continuo ?

io sconsigliavo il leos per il solito motivo: potrebbe interferire con la libreria del display..x es,alcuni librerie hanno dentro i delay..i quali se non sbaglio fan uso di interrupt..ma il tuo scheduler li "blocca"..