- Działanie wyświetlacza LCD 16x2
- Schemat obwodu do interfejsu LCD z mikrokontrolerem STM8
- Biblioteka STM8 LCD - plik nagłówkowy dla STM8S103F3P6
- Program LCD dla mikrokontrolera STM8S
- STM8 z LCD - działa
Alfanumeryczny wyświetlacz LCD 16x2 jest najczęściej używanym wyświetlaczem wśród hobbystów i entuzjastów. Wyświetlacz jest bardzo przydatny, gdy chcesz wyświetlić podstawowe informacje użytkownikowi, a także może pomóc w testowaniu lub debugowaniu naszego kodu. Ten konkretny moduł LCD 16x2 jest łatwo dostępny i cieszy się popularnością od dawna. Możesz dowiedzieć się więcej o podstawach modułu LCD 16x2 z połączonego artykułu.
Aby kontynuować naszą serię samouczków mikrokontrolera STM8, w tym samouczku nauczymy się, jak połączyć wyświetlacz LCD z mikrokontrolerem STM8. Wcześniej połączyliśmy 16x2 LCD z wieloma innymi mikrokontrolerami, tutoriale są wymienione poniżej i możesz je sprawdzić, jeśli jesteś zainteresowany.
Jeśli jesteś nowy w STM8, zapoznaj się z artykułem wprowadzającym do STM8 Mikrokontroler, aby zrozumieć podstawy płyty kontrolera i środowiska programowania. W tym samouczku nie będziemy omawiać podstaw.
Działanie wyświetlacza LCD 16x2
Jak sama nazwa wskazuje, wyświetlacz LCD 16x2 będzie miał 16 kolumn i 2 rzędy. W sumie będziemy mogli wyświetlić na tym wyświetlaczu 32 znaki i mogą to być litery lub cyfry, a nawet symbole. Prosty pinout LCD 16x2, którego używamy w tym samouczku, jest pokazany poniżej:
Jak widać, wyświetlacz ma 16 pinów i możemy go podzielić na pięć kategorii, pinów zasilania, pinów kontrastu, pinów sterujących, pinów danych i pinów podświetlenia, jak pokazano w poniższej tabeli. Omówimy szczegóły każdego pinu, gdy omówimy schemat obwodu tego samouczka.
Kategoria | Pin NO. | Nazwa pinu | Funkcjonować |
Piny zasilania | 1 | VSS | Pin uziemienia połączony z uziemieniem |
2 | VDD lub Vcc | Pin napięcia + 5 V. | |
Kontrast Pin | 3 | V0 lub VEE | Ustawienie kontrastu, podłączone do Vcc przez rezystor zmienny. |
Kołki sterujące | 4 | RS | Register Select Pin, RS = 0 Command mode, RS = 1 Data mode |
5 | RW | Odczyt / zapis pin, RW = 0 Tryb zapisu, RW = 1 Tryb odczytu | |
6 | mi | Włącz, wysoki do niskiego impulsu wymaga włączenia wyświetlacza LCD | |
Piny danych | 7-14 | D0-D7 | Piny danych, przechowuje dane, które mają być wyświetlane na ekranie LCD lub instrukcje poleceń |
Piny podświetlenia | 15 | LED + lub A | Do zasilania podświetlenia + 5V |
16 | LED- lub K. | Podświetlenie ziemi |
Z tyłu LCD, jak pokazano na poniższym obrazku, znajdują się dwie czarne kropki, wewnątrz których znajduje się układ scalony sterownika LCD HD44780 (otoczony kolorem czerwonym). Nasz mikrokontroler powinien komunikować się z tym układem scalonym, który z kolei będzie kontrolował to, co jest wyświetlane na wyświetlaczu LCD. Jeśli jesteś ciekawy, jak dokładnie to wszystko działa, sprawdź działanie wyświetlacza LCD 16x2, gdzie omówiliśmy już szczegółowo, jak działa LCD.
W tym samouczku omówimy schemat obwodu i kod do wyświetlania znaków alfabetycznych (alfabetów i liczb) na wyświetlaczu LCD 16x2 przy użyciu prostych poleceń LCD_print _char i LCD_print_string . Polecenia te mogą być bezpośrednio użyte w programie po dołączeniu naszego pliku nagłówkowego. Plik nagłówkowy zajmuje się wszystkimi większością rzeczy, więc nie musisz wiedzieć, jak działa wyświetlacz lub układ scalony sterownika HD44780.
Schemat obwodu do interfejsu LCD z mikrokontrolerem STM8
Cały obwód LCD STM8 można znaleźć na poniższym obrazku. Jak widać podłączenie sterownika STM8S103F3P6 z wyświetlaczem LCD jest bardzo proste, mamy wyświetlacz LCD bezpośrednio podłączony do naszej płytki, a łącze ST-link jest również podłączone do programowania płytki.
Piny zasilania Vss i Vcc są podłączone do pinu 5 V na płycie STM8S, zwróć uwagę, że napięcie robocze LCD wynosi 5 V i jest podłączony do pracy na 3,3 V. Więc nawet jeśli mikrokontroler STM8S103F3P6 działa na 3,3 V, konieczne jest posiadanie zasilania 5 V dla wyświetlacza LCD, można tego uniknąć, używając układu scalonego kontrolera ładowania, ale nie będziemy tego omawiać w tym samouczku.
Następnie mamy pin kontrastu, który służy do ustawiania kontrastu LCD, połączyliśmy go z potencjometrem, abyśmy mogli kontrolować kontrast. Użyliśmy potencjometru 10k, ale możesz również użyć innych pobliskich wartości, potencjometr działa jako dzielnik potencjału, aby zapewnić 0-5 V na pinie kontrastu, zazwyczaj można również użyć bezpośrednio rezystora, aby zapewnić około 2,2 V dla rozsądnego kontrastu wartość. Następnie mamy piny Reset (RS), Read / Write (RW) i Enable (E). Pin do odczytu i zapisu jest uziemiony, ponieważ nie będziemy niczego odczytywać z wyświetlacza LCD, będziemy wykonywać tylko operacje zapisu. Pozostałe dwa piny sterujące Rs i E są podłączone odpowiednio do pinów PA1 i PA2.
Następnie mamy piny danych DB0 do DB7. Wyświetlacz LCD 16x2 może działać w dwóch trybach, jeden to 8-bitowy tryb pracy, w którym musimy użyć wszystkich 8 pinów danych (DB0-DB7) na wyświetlaczu LCD, a drugi to 4-bitowy tryb pracy, w którym potrzebujemy tylko 4 piny danych (DB4-DB7). Tryb 4-bitowy jest powszechnie używany, ponieważ wymaga mniej pinów GPIO od kontrolera, więc w tym samouczku użyliśmy również trybu 4-bitowego i podłączyliśmy tylko piny DB4, DB5, DB6 i DB7 do pinów PD1, PD2, PD3 i PD4 odpowiednio.
Ostatnie dwa piny BLA i BLK służą do zasilania wewnętrznego podświetlenia LED, jako rezystor ograniczający prąd użyliśmy rezystora 560-omowego. Programator ST-Link jest podłączony jak zawsze, jak w naszym poprzednim samouczku. Wykonałem pełne połączenie na płytce stykowej, a moja konfiguracja wygląda tak, jak pokazano na poniższym obrazku.
Biblioteka STM8 LCD - plik nagłówkowy dla STM8S103F3P6
Zanim przejdziemy do schematu obwodu, pobierzmy plik nagłówkowy STM8 LCD z GitHub za pomocą następującego linku-
Plik nagłówkowy STM8S 16x2 LCD
Możesz pobrać całe repozytorium i pobrać plik stm8s103_LCD_16x2.h lub prosty kod z powyższego linku. Podczas ustawiania projektu upewnij się, że wszystkie wymagane pliki nagłówkowe zostały dołączone do katalogu inc wraz z tym plikiem nagłówkowym.
Jeśli nie jesteś pewien, jak dodać pliki nagłówkowe i skompilować program, postępuj zgodnie z filmem na dole tej strony. A jeśli jesteś ciekawy, jak działa kod w pliku nagłówkowym, możesz sprawdzić PIC z samouczkiem LCD. Plik nagłówkowy użyty w tym projekcie jest bardzo podobny do tego wyjaśnionego tam, więc nie będziemy wchodzić w szczegóły.
Program LCD dla mikrokontrolera STM8S
Na potrzeby demonstracji zaprogramujemy nasz sterownik STM8S tak, aby wyświetlał prosty ciąg, taki jak „Circuit Digest”, a następnie będziemy zwiększać wartość „Test” co jedną sekundę w drugiej linii. Cały program można znaleźć na dole tej strony. Wyjaśnienie jest następujące.
Rozpoczynamy nasz program od zdefiniowania pinów i jak zwykle dodania wymaganych plików nagłówkowych. W naszym omówionym powyżej schemacie obwodu połączyliśmy LCD_RS z PA1, więc zdefiniowaliśmy go jako LCD_RS GPIOA, GPIO_PIN_1. Podobnie zrobiliśmy to samo z innymi pinami. Jeśli poruszają się po innym obwodzie, pamiętaj, aby odpowiednio zmienić te wartości.
#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_3s.
Następnie w naszym głównym programie zadeklarowaliśmy zmienne wymagane dla tego przykładowego kodu. Mamy zmienną testową o nazwie test_var, która jest inicjowana na zero, będziemy inkrementować zmienną i wyświetlać ją na LCD. Znaki od d1 do d4 reprezentują 4 cyfry zmiennej testowej, ponieważ nasz wyświetlacz LCD nie może bezpośrednio wyświetlać wartości int, musimy je przekonwertować na znaki.
// Deklaracje zmiennych int test_var = 0; char d4, d3, d2, d1;
Funkcja LCD_Begin () służy do inicjalizacji LCD. Ta funkcja zainicjuje wszystkie wymagane piny GPIO, a także ustawi wyświetlacz LCD w tryb 16x2 LCD. Następnie mamy funkcję LCD_Clear (), która służy do wyczyszczenia wszystkich wartości na wyświetlaczu LCD, co spowoduje wymazanie wszystkiego na wyświetlaczu LCD, dzięki czemu nowe wartości będą czyste. Następnie mamy funkcję LCD_Set_Cursor (x, y), gdzie x i y to pozycje, na których musimy napisać nasz nowy znak. Na przykład (1,1) oznacza pierwszy rząd, a pierwsza kolumna, podobnie (2,12) oznacza drugą kolumnę wiersza 12. Zauważ, że mamy tutaj 2 wiersze i 16 kolumn, jak omówiliśmy wcześniej.
Lcd_Begin (); Lcd_Clear (); Lcd_Set_Cursor (1,1);
Teraz wyświetlacz LCD jest ustawiony, wyczyszczony, a kursor znajduje się w tym miejscu. Następną rzeczą jest wydrukowanie czegoś na ekranie. Możemy użyć LCD_Print_String („Sample String”), aby wydrukować ciąg na LCD i LCD_Print_Char (a), aby wydrukować wartość znaku na LCD. W naszym programie tutaj wydrukowaliśmy „STM8S103F3P3 LCD” i utworzyliśmy opóźnienie 5 sekund przy użyciu poniższego kodu.
Lcd_Print_String ("STM8S103F3P3 LCD"); opóźnienie_ms (5000);
Po 5 sekundach ponownie czyścimy wyświetlacz LCD i wyświetlamy „Circuit Digest” w pierwszym wierszu i „Test:” w drugim wierszu.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Circuit Digest"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("Test:");
Wewnątrz while pętli będziemy podzielić wartość na zmienną całkowitą test_var na poszczególne znaki tak, że może być wyświetlany na ekranie LCD przy użyciu prostych operatorów dzielenie i moduł. Dodaliśmy również „0”, aby przekonwertować wartość ASCII na znak.
d4 = test_var% 10 + '0'; d3 = (zmienna_testowa / 10)% 10 + '0'; d2 = (zmienna_testowa / 100)% 10 + '0'; d1 = (zmienna_testowa / 1000) + '0';
Następnie ustawiliśmy kursor na (2,6), ponieważ napisaliśmy już „Test:” w drugim wierszu, który ma 6 znaków. Jeśli nadpiszemy, istniejący znak zostanie zastąpiony nowym znakiem na wyświetlaczu LCD. Dodaliśmy również opóźnienie 1 sekundę i zwiększamy zmienną.
Lcd_Set_Cursor (2,6); Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); opóźnienie_ms (1000); test_var ++;
STM8 z LCD - działa
Aby przetestować nasz program, po prostu prześlij kod do naszego kontrolera i zasil go przez port micro-USB. Zwróć uwagę, że wyświetlacz LCD wymaga 5 V do pracy, więc konieczne jest zasilanie płyty z portu USB. Wcześniej zasilaliśmy go bezpośrednio z ST-link, ponieważ nie potrzebowaliśmy zasilania 5V.
Jak widać, wyświetlacz LCD działa zgodnie z oczekiwaniami, a wartość zmiennej testowej zwiększa się co około sekundę. Należy również zauważyć, że nie używaliśmy timerów i używaliśmy tylko funkcji opóźnienia do utworzenia tego opóźnienia, więc nie oczekuj, że czas opóźnienia będzie dokładny, użyjemy timerów później w innym samouczku do tego celu.
Pełne działanie projektu można znaleźć w poniższym wideo. Mam nadzieję, że spodobał Ci się samouczek i nauczyłeś się czegoś przydatnego. Jeśli masz jakieś pytania, zostaw je w sekcji komentarzy lub skorzystaj z naszych forów w celu uzyskania innych pytań technicznych.