- Arbejder med 16x2 LCD-skærm
- Kredsløbsdiagram til interface LCD med STM8 Microcontroller
- STM8 LCD-bibliotek - headerfil til STM8S103F3P6
- LCD-program til STM8S mikrokontroller
- STM8 med LCD - Arbejder
Den 16x2 alfanumeriske LCD-skærm er den mest anvendte skærm blandt hobbyister og entusiaster. Skærmen er meget nyttig, når du vil vise grundlæggende oplysninger til brugeren og kan også hjælpe med at teste eller fejle vores kode. Dette særlige 16x2 LCD-modul er let tilgængeligt og har været populært i lang tid. Du kan lære mere om det grundlæggende i 16x2 LCD-modulet i den linkede artikel.
For at fortsætte med vores serie af STM8 Microcontroller-tutorials, i denne tutorial, lærer vi, hvordan man interface et LCD-display med STM8 Microcontroller. Vi har tidligere også interfacet 16x2 LCD med mange andre mikrokontrollere. Selvstudierne er angivet nedenfor, og du kan kontrollere dem, hvis du er interesseret.
Hvis du er ny på STM8, skal du tjekke at komme i gang med STM8 Microcontroller-artiklen for at forstå det grundlæggende i controllerkortet og programmeringsmiljøet. Vi vil ikke dække det grundlæggende i denne vejledning.
Arbejder med 16x2 LCD-skærm
Som navnet antyder, vil en 16x2 LCD have 16 kolonner og 2 rækker. Så i alt vil vi være i stand til at vise 32 tegn på dette display, og disse tegn kan være alfabeter eller tal eller endda symboler. En simpel 16x2 LCD pinout, som vi bruger i denne vejledning, vises nedenfor -
Som du kan se, har skærmen 16 ben, og vi kan opdele den i fem kategorier, Power Pins, contrast pin, Control Pins, Data pins og Backlight pins som vist i nedenstående tabel. Vi kommer ind på detaljerne for hver pin, når vi diskuterer kredsløbsdiagrammet i denne vejledning.
Kategori | Pin NO. | Pin-navn | Fungere |
Power Pins | 1 | VSS | Jordstift, forbundet til jorden |
2 | VDD eller Vcc | Spændingsstift + 5V | |
Kontraststift | 3 | V0 eller VEE | Kontrastindstilling, forbundet til Vcc via en variabel modstand. |
Kontrolstifter | 4 | RS | Registrer Vælg Pin, RS = 0 Kommandotilstand, RS = 1 Datatilstand |
5 | RW | Læse / skrive-pin, RW = 0 Skriv-tilstand, RW = 1 Læs-tilstand | |
6 | E | Aktiver, en høj til lav puls har brug for at aktivere LCD | |
Datapinde | 7-14 | D0-D7 | Data Pins, Gemmer de data, der skal vises på LCD eller kommandoinstruktionerne |
Baggrundsbelysningstifter | 15 | LED + eller A. | For at tænde baggrundsbelysning + 5V |
16 | LED- eller K | Baggrundsbelysning |
På bagsiden af LCD'et, som vist på billedet nedenfor, finder du to sorte prikker, hvori vi har HD44780 LCD driver IC (omgivet af rødt). Vores mikrocontroller skal kommunikere med denne IC, som igen styrer, hvad der vises på LCD'et. Hvis du er nysgerrig efter at vide, hvordan alt dette fungerer, bør du tjekke, hvordan 16x2 LCD-display fungerer, hvor vi allerede har diskuteret, hvordan LCD-skærmen fungerer i detaljer.
I denne vejledning vil vi diskutere kredsløbsdiagrammet og koden for at vise alfameriske tegn (alfabeter og tal) på en 16x2 LCD-skærm ved hjælp af enkle kommandoer LCD_print _char og LCD_print_string . Disse kommandoer kan bruges direkte i programmet efter at have inkluderet vores headerfil. Overskriftsfilen beskæftiger sig med alle de fleste ting for dig, så det er ikke obligatorisk at vide, hvordan skærmen eller HD44780 driver IC fungerer.
Kredsløbsdiagram til interface LCD med STM8 Microcontroller
Det komplette STM8 LCD-kredsløb kan findes i nedenstående billede. Som du kan se, er forbindelsen til STM8S103F3P6-controller med LCD meget enkel, vi har LCD-skærmen direkte tilsluttet vores kort, og ST-linket er også forbundet til at programmere kortet.
Strømstifterne Vss og Vcc er tilsluttet 5V-stiften på STM8S-kortet, bemærk at LCD-driftsspændingen er 5V og er forbundet til at fungere på 3,3V. Så selvom STM8S103F3P6 Microcontroller fungerer på 3.3V, er det obligatorisk at have en 5V-forsyning til LCD'et, kan du undgå dette ved at bruge en ladestyring IC, men vi vil ikke diskutere det i denne vejledning.
Dernæst har vi kontraststiften, som bruges til at indstille LCD-kontrasten, vi har tilsluttet den til potentiometeret, så vi kan kontrollere kontrasten. Vi har brugt en 10k potte, men du kan også bruge andre nærliggende værdier, potten fungerer som en potentiel skillevæg til at give 0-5 V til kontraststiften, typisk kan du også bruge en modstand direkte til at levere omkring 2,2 V til rimelig kontrast værdi. Så har vi reset (RS), Læs / skriv (RW) og Aktiver (E) ben. Læs-skriv-stiften er jordforbundet, fordi vi ikke læser noget fra LCD'et, vi udfører kun skriveoperationer. De to andre styrestifter Rs og E er forbundet til henholdsvis PA1 og PA2-stifter.
Så har vi datapindene DB0 til DB7. 16x2 LCD kan fungere i to tilstande, den ene er en 8-bit driftstilstand, hvor vi skal bruge alle de 8 datapinde (DB0-DB7) på LCD'et, og den anden er 4-bit driftstilstand, hvor vi kun har brug for 4 datapinde (DB4-DB7). 4-bit-tilstanden bruges ofte, fordi den kræver færre GPIO-ben fra controlleren, så vi har også brugt 4-bit-tilstand i denne vejledning og har kun tilsluttet ben DB4, DB5, DB6 og DB7 til ben PD1, PD2, PD3 og PD4.
De sidste to ben BLA og BLK bruges til at drive den interne baggrundsbelysning LED, vi har brugt en 560 ohm modstand som en strømbegrænsende modstand. ST-Link programmøren er tilsluttet som altid som i vores tidligere tutorial. Jeg lavede den komplette forbindelse på brødbrættet, og min opsætning ser sådan ud vist på billedet nedenfor.
STM8 LCD-bibliotek - headerfil til STM8S103F3P6
Før vi fortsætter i kredsløbsdiagrammet, lad os hente STM8 LCD-headerfilen fra GitHub ved hjælp af følgende link-
STM8S 16x2 LCD header-fil
Du kan enten downloade den komplette repo og få stm8s103_LCD_16x2.h- filen eller simpel koden fra ovenstående link. Mens du indstiller projektet, skal du sørge for at medtage alle de nødvendige headerfiler i inc-biblioteket sammen med denne header-fil.
Hvis du ikke er sikker på, hvordan du tilføjer headerfiler og kompilerer programmet, skal du følge videoen nederst på denne side. Og hvis du er nysgerrig efter, hvordan koden inde i headerfilen fungerer, kan du tjekke PIC med en LCD-tutorial. Overskriftsfilen, der bruges i dette projekt, ligner meget den der er forklaret der, så vi kommer ikke nærmere ind på det.
LCD-program til STM8S mikrokontroller
Til demonstrationen programmerer vi vores STM8S-controller til at vise en simpel streng som "Circuit Digest", og derefter øges en "Test" -værdi for hvert sekund i anden linje. Det komplette program findes nederst på denne side. Forklaringen er som følger.
Vi starter vores program ved at definere stifterne og tilføje de nødvendige headerfiler som altid. I vores ovenfor diskuterede kredsløbsdiagram har vi tilsluttet LCD_RS til PA1, så vi har defineret det som LCD_RS GPIOA, GPIO_PIN_1. På samme måde har vi også gjort det for andre ben. Hvis de følger et andet kredsløb, skal du sørge for at ændre disse værdier i overensstemmelse hermed.
#definer LCD_RS GPIOA, GPIO_PIN_1 #definer LCD_EN GPIOA, GPIO_PIN_2 #definer LCD_DB4 GPIOD, GPIO_PIN_1 #definer LCD_DB5 GPIOD, GPIO_PIN_2 #definer LCD_DB6 GPIOD, GPIO_PIN_3 #diod_DIN_DIN
Næste inde i vores hovedprogram har vi deklareret de variabler, der kræves til denne prøvekode. Vi har en testvariabel kaldet test_var, som initialiseres til nul, vi øger variablen og viser den på LCD'et. Tegnene d1 til d4 repræsenterer de 4 cifre i testvariablen, fordi vores LCD ikke kan vise int-værdi direkte, vi er nødt til at konvertere dem til tegn.
// Variable erklæringer int test_var = 0; char d4, d3, d2, d1;
Den LCD_Begin () funktionen bruges til at initialisere LCD. Denne funktion initialiserer alle de krævede GPIO-ben og indstiller også LCD i 16x2 LCD-tilstand. Så har vi funktionen LCD_Clear () , der bruges til at rydde alle værdierne på LCD'et, dette sletter alt på LCD'et, så det er rent at skrive nye værdier. Derefter har vi funktionen LCD_Set_Cursor (x, y) , hvor x og y er de positioner, hvor vi skal skrive vores nye karakter. For eksempel betyder (1,1) første række og første Colum, ligeledes (2,12) betyder anden række 12 kolonne, ligeledes. Bemærk, at vi har 2 rækker og 16 kolonner her, som vi diskuterede tidligere.
Lcd_Begin (); Lcd_Clear (); Lcd_Set_Cursor (1,1);
Nu er LCD'et indstillet, ryddet, og markøren er på stedet. Den næste ting er at udskrive noget på skærmen. Vi kan bruge LCD_Print_String ("Sample String") til at udskrive en streng til LCD og LCD_Print_Char (a) til at udskrive en tegnværdi til LCD'et. I vores program her har vi udskrevet “STM8S103F3P3 LCD” og oprettet en forsinkelse på 5 sekunder ved hjælp af nedenstående kode.
Lcd_Print_String ("STM8S103F3P3 LCD"); forsinkelse_ms (5000);
Efter 5 sekunders forsinkelse rydder vi LCD-skærmen igen og viser "Circuit Digest" i første række og "Test:" I anden række.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Circuit Digest"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("Test:");
Inde i while- sløjfen vil vi opdele værdien på heltalsvariablen test_var i individuelle tegn, så den kan vises på LCD'et ved hjælp af simple opdeling- og moduloperatorer. Vi har også tilføjet '0' for at konvertere ASCII-værdien til tegnet.
d4 = test_var% 10 + '0'; d3 = (test_var / 10)% 10 + '0'; d2 = (test_var / 100)% 10 + '0'; d1 = (test_var / 1000) + '0';
Derefter har vi sat markøren til (2,6), fordi vi allerede har skrevet “Test:” i anden række, der er 6 tegn. Hvis vi overskriver, erstattes det eksisterende tegn med et nyt tegn på LCD. Vi har også tilføjet en forsinkelse på 1 sekund og forøger variablen.
Lcd_Set_Cursor (2,6); Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); forsinkelse_ms (1000); test_var ++;
STM8 med LCD - Arbejder
For at teste vores program skal du blot uploade koden til vores controller og tænde den med mikro-USB-porten. Bemærk, at LCD-skærmen kræver 5V for at arbejde, så det er obligatorisk at tænde kortet fra USB-porten. Vi har tidligere kørt den direkte fra ST-link, fordi vi ikke havde brug for 5V-forsyningen.
Som du kan se, fungerer LCD'et som forventet, hvor testvariabelværdien øges for hvert sekund ca. Bemærk også, at vi ikke har brugt timere og kun har brugt forsinkelsesfunktion til at oprette denne forsinkelse, så forvent ikke, at forsinkelsens varighed er nøjagtig, vi bruger timere senere i en anden tutorial til dette formål.
Den komplette bearbejdning af projektet kan findes i den linkede video nedenfor. Håber du nød tutorialen og lærte noget nyttigt. Hvis du har spørgsmål, skal du lade dem være i kommentarsektionen eller bruge vores fora til andre tekniske forespørgsler.