Cancellare ultima lettera (LCD)

Salve,
Dopo aver creato un programma per decodificare il codice Morse su uno schermo LCD (viene digitato attraverso un pulsante) ho installato un altro pulsante. A quest'ultimo volevo attribuire un codice per cancellare, ogni volta che lo premo, l'ultima lettera scritta sull'LCD (se per caso sbagliassi a digitare una lettera). Come posso fare?
Spero possiate aiutarmi. Grazie

Il tuo post è stato SPOSTATO nella posizione corrente in quanto è più adatto.

Potresti anche dedicare qualche minuto a Impara a usare il forum.

Ti aiuterà a ottenere il meglio dal forum in futuro.

Your post was MOVED to it's current location as it is more suitable.

Could you also take a few moments to Learn How To Use The Forum.

It will help you get the best out of the forum in the future.

1 Like

@arius007 : Buonasera,
prima di tutto ti segnalo che, nelle sezioni in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post ...

... poi, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

[i]P.S.: Il tuo post è già stato spostato da un moderatore della sezione Inglese nell'opportuna sezione del forum "Italiano”dove puoi proseguire la discussione.

P.P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink: [/i]

1 Like

Beh ... leggi la pressione del pulsante, se viene premuto ti posizioni con il cursore sulla lettera da cancellare, scrivi uno spazio " " e ti riposizioni di nuovo sulla stessa posizione da dove ricominci a scrivere :wink:

Guglielmo

Ci avevo pensato. Ma non so come, se premo il pulsante, far tornare indietro il cursore.

Non devi farlo tonare indietro (purtroppo non mi sembra esista il comando backspace), devi tenere traccia di dove sei (riga colonna in cui hai scritto) e posizionare di conseguenza il cursore.

Guglielmo

Grazie. Ci proverò.

Collegando il pin r/w è possibile anche leggere la posizione del cursore con l'apposito comando.

