- Funzionamento del display LCD 16x2
- Schema del circuito per interfacciare il display LCD con il microcontrollore STM8
- Libreria LCD STM8 - File di intestazione per STM8S103F3P6
- Programma LCD per microcontrollore STM8S
- STM8 con LCD - Funzionante
Il display LCD alfanumerico 16x2 è il display più comunemente utilizzato da hobbisti e appassionati. Il display è molto utile quando si desidera visualizzare le informazioni di base all'utente e può anche aiutare a testare o eseguire il debug del nostro codice. Questo particolare modulo LCD 16x2 è facilmente disponibile ed è popolare da molto tempo. Puoi saperne di più sulle basi del modulo LCD 16x2 nell'articolo collegato.
Per continuare con la nostra serie di tutorial sul microcontrollore STM8, in questo tutorial impareremo come interfacciare un LCD con il microcontrollore STM8. In precedenza abbiamo interfacciato LCD 16x2 anche con molti altri microcontrollori, i tutorial sono elencati di seguito e puoi controllarli se interessati.
Se non hai familiarità con STM8, dai un'occhiata alla guida introduttiva all'articolo sul microcontrollore STM8 per comprendere le basi della scheda controller e dell'ambiente di programmazione. Non tratteremo le basi in questo tutorial.
Funzionamento del display LCD 16x2
Come suggerisce il nome, un LCD 16x2 avrà 16 colonne e 2 righe. Quindi, in totale, saremo in grado di visualizzare 32 caratteri su questo display e questi caratteri possono essere alfabeti o numeri o anche simboli. Di seguito è mostrato un semplice pinout LCD 16x2 che usiamo in questo tutorial-
Come puoi vedere, il display ha 16 pin e possiamo dividerlo in cinque categorie, Power Pins, contrasto pin, Control Pin, Data pin e Backlight pin come mostrato nella tabella seguente. Entreremo nei dettagli di ogni pin quando discuteremo lo schema del circuito di questo tutorial.
Categoria | Pin NO. | Nome pin | Funzione |
Pin di alimentazione | 1 | VSS | Pin di terra, collegato a terra |
2 | VDD o Vcc | Pin di tensione + 5V | |
Perno di contrasto | 3 | V0 o VEE | Regolazione del contrasto, collegata a Vcc tramite una resistenza variabile. |
Pin di controllo | 4 | RS | Pin di selezione registro, RS = 0 Modalità comando, RS = 1 Modalità dati |
5 | RW | Pin di lettura / scrittura, RW = 0 Modalità di scrittura, RW = 1 Modalità di lettura | |
6 | E | Abilita, un impulso da alto a basso deve abilitare l'LCD | |
Pin dati | 7-14 | D0-D7 | Pin dati, memorizza i dati da visualizzare sul display LCD o le istruzioni di comando |
Perni di retroilluminazione | 15 | LED + o A | Per alimentare la retroilluminazione + 5V |
16 | LED o K | Retroilluminazione a terra |
Sul retro dell'LCD, come mostrato nell'immagine sottostante, troverai due punti neri, all'interno dei quali abbiamo il driver IC dell'HD44780 LCD (cerchiato in rosso). Il nostro microcontrollore dovrebbe comunicare con questo IC che a sua volta controllerà ciò che viene visualizzato sull'LCD. Se sei curioso di sapere come funziona esattamente tutto questo, dovresti dare un'occhiata al funzionamento del display LCD 16x2 dove abbiamo già discusso in dettaglio come funziona il display LCD.
In questo tutorial, discuteremo lo schema del circuito e il codice per visualizzare caratteri alfanumerici (alfabeti e numeri) su un display LCD 16x2 utilizzando semplici comandi LCD_print _char e LCD_print_string . Questi comandi possono essere utilizzati direttamente nel programma dopo aver incluso il nostro file di intestazione. Il file di intestazione si occupa di tutta la maggior parte delle cose per te, quindi non è obbligatorio sapere come funziona il display o l'IC del driver HD44780.
Schema del circuito per interfacciare il display LCD con il microcontrollore STM8
Il circuito LCD STM8 completo può essere trovato nell'immagine sottostante. Come puoi vedere la connessione per il controller STM8S103F3P6 con LCD è molto semplice, abbiamo il display LCD direttamente collegato alla nostra scheda e anche l'ST-link è collegato per programmare la scheda.
I pin di alimentazione Vss e Vcc sono collegati al pin 5V sulla scheda STM8S, notare che la tensione operativa dell'LCD è 5V ed è collegato per funzionare a 3,3V. Quindi, anche se il microcontrollore STM8S103F3P6 funziona a 3,3 V è obbligatorio per avere un'alimentazione a 5 V per l'LCD, è possibile evitarlo utilizzando un controller di carica IC, ma non ne parleremo in questo tutorial.
Successivamente, abbiamo il pin di contrasto che viene utilizzato per impostare il contrasto dell'LCD, lo abbiamo collegato al potenziometro in modo da poter controllare il contrasto. Abbiamo usato un potenziometro da 10k, ma puoi anche usare altri valori vicini, il potenziometro funge da potenziale divisore per fornire 0-5 V al pin di contrasto, in genere puoi anche utilizzare un resistore direttamente per fornire circa 2.2V per un contrasto ragionevole valore. Quindi abbiamo i pin reset (RS), Read / Write (RW) e Enable (E). Il pin di lettura / scrittura è collegato a terra perché non leggeremo nulla dal display LCD, ma eseguiremo solo operazioni di scrittura. Gli altri due pin di controllo Rs ed E sono collegati rispettivamente ai pin PA1 e PA2.
Quindi abbiamo i pin dati da DB0 a DB7. L'LCD 16x2 può funzionare in due modalità, una è una modalità operativa a 8 bit in cui dobbiamo utilizzare tutti gli 8 pin dati (DB0-DB7) sull'LCD e l'altra è la modalità operativa a 4 bit in cui ne servono solo 4 pin dati (DB4-DB7). La modalità a 4 bit è comunemente utilizzata perché richiede meno pin GPIO dal controller, quindi abbiamo utilizzato anche la modalità a 4 bit in questo tutorial e abbiamo collegato solo i pin DB4, DB5, DB6 e DB7 ai pin PD1, PD2, PD3 e PD4 rispettivamente.
Gli ultimi due pin BLA e BLK sono utilizzati per alimentare la retroilluminazione LED interna, abbiamo utilizzato una resistenza da 560 ohm come resistenza limitatrice di corrente. Il programmatore ST-Link è collegato come sempre come nel nostro precedente tutorial. Ho effettuato la connessione completa sulla breadboard e la mia configurazione è simile a questa mostrata nell'immagine qui sotto.
Libreria LCD STM8 - File di intestazione per STM8S103F3P6
Prima di procedere nello schema del circuito, prendiamo il file di intestazione LCD STM8 da GitHub utilizzando il seguente link-
File di intestazione LCD STM8S 16x2
Puoi scaricare il repository completo e ottenere il file stm8s103_LCD_16x2.h o semplicemente il codice dal link sopra. Durante l'impostazione del progetto, assicurati di includere tutti i file di intestazione richiesti nella directory inc insieme a questo file di intestazione.
Se non sei sicuro di come aggiungere i file di intestazione e compilare il programma, segui il video in fondo a questa pagina. E se sei curioso di sapere come funziona il codice all'interno del file di intestazione, puoi controllare il PIC con un tutorial LCD. Il file di intestazione utilizzato in questo progetto è molto simile a quello spiegato lì, quindi non entreremo nei dettagli.
Programma LCD per microcontrollore STM8S
Per la dimostrazione, programmeremo il nostro controller STM8S per visualizzare una semplice stringa come "Circuit Digest" e quindi incrementeremo un valore "Test" per ogni secondo nella seconda riga. Il programma completo si trova in fondo a questa pagina. La spiegazione è la seguente.
Iniziamo il nostro programma definendo i pin e aggiungendo i file di intestazione richiesti come sempre. Nel nostro schema circuitale discusso sopra, abbiamo collegato LCD_RS a PA1, quindi lo abbiamo definito come LCD_RS GPIOA, GPIO_PIN_1. Allo stesso modo, abbiamo fatto lo stesso anche per altri pin. Se stanno seguendo un circuito diverso, assicurati di modificare questi valori di conseguenza.
#define LCD_RS GPIOA, GPIO_PIN_1 #define LCD_EN GPIOA, GPIO_PIN_2 #define LCD_DB4 GPIOD, GPIO_PIN_1 #define LCD_DB5 GPIOD, GPIO_PIN_2 #define LCD_DB6 GPIOD, GPIO_PIN_3 #Define LCD_DB5 GPIOD, GPIO_PIN_2 #define LCD_DB6 GPIOD, GPIO_PIN_3 #
Successivamente, all'interno del nostro programma principale, abbiamo dichiarato le variabili richieste per questo codice di esempio. Abbiamo una variabile di test chiamata test_var che è inizializzata a zero, incrementeremo la variabile e la visualizzeremo sull'LCD. I caratteri da d1 a d4 rappresentano le 4 cifre della variabile di test perché il nostro LCD non può visualizzare direttamente il valore int, dobbiamo convertirli in caratteri.
// Dichiarazioni di variabili int test_var = 0; char d4, d3, d2, d1;
La funzione LCD_Begin () viene utilizzata per inizializzare l'LCD. Questa funzione inizializzerà tutti i pin GPIO richiesti e imposterà anche l'LCD in modalità LCD 16x2. Quindi abbiamo la funzione LCD_Clear () che viene utilizzata per cancellare tutti i valori sull'LCD, questo cancellerà tutto sull'LCD in modo che sia pulito per scrivere nuovi valori. Quindi abbiamo la funzione LCD_Set_Cursor (x, y) dove x e y sono le posizioni in cui dobbiamo scrivere il nostro nuovo carattere. Ad esempio, (1,1) significa prima riga e prima colonna, allo stesso modo (2,12) significa seconda riga 12 colonna, allo stesso modo. Nota che abbiamo 2 righe e 16 colonne qui come discusso in precedenza.
Lcd_Begin (); Lcd_Clear (); Lcd_Set_Cursor (1,1);
Ora, il display LCD è impostato, cancellato e il cursore si trova nel punto. La prossima cosa è stampare qualcosa sullo schermo. Possiamo usare LCD_Print_String ("Sample String") per stampare una stringa su LCD e LCD_Print_Char (a) per stampare un valore di carattere sull'LCD. Nel nostro programma qui abbiamo stampato "STM8S103F3P3 LCD" e creato un ritardo di 5 secondi utilizzando il codice sottostante.
Lcd_Print_String ("STM8S103F3P3 LCD"); delay_ms (5000);
Dopo il ritardo di 5 secondi, cancelliamo nuovamente il display LCD e visualizziamo "Circuit Digest" nella prima riga e "Test:" I nella seconda riga.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Circuit Digest"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("Test:");
All'interno del ciclo while , suddivideremo il valore sulla variabile intera test_var in singoli caratteri in modo che possa essere visualizzato sul display LCD utilizzando semplici operatori di divisione e modulo. Abbiamo anche aggiunto "0" per convertire il valore ASCII nel carattere.
d4 = test_var% 10 + '0'; d3 = (test_var / 10)% 10 + '0'; d2 = (test_var / 100)% 10 + '0'; d1 = (test_var / 1000) + '0';
Quindi abbiamo impostato il cursore su (2,6) perché abbiamo già scritto "Test:" nella seconda riga che è di 6 caratteri. Se sovrascriviamo, il carattere esistente verrà sostituito con un nuovo carattere sul display LCD. Abbiamo anche aggiunto un ritardo di 1 secondo e incrementato la variabile.
Lcd_Set_Cursor (2,6); Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); delay_ms (1000); test_var ++;
STM8 con LCD - Funzionante
Per testare il nostro programma, è sufficiente caricare il codice sul nostro controller e accenderlo con la porta micro-USB. Si noti che il display LCD richiede 5V per funzionare, quindi è obbligatorio alimentare la scheda dalla porta USB. In precedenza l'abbiamo alimentato direttamente da ST-link perché non avevamo bisogno dell'alimentazione a 5V.
Come puoi vedere, il display LCD funziona come previsto con il valore della variabile di test che viene incrementato approssimativamente ogni secondo. Inoltre, tieni presente che non abbiamo utilizzato i timer e abbiamo utilizzato solo la funzione di ritardo per creare questo ritardo, quindi non aspettarti che la durata del ritardo sia accurata, utilizzeremo i timer più avanti in un altro tutorial a tale scopo.
Il funzionamento completo del progetto si trova nel video linkato di seguito. Spero ti sia piaciuto il tutorial e hai imparato qualcosa di utile. Se hai domande, lasciale nella sezione commenti o usa i nostri forum per altre domande tecniche.