- Werking van 16x2 LCD-scherm
- Schakelschema naar interface-LCD met STM8-microcontroller
- STM8 LCD-bibliotheek - koptekstbestand voor STM8S103F3P6
- LCD-programma voor STM8S Microcontroller
- STM8 met LCD - Werkend
Het 16x2 alfanumerieke LCD-scherm is het meest gebruikte scherm onder hobbyisten en enthousiastelingen. Het display is erg handig als u basisinformatie aan de gebruiker wilt weergeven en kan ook helpen bij het testen of debuggen van onze code. Deze specifieke 16x2 LCD-module is gemakkelijk verkrijgbaar en is al heel lang populair. U kunt meer leren over de basisprincipes van de 16x2 LCD-module in het gelinkte artikel.
Om verder te gaan met onze serie STM8 Microcontroller-tutorials, zullen we in deze tutorial leren hoe we een LCD kunnen koppelen aan STM8 Microcontroller. We hebben eerder een 16x2 LCD-scherm met veel andere microcontrollers gekoppeld, de tutorials staan hieronder vermeld en u kunt ze bekijken als u geïnteresseerd bent.
Als je nieuw bent bij STM8, bekijk dan het artikel 'Aan de slag met de STM8 Microcontroller' om de basisprincipes van de controllerkaart en programmeeromgeving te begrijpen. In deze tutorial behandelen we de basis niet.
Werking van 16x2 LCD-scherm
Zoals de naam al doet vermoeden, heeft een 16x2 LCD-scherm 16 kolommen en 2 rijen. In totaal kunnen we dus 32 tekens op dit scherm weergeven en deze tekens kunnen alfabetten of cijfers of zelfs symbolen zijn. Een eenvoudige 16x2 LCD-pinout die we in deze tutorial gebruiken, wordt hieronder weergegeven-
Zoals u kunt zien, heeft het display 16 pinnen en we kunnen het onderverdelen in vijf categorieën: Power Pins, contrastpin, Control Pins, Data pins en Backlight pins, zoals weergegeven in de onderstaande tabel. We zullen ingaan op de details van elke pin wanneer we het schakelschema van deze tutorial bespreken.
Categorie | Pin nr. | Pin Naam | Functie |
Power Pins | 1 | VSS | Aardpen, verbonden met aarde |
2 | VDD of Vcc | Spanningspin + 5V | |
Contrasterende pin | 3 | V0 of VEE | Contrastinstelling, verbonden met Vcc via een variabele weerstand. |
Controle pinnen | 4 | RS | Registreren Select Pin, RS = 0 Commando-modus, RS = 1 Data-modus |
5 | RW | Lees- / schrijfpin, RW = 0 Schrijfmodus, RW = 1 Leesmodus | |
6 | E. | Inschakelen, een hoge naar lage puls moet het LCD-scherm inschakelen | |
Gegevenspinnen | 7-14 | D0-D7 | Datapinnen, slaat de gegevens op die op het LCD-scherm of de opdrachtinstructies moeten worden weergegeven |
Backlight-pinnen | 15 | LED + of A | Om de achtergrondverlichting + 5V van stroom te voorzien |
16 | LED- of K | Achtergrondverlichting Grond |
Op de achterkant van het LCD-scherm, zoals weergegeven in de onderstaande afbeelding, vindt u twee zwarte stippen, waarbinnen we het HD44780 LCD-stuurprogramma-IC hebben (rood omcirkeld). Onze microcontroller moet communiceren met dit IC, dat op zijn beurt bepaalt wat er op het LCD-scherm wordt weergegeven. Als je benieuwd bent hoe dit alles precies werkt, kijk dan eens naar de werking van een 16x2 LCD-scherm waar we al in detail hebben besproken hoe het LCD-scherm werkt.
In deze zelfstudie bespreken we het schakelschema en de code om alfanumerieke tekens (alfabetten en cijfers) weer te geven op een 16x2 LCD-scherm met behulp van eenvoudige opdrachten LCD_print _char en LCD_print_string . Deze commando's kunnen direct in het programma worden gebruikt nadat we ons headerbestand hebben toegevoegd. Het header-bestand behandelt de meeste dingen voor u, dus het is niet verplicht om te weten hoe het beeldscherm of de HD44780 driver IC werkt.
Schakelschema naar interface-LCD met STM8-microcontroller
Het complete STM8 LCD-circuit is te vinden in de onderstaande afbeelding. Zoals je kunt zien is de aansluiting voor STM8S103F3P6 Controller met LCD erg eenvoudig, we hebben het LCD display direct op ons bord aangesloten en de ST-link is ook aangesloten om het bord te programmeren.
De voedingspinnen Vss en Vcc zijn verbonden met de 5V-pin op het STM8S-bord, merk op dat de bedrijfsspanning van het LCD-scherm 5V is en is aangesloten om op 3.3V te werken. Dus hoewel de STM8S103F3P6 Microcontroller op 3.3V werkt, is het verplicht om een 5V-voeding voor het LCD-scherm te hebben, je kunt dit voorkomen door een laadcontroller-IC te gebruiken, maar dat zullen we in deze tutorial niet bespreken.
Vervolgens hebben we de contrastpin die wordt gebruikt om het contrast van het LCD-scherm in te stellen, we hebben deze aangesloten op de potentiometer zodat we het contrast kunnen regelen. We hebben een 10k-pot gebruikt, maar je kunt ook andere nabijgelegen waarden gebruiken, de pot fungeert als een potentiële verdeler om 0-5 V aan de contrastpen te leveren, meestal kun je ook een weerstand rechtstreeks gebruiken om ongeveer 2,2 V te leveren voor een redelijk contrast waarde. Dan hebben we de reset (RS), Read / Write (RW) en Enable (E) pinnen. De lees / schrijf-pin is geaard omdat we niets van het LCD-scherm zullen lezen, we zullen alleen schrijfbewerkingen uitvoeren. De andere twee stuurpennen Rs en E zijn respectievelijk verbonden met PA1- en PA2-pennen.
Dan hebben we de datapinnen DB0 tot DB7. Het 16x2 LCD-scherm kan in twee modi werken, een is een 8-bits bedieningsmodus waarbij we alle 8 datapinnen (DB0-DB7) op het LCD-scherm moeten gebruiken en de andere is de 4-bits bedieningsmodus waar we er maar 4 nodig hebben. datapinnen (DB4-DB7). De 4-bit-modus wordt vaak gebruikt omdat het minder GPIO-pinnen van de controller vereist, dus we hebben ook de 4-bit-modus gebruikt in deze tutorial en hebben alleen pinnen DB4, DB5, DB6 en DB7 aangesloten op pinnen PD1, PD2, PD3, en PD4 respectievelijk.
De laatste twee pinnen BLA en BLK worden gebruikt om de interne LED-achtergrondverlichting van stroom te voorzien, we hebben een weerstand van 560 ohm gebruikt als stroombegrenzende weerstand. De ST-Link-programmeur is zoals altijd aangesloten zoals in onze vorige tutorial. Ik heb de volledige verbinding gemaakt op het breadboard en mijn opstelling ziet er als volgt uit in de onderstaande afbeelding.
STM8 LCD-bibliotheek - koptekstbestand voor STM8S103F3P6
Voordat we verder gaan met het schakelschema, laten we het STM8 LCD-headerbestand van GitHub halen met behulp van de volgende link:
STM8S 16x2 LCD-headerbestand
U kunt de volledige repo downloaden en het bestand stm8s103_LCD_16x2.h downloaden of de code simpelweg via de bovenstaande link downloaden. Zorg ervoor dat u tijdens het instellen van het project alle vereiste header-bestanden samen met dit header-bestand in de inc-directory opneemt.
Als je niet zeker weet hoe je de header-bestanden moet toevoegen en het programma moet compileren, volg dan de video onderaan deze pagina. En als je nieuwsgierig bent naar hoe de code in het headerbestand werkt, kun je de PIC bekijken met een LCD-tutorial. Het header-bestand dat in dit project wordt gebruikt, lijkt erg op het bestand dat daar wordt uitgelegd, dus we zullen daar niet op in detail treden.
LCD-programma voor STM8S Microcontroller
Voor de demonstratie programmeren we onze STM8S-controller om een eenvoudige string weer te geven, zoals "Circuit Digest", en dan verhogen we een "Test" -waarde voor elke seconde op de tweede regel. Het volledige programma vindt u onderaan deze pagina. De uitleg is als volgt.
We starten ons programma door de pinnen te definiëren en de vereiste headerbestanden toe te voegen, zoals altijd. In ons hierboven besproken schakelschema hebben we LCD_RS verbonden met PA1, dus we hebben het gedefinieerd als LCD_RS GPIOA, GPIO_PIN_1. Evenzo hebben we hetzelfde gedaan voor andere pinnen. Als ze een ander circuit volgen, zorg er dan voor dat u deze waarden dienovereenkomstig wijzigt.
Vervolgens hebben we in ons hoofdprogramma de variabelen gedeclareerd die nodig zijn voor deze voorbeeldcode. We hebben een testvariabele genaamd test_var die is geïnitialiseerd op nul, we zullen de variabele verhogen en op het LCD-scherm weergeven. De karakters d1 tot d4 vertegenwoordigen de 4 cijfers van de testvariabele omdat ons LCD de int-waarde niet direct kan weergeven, we moeten ze naar karakters converteren.
// Variabele declaraties int test_var = 0; char d4, d3, d2, d1;
De functie LCD_Begin () wordt gebruikt om de LCD te initialiseren. Deze functie initialiseert alle vereiste GPIO-pinnen en stelt het LCD-scherm ook in op 16x2 LCD-modus. Dan hebben we de functie LCD_Clear () die wordt gebruikt om alle waarden op het LCD-scherm te wissen, dit zal alles op het LCD-scherm wissen zodat het schoon is om nieuwe waarden te schrijven. Dan hebben we de functie LCD_Set_Cursor (x, y) waarbij x en y de posities zijn waarop we ons nieuwe karakter moeten schrijven. (1,1) betekent bijvoorbeeld eerste rij en eerste kolom, evenzo (2,12) betekent tweede rij 12 kolom, eveneens. Merk op dat we hier 2 rijen en 16 kolommen hebben, zoals we eerder hebben besproken.
Lcd_Begin (); Lcd_Clear (); Lcd_Set_Cursor (1,1);
Nu is het LCD-scherm ingesteld, gewist en staat de cursor op de juiste plaats. Het volgende is om iets op het scherm af te drukken. We kunnen de LCD_Print_String ("Sample String") gebruiken om een string naar LCD af te drukken en LCD_Print_Char (a) om een karakterwaarde naar het LCD te printen. In ons programma hier hebben we "STM8S103F3P3 LCD" afgedrukt en een vertraging van 5 seconden gecreëerd met behulp van de onderstaande code.
Lcd_Print_String ("STM8S103F3P3 LCD"); delay_ms (5000);
Na de vertraging van 5 seconden maken we het LCD-scherm weer leeg en geven we "Circuit Digest" weer op de eerste rij en "Test:" op de tweede rij.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Circuit Digest"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("Test:");
Binnen de while- lus splitsen we de waarde van de integer-variabele test_var op in individuele tekens, zodat deze op het LCD-scherm kan worden weergegeven met behulp van eenvoudige deling- en modulusoperatoren . We hebben ook '0' toegevoegd om de ASCII-waarde naar het teken te converteren.
d4 = test_var% 10 + '0'; d3 = (test_var / 10)% 10 + '0'; d2 = (test_var / 100)% 10 + '0'; d1 = (test_var / 1000) + '0';
Vervolgens hebben we de cursor op (2,6) gezet omdat we al “Test:” hebben geschreven in de tweede rij die 6 karakters lang is. Als we overschrijven, wordt het bestaande teken vervangen door een nieuw teken op het LCD-scherm. We hebben ook een vertraging van 1 seconde toegevoegd en de variabele verhoogd.
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 met LCD - Werkend
Om ons programma te testen, upload je simpelweg de code naar onze controller en zet je hem aan via de micro-USB-poort. Merk op dat het LCD-scherm 5V nodig heeft om te werken, dus het is verplicht om het bord via de USB-poort van stroom te voorzien. We hebben het eerder rechtstreeks vanuit ST-link gevoed omdat we de 5V-voeding niet nodig hadden.
Zoals u kunt zien, werkt het LCD-scherm zoals verwacht, waarbij de waarde van de testvariabele ongeveer elke seconde wordt verhoogd. Merk ook op dat we geen timers hebben gebruikt en alleen de vertragingsfunctie hebben gebruikt om deze vertraging te creëren, dus verwacht niet dat de vertragingstijd nauwkeurig is, we zullen voor dat doel later in een andere tutorial timers gebruiken.
De volledige werking van het project is te vinden in de onderstaande video. Ik hoop dat je de tutorial leuk vond en iets nuttigs hebt geleerd. Als je vragen hebt, laat ze dan achter in het commentaargedeelte of gebruik onze forums voor andere technische vragen.