Pages: [1]   Go Down
Author Topic: lcd: andare oltre 40 chr  (Read 1034 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5914
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 130
Posts: 9516
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Quote
Come andare oltre i 40 char ?

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

Quote
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.

Logged

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Logged

0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5914
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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"  smiley
sono 80 caratteri, e vengono usati 40 per riga, logicamente anche se io ho ragione tu lo spieghi meglio  smiley-yell

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

Quote
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  smiley
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12576
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink
Logged


Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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
« Last Edit: September 15, 2012, 04:31:04 am by m_ri » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5914
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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"..
Logged

Pages: [1]   Go Up
Jump to: