Tutti sono da tempo abituati al fatto che ogni dispositivo elettronico ha uno schermo, con l'aiuto del quale fornisce a una persona ogni sorta di informazioni utili. Il lettore MP3 mostra il nome del brano in riproduzione, il telecomando del quadricottero mostra la telemetria di volo, anche la lavatrice mostra il tempo rimanente fino alla fine del lavaggio e lo smartphone generalmente ospita l'intero desktop di un personal computer! Molto probabilmente, il tuo prossimo dispositivo potrebbe utilizzare anche un piccolo display :) Proviamo a realizzare un semplice orologio elettronico! E come tabellone segnapunti utilizziamo il comune ed economico display a cristalli liquidi a caratteri 1602. Eccolo, proprio come in foto: Oltre al 16x2, un display a caratteri 20x4 (quattro righe da 20 caratteri ciascuna), oltre ad un display grafico con una risoluzione di 128x64 pixel, sono considerati piuttosto popolari. Eccoli nelle immagini:
1. Collegamento del display LCD a caratteri 1602
Il display 1602 ha 16 pin. Di solito sono numerati da sinistra a destra, se lo guardi come nell'immagine. A volte i pin sono firmati, come: DB0, DB1, EN, ecc. E a volte indicano semplicemente il numero di uscita. In ogni caso la lista dei pin è sempre la stessa: 1 — “GND”, terra (meno alimentazione); 2 — “Vcc”, alimentazione +5V; 3 — “VEE”, contrasto 4 — “RS”,; selezione registro; “R/W”, direzione di trasferimento dati (scrittura/lettura); 7-14 - “DB0”, “DB1”, .., “DB7” - bus dati; ); 16 — catodo di retroilluminazione (terra). Alle uscite digitali del controller sono collegate le linee VEE, RS e quattro linee dati DB4, DB5, DB6, DB7. Collegheremo la linea “R/W” alla “massa” del controller (poiché abbiamo solo bisogno della funzione di scrittura nella memoria del display). Per ora non collegheremo la retroilluminazione, penso che tu possa capirlo facilmente da solo :) Diagramma schematico di collegamento del display a ArduinoUnoAspetto del layout
Per ogni evenienza, anche sotto forma di cartello:
Display LCD1602 | 1 | 2 | 4 | 6 | 11 | 12 | 13 | 14 | 15 | 16 |
ArduinoUno | GND | +5V | 4 | 5 | 6 | 7 | 8 | 9 | +5V | GND |
2. Programmazione “Ciao mondo!”
Per lavorare con display LCD di varie dimensioni e tipologie, l'editor IDE di Arduino dispone di una libreria speciale Cristalli liquidi. Per includere la libreria, scriviamo la seguente espressione nella prima riga del nostro programma: #include3. Programmazione dell'orologio
Ora che il display funziona correttamente, proviamo a trasformare il nostro semplice dispositivo in un vero e proprio orologio elettronico. Attenzione! Per visualizzare l'ora, abbiamo bisogno della libreria Time. Se non è ancora installato, puoi scaricare l'archivio dal collegamento. Colleghiamolo: #include- year() - ci restituirà l'anno;
- mese(): mese;
- giorno() - giorno;
- ora() - ora;
- minuto() - restituirà il minuto;
- secondo() - secondo.
Per lavorare con i display grafici dei caratteri, suggeriamo di utilizzare la libreria LiquidCrystal, inclusa nel set IDE Arduino standard ed è progettata per funzionare tramite un'interfaccia parallela a 8 bit (4 bit). Se il tuo display è collegato ad Arduino tramite il bus I2, devi installare la libreria LiquidCrystal_I2C (la maggior parte delle cui funzioni ripetono le funzioni della prima libreria).
Display supportati:
Schermo | Connessione e inizializzazione |
---|---|
LCD1602 - display caratteri (16x02 caratteri), |
#includere [ , 8 , 9 , 10 , 11 ]); configurazione nulla())( lcd.begin(16, 2);} // Spiegazione:
|
con interfaccia I2C (blu) |
#includere #includere LiquidCrystal_I2C lcd(0x27 O 0x3F, 16 , 2); configurazione nulla())( lcd.init(); } // Spiegazione: |
LCD1602 I2C - display caratteri (16x02 caratteri), con interfaccia I2C (verde) |
#includere #includere LiquidCrystal_I2C lcd(0x27 O 0x3F, 16 , 2); configurazione nulla())( lcd.init(); } // Spiegazione: |
LCD2004 - display caratteri (20x04 caratteri), con interfaccia parallela (blu) |
#includere LCD a cristalli liquidi (2, 3, 4, 5, 6, 7[ , 8 , 9 , 10 , 11 ]); configurazione nulla())( lcd.begin(20, 4);} // Spiegazione: // Se vengono utilizzati 8 cavi del bus dati, indicarli tutti |
LCD2004 I2C - display caratteri (20x04 caratteri), con interfaccia I2C (blu) |
#includere #includere LiquidCrystal_I2C lcd(0x27 O 0x3F, 20 , 4); configurazione nulla())( lcd.init(); } // Spiegazione: |
#1 Esempio
Visualizziamo la scritta sul display LCD1602 collegato tramite bus I2C. Per funzionare con il display LCD2004, è necessario modificare la riga 3 in LiquidCrystal_I2C lcd(0x27,20,4);
#includere
#2 Esempio
Visualizziamo la scritta sul display LCD1602 collegato tramite bus parallelo a 4 bit. Per lavorare con il display LCD2004, è necessario modificare la riga 5 in lcd.begin(20, 4);
#includere
# 3 Esempio
Visualizziamo la scritta "Lingua russa" sul display LCD1602 collegato tramite il bus I2C:
#includere
# 4 Esempio
Visualizziamo il tempo trascorso dopo la partenza sul display LCD1602 collegato tramite bus I2C:
#includere
Funzioni comuni alle librerie LiquidCrystal e LiquidCrystal_I2C:
- inizio( colonne, righe, ); – Inizializza il display con il numero di colonne, righe e dimensione dei caratteri.
- chiaro();– Cancellare il display con il cursore nella posizione 0,0 (richiede molto tempo!).
- casa();– Impostare il cursore sulla posizione 0,0 (richiede molto tempo!).
- Schermo();– Accendere velocemente il display (senza modificare i dati in RAM).
- noDisplay();– Spegnimento rapido del display (senza modificare i dati in RAM).
- battito di ciglia();– Accendere il cursore lampeggiante (con frequenza di circa 1 Hz).
- noBlink();– Disattivare il cursore lampeggiante.
- cursore();– Abilita la sottolineatura del cursore.
- noCursore();– Disabilita la sottolineatura del cursore.
- scrollDisplayLeft();– Fa scorrere il display verso sinistra. Sposta le coordinate di visualizzazione di una colonna a sinistra (senza modificare la RAM).
- scrollDisplayRight();– Fa scorrere il display verso destra. Sposta le coordinate di visualizzazione di una colonna a destra (senza modificare la RAM).
- da sinistra a destra();– Specifica di spostare ulteriormente la posizione del cursore, dopo aver visualizzato il carattere successivo, di una colonna a destra.
- da destra a sinistra();– Specifica di spostare ulteriormente la posizione del cursore, dopo aver visualizzato il carattere successivo, di una colonna a sinistra.
- noAutoscorrimento();– Specifica che il testo verrà allineato a sinistra della posizione del cursore in futuro (come al solito).
- scorrimento automatico();– Indica che in futuro il testo verrà allineato a destra rispetto alla posizione del cursore.
- createChar( numero, matrice ); – Scrivere un carattere personalizzato nella CGRAM del display sotto il numero specificato.
- setCursore( col,riga ); – Posizionare il cursore nella posizione indicata dalla colonna e dal numero di riga.
- stampa( testo ); – Visualizzare testo, simboli o numeri sullo schermo del display. La sintassi è simile alla funzione di classe Serial con lo stesso nome.
Funzioni implementate solo nella libreria LiquidCrystal_I2C:
- dentro();– Visualizzazione dell'inizializzazione. Deve essere il primo comando della libreria LiquidCrystal_I2C dopo la creazione dell'oggetto. In effetti, questa funzione è presente anche nella libreria LiquidCrystal, ma in quella libreria viene chiamata automaticamente (per impostazione predefinita) quando viene creato un oggetto.
- retroilluminazione();– Accendere la retroilluminazione del display.
- noRetroilluminazione();– Spegne la retroilluminazione del display.
- setRetroilluminazione( bandiera ); – Controllo della retroilluminazione (true - attiva / false - disattiva), utilizzato al posto delle funzioni noBacklight e retroilluminazione.
Connessione:
// Per il bus I2C: |
Parametro:
|
// Per un bus parallelo a 4 fili: #includere Cristalli liquidi lcd( RS , E , D4 , D5 , D6 , D7 ); configurazione nulla())( lcd.begin( col , riga ); } |
Parametro:
|
// Per un bus parallelo a 8 fili: #includere Cristalli liquidi lcd( RS , E , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 ); configurazione nulla())( lcd.begin( col , riga ); } |
|
inizio( col ,
riga ,
);
Inizializza il display con le dimensioni e i caratteri dello schermo. |
Parametro:
|
Funzioni di controllo del display:
Schermo(); Accende il display dopo che è stato spento dalla funzione noDisplay. |
Nota: la funzione viene eseguita rapidamente e non modifica la RAM del display. |
noDisplay(); Spegne il display. I dati sul display non verranno visualizzati finché non viene richiamata la funzione di visualizzazione, ma non verranno cancellati dalla memoria RAM e, dopo aver richiamato la funzione di visualizzazione, verranno visualizzati nuovamente. |
Nota: la funzione viene eseguita rapidamente e non modifica la RAM del display. |
scrollDisplayLeft(); Sposta le coordinate di visualizzazione di una colonna a sinistra. |
|
scrollDisplayRight(); Sposta le coordinate di visualizzazione di una colonna a destra. Chiamare costantemente questa funzione creerà un effetto di linea strisciante. Le coordinate vengono spostate sia per le informazioni disponibili sul display che per quelle che verranno visualizzate successivamente. |
Nota: la funzione funziona senza modificare la RAM del display. Se chiami la funzione 40 volte di seguito, le coordinate torneranno al punto originale |
chiaro(); Cancella il display impostando il cursore sulla posizione 0,0. Le informazioni sul display verranno cancellate definitivamente. |
Nota: richiede molto tempo. |
retroilluminazione(); Attiva la retroilluminazione del display. |
|
noRetroilluminazione(); Disattiva la retroilluminazione del display. |
Nota: la funzione è implementata solo nella libreria LiquidCrystal_I2C. |
setRetroilluminazione( bandiera );
Controllo della retroilluminazione (invece di noBacklight e funzioni di retroilluminazione). |
Parametro:
|
Funzioni di controllo del cursore:
setCursore( col ,
riga );
Posiziona il cursore nella posizione specificata. |
Parametro:
|
casa(); Impostazione del cursore sulla posizione 0,0. Funziona come la funzione setCursor(0,0); |
Nota: richiede molto tempo. |
battito di ciglia(); Abilita il cursore lampeggiante. |
Nota: Il cursore occupa l'intero campo carattere e lampeggia con una frequenza di circa 1 Hz, nella posizione in cui era precedentemente impostato. |
noBlink(); Disattiva il cursore lampeggiante. |
Nota: il cursore diventa invisibile, ma la sua posizione viene mantenuta. |
cursore(); Abilita la sottolineatura del cursore. |
Nota: il cursore assume la forma di un carattere di sottolineatura e si trova nella posizione in cui era precedentemente posizionato. |
noCursore(); Disattiva la sottolineatura del cursore. |
Nota: il cursore diventa invisibile, ma la sua posizione viene mantenuta. |
Funzioni che indicano la direzione e l'allineamento:
da sinistra a destra(); Specifica che dopo ogni nuovo carattere, la posizione del cursore deve spostarsi di una colonna a destra. |
Nota: se si visualizza il testo "abc", il display mostrerà "abc" e il testo sarà a destra della posizione originale del cursore. (Come di solito) |
da destra a sinistra(); Specifica che dopo ogni nuovo carattere, la posizione del cursore dovrebbe spostarsi di una colonna a sinistra. |
Nota: se si visualizza il testo "abc", il display visualizzerà "cba" e il testo sarà a sinistra della posizione originale del cursore. (Scrivendo da destra a sinistra) |
noAutoscorrimento(); Indica che in futuro il testo dovrà essere allineato a sinistra della posizione originale del cursore. |
Nota: se si posiziona il cursore nella posizione 10.0 e si visualizza il testo, il primo carattere del testo visualizzato si troverà in questa posizione. (Come di solito) |
scorrimento automatico(); Indica che in futuro il testo dovrà essere allineato a destra della posizione originale del cursore. |
Nota: se si posiziona il cursore nella posizione 10.0 e si visualizza il testo, il cursore si troverà in questa posizione. (Le coordinate di visualizzazione verranno spostate a sinistra, come se avessi chiamato la funzione scrollDisplayLeft tante volte quante sono le lettere nel testo di output) |
Funzioni di immissione di testo e simboli:
createChar(num,array); Scrive un carattere personalizzato nella CGRAM del display sotto il numero specificato. Se vuoi visualizzare il testo (usando la funzione print) che dovrebbe contenere il carattere che hai impostato, specifica una barra e il numero sotto il quale è stato scritto questo carattere: print("C\1MBO\2"). |
Parametro:
|
stampa(testo); Visualizza testo, simboli o numeri sullo schermo del display. |
Parametro:
|
Linea strisciante nel display LCD dell'HD44780.
La ricerca di una “soluzione già pronta” per un ticker in C non ha prodotto risultati. Quindi ho dovuto farlo da solo.
Questo "pezzo" di codice consente di visualizzare una linea corrente (da destra a sinistra), in qualsiasi luogo e con qualsiasi numero di familiarità, negli indicatori LCD con un controller HD44780 o simile.
La prima cosa da sottolineare è che il linguaggio C non permette di lavorare con le stringhe “direttamente”. Cioè, è impossibile copiare un carattere da una stringa all'altra utilizzando l'operatore di assegnazione ( = )... per questo è necessario utilizzare una funzione speciale strncpy(). In generale, per lavorare con le stringhe in C vengono utilizzate diverse funzioni. In Self-Tormentors, un capitolo a parte è dedicato all'uso di queste funzioni. In Help"e su CV_AVR, una descrizione delle funzioni per lavorare con le stringhe si trova nella sezione "Funzioni delle stringhe". I prototipi di queste funzioni sono nel file stringa.h.
"...stringa sorgente..." - una stringa di caratteri da cui deve essere visualizzata nella riga "in esecuzione";
"...caratteri visualizzati..." - l'effettiva "linea strisciante".
Per organizzare la linea strisciante è stato scelto il seguente algoritmo:
1. I caratteri visualizzati si spostano da destra a sinistra. Quello più a sinistra è “perso” in questo caso.
2. Dopo lo spostamento, il carattere successivo della stringa sorgente viene copiato nel carattere più a destra.
3. Quando viene raggiunta la fine della riga di origine, il primo carattere della riga di origine diventa il carattere successivo.
Per spostare i caratteri: per la cella da spostare, il codice del carattere viene letto dalla RAM dello schermo (DDRAM) HD44780 e scritto nella cella RAM di sinistra.
Secondo il DataSheet sull'HD44780, il carattere sinistro della riga superiore ha un indirizzo DDRAM di 0x00, e il carattere sinistro della riga inferiore ha un indirizzo di 0x40. Va ricordato che per poter accedere alla RAM dello schermo (e non alla RAM del generatore di caratteri), è necessario che il bit RS sia uguale a 1 (RS è il bit più significativo nel byte di indirizzo, vedi DataSheet).
Di conseguenza, otteniamo che per "indirizzare" il secondo carattere a sinistra della riga superiore, è necessario "lavorare" con l'indirizzo 0x01 | 0x80 = 0x81.
Nella libreria sono presenti le funzioni di scrittura e lettura dei “contenuti interni” dell'HD44780 (prototipi in lcd.h.... quindi.. il programma stesso:
/* per CV_AVR In questo esempio, la linea corrente viene visualizzata nei bit da 8 (0xC7) a 16 della linea inferiore di un indicatore a 16 bit. . ...... #includere carattere senza segno n_sim=1,m_end=43; //43 - lunghezza della linea nell'esempio implorare_stroka())( // sposta la linea strisciante if(beg_str)( // scrive il carattere successivo nella posizione più a destra lcd_gotoxy(15,1); |
Glossario: n_sim - puntatore alla posizione del carattere corrente nella stringa sorgente; m_end - il numero totale di caratteri nella stringa di origine; supplicare_str- bit "abilita" spostamento. Con il suo aiuto puoi regolare la velocità di corsa; ish_str - stringa di origine. |
Molto probabilmente, ciascuno dei compilatori C esistenti dispone di funzioni di libreria per lavorare con l'HD44780. Pertanto, "rifare" il programma per il "tuo" compilatore non sarà difficile.
“Preparo” la stringa sorgente utilizzando la nota utility “HD44780.exe”. Quando lo si utilizza, la lunghezza della riga è indicata nei commenti: "/* Lunghezza massima di una riga: 43 byte */"