- Arbetar med 16x2 LCD-skärm
- Kretsschema för gränssnitts LCD med STM8 mikrokontroller
- STM8 LCD-bibliotek - rubrikfil för STM8S103F3P6
- LCD-program för STM8S mikrokontroller
- STM8 med LCD - fungerar
Den 16x2 alfanumeriska LCD-skärmen är den vanligaste skärmen bland hobbyister och entusiaster. Skärmen är mycket användbar när du vill visa grundläggande information för användaren och kan också hjälpa till att testa eller felsöka vår kod. Denna speciella 16x2 LCD-modul är lätt tillgänglig och har varit populär under lång tid. Du kan lära dig mer om grunderna för 16x2 LCD-modulen i den länkade artikeln.
För att fortsätta med vår serie STM8 Microcontroller-tutorials, i den här guiden, lär vi oss hur man gränssnitt en LCD med STM8 Microcontroller. Vi har tidigare gränssnitt 16x2 LCD med många andra mikrokontroller också, självstudierna listas nedan och du kan kontrollera dem om du är intresserad.
Om du är ny på STM8, kolla igång med artikeln STM8 Microcontroller för att förstå grunderna för styrkortet och programmeringsmiljön. Vi kommer inte att behandla grunderna i denna handledning.
Arbetar med 16x2 LCD-skärm
Som namnet antyder kommer en 16x2 LCD att ha 16 kolumner och 2 rader. Så totalt sett kommer vi att kunna visa 32 tecken på denna display och dessa tecken kan vara alfabet eller siffror eller till och med symboler. En enkel 16x2 LCD pinout som vi använder i denna handledning visas nedan-
Som du kan se har skärmen 16 stift och vi kan dela den i fem kategorier, Power Pins, contrast pin, Control Pins, Data pins och Backlight pins enligt tabellen nedan. Vi kommer att gå in i detaljerna för varje stift när vi diskuterar kretsschemat för denna handledning.
Kategori | Fäst NO. | Pin-namn | Fungera |
Power Pins | 1 | VSS | Jordstift, ansluten till marken |
2 | VDD eller Vcc | Spänningsstift + 5V | |
Kontraststift | 3 | V0 eller VEE | Kontrastinställning, ansluten till Vcc via ett variabelt motstånd. |
Kontrollstift | 4 | RS | Registrera Välj Pin, RS = 0 Kommandoläge, RS = 1 Dataläge |
5 | RW | Läs- / skrivstift, RW = 0 Skrivläge, RW = 1 Läsläge | |
6 | E | Aktivera, en hög till låg puls behöver aktivera LCD-skärmen | |
Datapinnar | 7-14 | D0-D7 | Data Pins, lagrar de data som ska visas på LCD-skärmen eller kommandoinstruktionerna |
Bakgrundsbelysning Pins | 15 | LED + eller A. | För att driva bakgrundsbelysning + 5V |
16 | LED- eller K | Bakgrundsbelysning mark |
På baksidan av LCD-skärmen, som visas på bilden nedan, hittar du två svarta prickar, inuti vilka vi har HD44780 LCD-drivrutin IC (inringad i rött). Vår mikrokontroller ska kommunicera med denna IC som i sin tur styr vad som visas på LCD-skärmen. Om du är nyfiken på hur exakt allt detta fungerar bör du kolla in funktionen på 16x2 LCD-skärm där vi redan har diskuterat hur LCD fungerar i detalj.
I denna handledning kommer vi att diskutera kretsschemat och koden för att visa alfameriska tecken (alfabet och siffror) på en 16x2 LCD-skärm med enkla kommandon LCD_print _char och LCD_print_string . Dessa kommandon kan användas direkt i programmet efter att ha inkluderat vår rubrikfil. Rubrikfilen hanterar alla de flesta sakerna för dig så det är inte obligatoriskt att veta hur skärmen eller HD44780-drivrutinen IC fungerar.
Kretsschema för gränssnitts LCD med STM8 mikrokontroller
Den kompletta STM8 LCD-kretsen finns i bilden nedan. Som du ser är anslutningen för STM8S103F3P6 Controller med LCD mycket enkel, vi har LCD-skärmen direkt ansluten till vårt kort och ST-länken är också ansluten för att programmera kortet.
Strömstiften Vss och Vcc är anslutna till 5V-stiftet på STM8S-kortet, notera att LCD-skärmens driftspänning är 5V och är ansluten för att fungera på 3,3V. Så även om STM8S103F3P6 Microcontroller fungerar på 3.3V är obligatoriskt att ha en 5V-försörjning för LCD-skärmen, kan du undvika detta genom att använda en laddningsstyrenhet IC men vi kommer inte att diskutera det i den här handledningen.
Därefter har vi kontraststiftet som används för att ställa in LCD-kontrasten, vi har anslutit den till potentiometern så att vi kan kontrollera kontrasten. Vi har använt en 10k-pott, men du kan också använda andra värden i närheten, potten fungerar som en potentiell avdelare för att ge 0-5 V till kontraststiftet, vanligtvis kan du också använda ett motstånd direkt för att ge cirka 2,2 V för rimlig kontrast värde. Sedan har vi återställnings- (RS), Läs / skriv (RW) och Aktivera (E) -nålar. Läs-skrivstiftet är jordat eftersom vi inte läser någonting från LCD-skärmen utan vi kommer bara att utföra skrivoperationer. De andra två styrstiften Rs och E är anslutna till PA1 respektive PA2 stift.
Sedan har vi datapinnarna DB0 till DB7. 16x2 LCD kan fungera i två lägen, det ena är ett 8-bitars driftläge där vi måste använda alla de 8 datapinnarna (DB0-DB7) på LCD-skärmen och den andra är 4-bitars driftläge där vi bara behöver 4 datapinnar (DB4-DB7). 4-bitarsläget används ofta eftersom det kräver mindre GPIO-stift från styrenheten, så vi har också använt 4-bitarsläge i denna handledning och har endast anslutit stift DB4, DB5, DB6 och DB7 till stift PD1, PD2, PD3 respektive PD4.
De två sista stiften BLA och BLK används för att driva den interna bakgrundsbelysningen, vi har använt ett 560-ohm motstånd som ett strömbegränsande motstånd. ST-Link-programmeraren är ansluten som alltid som i vår tidigare handledning. Jag gjorde den fullständiga anslutningen på brädbrädan och min inställning ser ut så som visas i bilden nedan.
STM8 LCD-bibliotek - rubrikfil för STM8S103F3P6
Innan vi fortsätter i kretsschemat, låt oss hämta STM8 LCD-rubrikfilen från GitHub med följande länk-
STM8S 16x2 LCD-rubrikfil
Du kan antingen ladda ner hela repo och få stm8s103_LCD_16x2.h- filen eller enkelt koden från ovanstående länk. När du ställer in projektet, se till att du inkluderar alla nödvändiga huvudfiler i ink-katalogen tillsammans med den här huvudfilen.
Om du inte är säker på hur du lägger till rubrikfiler och kompilerar programmet, följ videon längst ner på den här sidan. Och om du är nyfiken på hur koden i rubrikfilen fungerar kan du kolla in PIC med en LCD-handledning. Rubrikfilen som används i det här projektet är mycket lik den som förklaras där, så vi kommer inte att få detaljer om det.
LCD-program för STM8S mikrokontroller
För demonstrationen kommer vi att programmera vår STM8S-kontroller för att visa en enkel sträng som "Circuit Digest" och sedan kommer vi att öka ett "Test" -värde för varje sekund i den andra raden. Hela programmet finns längst ner på denna sida. Förklaringen är som följer.
Vi startar vårt program med att definiera stiften och lägga till de nödvändiga rubrikfilerna som alltid. I vårt ovan diskuterade kretsschema har vi anslutit LCD_RS till PA1 så vi har definierat det som LCD_RS GPIOA, GPIO_PIN_1. På samma sätt har vi gjort samma sak även för andra stift. Om de följer en annan krets, se till att du ändrar dessa värden i enlighet med detta.
#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 #dip_DIN
Nästa inuti vårt huvudprogram har vi deklarerat de variabler som krävs för denna exempelkod. Vi har en testvariabel som heter test_var som initialiseras till noll, vi kommer att öka variabeln och visa den på LCD-skärmen. Tecknen d1 till d4 representerar de fyra siffrorna i testvariabeln eftersom vår LCD inte kan visa int-värde direkt, vi måste konvertera dem till tecken.
// Variabla deklarationer int test_var = 0; kol d4, d3, d2, dl;
Den LCD_Begin () funktionen används för att initiera LCD-skärmen. Denna funktion initierar alla nödvändiga GPIO-stift och ställer även LCD-skärmen i 16x2 LCD-läge. Sedan har vi funktionen LCD_Clear () som används för att rensa alla värden på LCD-skärmen, detta kommer att radera allt på LCD så att det är rent att skriva nya värden. Sedan har vi funktionen LCD_Set_Cursor (x, y) där x och y är de positioner där vi behöver skriva vår nya karaktär. Till exempel betyder (1,1) första raden och första Colum, på samma sätt (2,12) betyder andra raden 12 kolumn, på samma sätt. Observera att vi har två rader och 16 kolumner här som vi diskuterade tidigare.
Lcd_Begin (); Lcd_Clear (); Lcd_Set_Cursor (1,1);
Nu är LCD-skärmen inställd, rensad och markören är på plats. Nästa sak är att skriva ut något på skärmen. Vi kan använda LCD_Print_String ("Sample String") för att skriva ut en sträng till LCD och LCD_Print_Char (a) för att skriva ut ett teckenvärde på LCD-skärmen. I vårt program här har vi skrivit ut "STM8S103F3P3 LCD" och skapat en fördröjning på 5 sekunder med hjälp av nedanstående kod.
Lcd_Print_String ("STM8S103F3P3 LCD"); delay_ms (5000);
Efter 5 sekunders fördröjning rensar vi LCD-skärmen igen och visar "Circuit Digest" i första raden och "Test:" I den andra raden.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Circuit Digest"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("Test:");
Inuti while- slingan kommer vi att dela upp värdet på heltalsvariabeln test_var i enskilda tecken så att det kan visas på LCD-skärmen med enkla delnings- och moduloperatorer. Vi har också lagt till '0' för att konvertera ASCII-värdet till tecknet.
d4 = test_var% 10 + '0'; d3 = (test_var / 10)% 10 + '0'; d2 = (test_var / 100)% 10 + '0'; d1 = (test_var / 1000) + '0';
Sedan har vi satt markören till (2,6) eftersom vi redan har skrivit “Test:” i andra raden som består av 6 tecken. Om vi skriver över kommer den befintliga karaktären att ersättas med en ny karaktär på LCD-skärmen. Vi har också lagt till en fördröjning på 1 sekund och ökat variabeln.
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 med LCD - fungerar
För att testa vårt program laddar du bara upp koden till vår styrenhet och slår på den med mikro-USB-porten. Observera att LCD-skärmen kräver 5V för att kunna arbeta, så det är obligatoriskt att driva kortet från USB-porten. Vi har tidigare drivit den direkt från ST-link eftersom vi inte behövde 5V-strömförsörjningen.
Som du ser fungerar LCD-skärmen som förväntat med testvariabelns värde stegvis för varje sekund ungefär. Observera också att vi inte har använt timers och bara har använt fördröjningsfunktionen för att skapa denna fördröjning så förvänta dig inte att fördröjningstiden är korrekt, vi kommer att använda timers senare i en annan handledning för det ändamålet.
Det fullständiga arbetet med projektet finns i videon som länkas nedan. Hoppas att du gillade självstudien och lärde dig något användbart. Om du har några frågor lämnar du dem i kommentarsektionen eller använder våra forum för andra tekniska frågor.