Cosa che credo non sia prevista con gli adattatori I2C (... ma non so l'OP che LCD stia usando) ... ti risulta? Nelle librerie mi sembra di vedere solo i soliti metodi di scrittura, ma nulla di lettura ... :roll_eyes:

Guglielmo

Si di solito nei moduli con adattatore i2c è collegato anche il pin R/W.

Per quanto riguarda le libreria è vero, la maggior parte (quasi tutte praticamente) non supportano la lettura.
Non ricordo esattamente quale avevo usato quando ne ho avuto la necessità o forse ne avevo modificato una aggiungendo il metodo.

Più tardi dal PC provo a recuperare qualche info in più.

Allora, ho fatto mente locale e mi è tornato in mente come avevo fatto.
Al contrario di quanto ho scritto, non esiste un comando diretto per leggere la posizione del cursore, ma questa si può estrapolare dallo status byte del controller che restituisce il busy flag e l'indirizzo DDRAM attuale.

La libreria che ho usato è questa (ma va bene qualsiasi altra che consente di leggere lo status byte.

Gli indirizzi di memoria della prima posizione di ciascuna riga, sono riportati nel datasheet del controller. Non so se sono sempre gli stessi o se possono cambiare da controller a controller, ma questi funzionano di sicuro con il display che si trova facilmente negli store online, ovvero quello 20*4 con sfondo blu e adattatore i2c PCF8574 (compatibile HD44780).

struct {
  uint8_t col = 0;
  uint8_t row = 0;
} cursor;

const uint8_t LAST_COL = LCD_COLS - 1;
 // LCD  memory address for each row
const uint8_t row0 = 0x00, row1 = 0x40, row2 = 0x14, row3 = 0x54;  

void getCursor() {
  uint8_t adr = lcd.status();
  if (adr >= row0 && adr <= row0 + LAST_COL) {
    cursor.row = 0;
    cursor.col = adr - row0;
  }
  if (adr >= row1 && adr <= row1 + LAST_COL) {
    cursor.row = 1;
    cursor.col = adr - row1;
  }
  if (adr >= row2 && adr <= row2 + LAST_COL) {
    cursor.row = 2;
    cursor.col = adr - row2;
  }
  if (adr >= row3 && adr <= row3 + LAST_COL) {
    cursor.row = 3;
    cursor.col = adr - row3;
  }

}

Grazie.
Potresti cortesemente spiegarmi cosa fa questo codice, io ho capito molto poco.
Ci sono dellevariabili non scritte in questa parte di codice?

Purtroppo molte poche librerie permettono la lettura dello status ... ad esempio, mi pare che né la LiquidCrystal, né LiquidCrystal_I2C (... e la sua migliore versione, PCF8574_HD44780_I2C, che qui sempre consigliamo) lo permettano ... e sono le più utilizzate in assoluto ... :roll_eyes:

Magari si può fare una pull request su GitHub ... :slight_smile:

Guglielmo

Volentieri, solo che quella che consigliate qui, non mi pare abbia un repository o almeno io non sono riuscito a trovarlo.

In poche parole, per ciascuna posizione del display LCD, hai un indirizzo di memoria associato nel quale il controller va a scrivere.
Ad esempio con un display 16*2 gli indirizzi sono questi:

Se la libreria lo prevede, come quella di cui ho messo il link, puoi leggere direttamente dal controller l'ultimo indirizzo di memoria su cui è stato scritto qualcosa e ricavare di conseguenza la posizione del cursore con un po' di matematica spicciola.

Quindi ho definito una struct {} chiamata cursor dove vado a memorizzare la posizione attuale del cursore (potevano essere anche due variabili distinte, il principio è lo stesso).
Dopo ho definito delle variabili che corrispondono all'indirizzo di memoria del primo carattere di ciascuna riga.

Nella funzione getCursor() vado a leggere l'indirizzo di memoria con l'istruzione:

uint8_t adr = lcd.status();

Per fare le cose fatte per bene sarebbe meglio controllare che il bit DB7 corrispondente al busy flag, del byte ritornato come valore sia uguale a 0.
image

A questo punto conoscendo il valore dell'indirizzo DDRAM dove è stato scritto l'ultimo carattere, con la serie di if() successivi la "traduco" nell'equivalente posizione riga/colonna.

Dovrebbe essere QUESTA ... difatti, in testa al .h leggo:

/*********************************
PCF8574_HD44780_I2C
Library for PCF8574 Breakout Board
by Testato on ArduinoForum

based on code from:
- Mario H.
**********************************/

... che è appunto quella di @testato , vecchio utente di questo forum (assente ormai da molto tempo ... dal 2019).

Guglielmo

Ciao Guglielmo,
mi è arrivata una tua notifica e sono passato :slight_smile:

Un saluto a tutti i nuovi ingressi, sono già passati 3 anni .....

Vedo che Banzi è tornato alle origini, il primissimo forum dove scrivevamo quando è nato arduino era tutto bianco come questo :slight_smile:

Vedo che hanno forkato la mia libreria del forum e l'hanno piazzata su github ?
E' da tempo che stavo pensando di pubblicare sia questa sia le altre cose che avevo scritto su github, magari colgo l'occasione di fare repo ufficiali.

@cotestatnt
se hai idee migliorative e vuoi collaborare allo sviluppo sei il benvenuto, recupero il tutto e posto i link dei repo

Grazie Testato ... era un po' che non ti si vedeva :wink:

Si, sarebbe interessante che mettessi proprio la TUA su github così, chi vuole collaborare e proporre integrazioni ed aggiunte (vd. la funzione status()), può farlo :grin:

... in realtà dalle preferenze puoi cambiare tra bianco, scuro e proprio nero. Io uso la versione "scuro", da meno fastidio agli occhi :wink:

Guglielmo

eccolo

carico anche le altre lib e aggiorno i relativi topic

1 Like

... ho idea che saranno stati chiusi dal BOT automatico :roll_eyes:. Nel nuovo forum, dopo 4 mesi che nessuno usa un thread, viene automaticamente chiuso.

Eventualmente mandami in MP i link che te li riapro :wink:

Guglielmo

credo, e mi sembrerebbe assurdo che qualche genio informatico indiano, e non me ne vogliano gli indiani, nè i pellerossa nè gli asiatici, avesse pensato il contrario, l'autore puo' sempre editare il post, ed infatti l'ho già sistemato.

Comunque chi ha pensato ad una cosa del genere non sa minimamente gestire un forum, specialmente un forum tecnico dove appunto dopo anche un anno o 5 anni (non siamo qui a discutere di una lib di forse 5 anni fa ?) è giusto che arrivino nuovi commenti, richieste, aiuti, sempre sullo stesso topic anche se vecchio.

Riferisci al management che continuano a fare cazzate :slight_smile:

1 Like