- Wymagane materiały
- Moduł wyświetlacza LCD 16X2
- Schemat obwodu i połączenia
- Programowanie ARM7-LPC2148
Wyświetlacz jest niezbędną częścią maszyny, niezależnie od tego, czy jest to urządzenie domowe, czy maszyny przemysłowe. Wyświetlacz nie tylko pokazuje opcje sterowania do obsługi maszyny, ale także pokazuje status i dane wyjściowe zadania wykonywanego przez tę maszynę. Istnieje wiele typów wyświetlaczy stosowanych w elektronice, takich jak wyświetlacz 7-segmentowy, wyświetlacz LCD, wyświetlacz dotykowy TFT, wyświetlacz LED itp. Wyświetlacz LCD 16x2 jest najbardziej podstawowym i jest również używany w niektórych małych urządzeniach elektronicznych, zrobiliśmy wiele projekty wykorzystujące LCD 16x2 wraz z podstawowym interfejsem z innymi mikrokontrolerami:
- Połączenie LCD z mikrokontrolerem 8051
- Interfejs LCD z mikrokontrolerem ATmega32
- Połączenie LCD z mikrokontrolerem PIC
- Połączenie wyświetlacza LCD 16x2 z Arduino
- Interfejs LCD 16x2 z Raspberry Pi przy użyciu Pythona
W tym samouczku zobaczymy, jak połączyć wyświetlacz LCD 16x2 z mikrokontrolerem ARM7-LPC2148 i wyświetlić prostą wiadomość powitalną. Jeśli jesteś nowy z ARM7, zacznij od podstaw ARM7 LPC2148 i dowiedz się, jak można go zaprogramować za pomocą Keil uVision
Wymagane materiały
Sprzęt komputerowy
- Płyta mikrokontrolera ARM7-LPC2148
- LCD (16X2)
- Potencjometr
- 5V regulator napięcia IC
- Płytka prototypowa
- Podłączanie przewodów
- Bateria 9V
- Kabel micro USB
Oprogramowanie
- Keil uVision 5
- Narzędzie Magic Flash
Przed przystąpieniem do projektu musimy wiedzieć kilka rzeczy o trybach pracy LCD oraz o kodach LCD Hex.
Moduł wyświetlacza LCD 16X2
Wyświetlacz LCD 16X2 mówi, że ma 16 kolumn i 2 rzędy. Ten wyświetlacz LCD ma 16 pinów. Poniższy rysunek i tabela pokazują nazwy pinów wyświetlacza LCD i jego funkcje.
NAZWA |
FUNKCJONOWAĆ |
VSS |
Pin uziemienia |
VDD |
Pin wejściowy + 5 V. |
VEE |
Kołek regulacji kontrastu |
RS |
Zarejestruj się Wybierz |
R / W |
Odczyt / zapis Pin |
mi |
Włącz Pin |
D0-D7 |
Piny danych (8 pinów) |
LED A |
Pin anody (+ 5 V) |
LED K. |
Pin katodowy (GND) |
Wyświetlacz LCD może pracować w dwóch różnych trybach, a mianowicie w trybie 4-bitowym i 8-bitowym. W trybie 4-bitowym wysyłamy półbajt danych przez półbajt, najpierw górny półbajt, a następnie niższy półbajt. Dla tych z Was, którzy nie wiedzą, czym jest półbajt: półbajt to grupa czterech bitów, więc dolne cztery bity (D0-D3) bajtu tworzą niższy półbajt, podczas gdy górne cztery bity (D4-D7) bajtu tworzą wyższy półbajt. Dzięki temu możemy przesyłać 8-bitowe dane.
Podczas gdy w trybie 8-bitowym możemy wysłać 8-bitowe dane bezpośrednio za jednym pociągnięciem, ponieważ używamy wszystkich 8 linii danych.
Tutaj w tym projekcie użyjemy najczęściej używanego trybu, którym jest tryb 4-bitowy. W trybie czterobitowym możemy zaoszczędzić 4 piny mikrokontrolera, a także zmniejszyć narzut okablowania.
16x2 używa również kodu HEX do przyjęcia dowolnego polecenia, istnieje wiele poleceń szesnastkowych dla LCD, takich jak przesuwanie kursora, wybieranie trybu, przenoszenie sterowania do drugiej linii itp. Aby dowiedzieć się więcej o module wyświetlacza LCD 16X2 i poleceniach szesnastkowych, kliknij łącze.
Schemat obwodu i połączenia
Poniższa tabela przedstawia połączenia obwodów między wyświetlaczem LCD a ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (wybór rejestru) |
P0.6 |
E (Włącz) |
P0.12 |
D4 (styk danych 4) |
P0.13 |
D5 (styk danych 5) |
P0.14 |
D6 (styk danych 6) |
P0.15 |
D7 (styk danych 7) |
Połączenia regulatora napięcia z wyświetlaczem LCD i drążkiem ARM7
Poniższa tabela przedstawia połączenia pomiędzy ARM7 i LCD z regulatorem napięcia.
Regulator napięcia IC |
Funkcja pinów |
Wyświetlacz LCD i ARM-7 LPC2148 |
1. lewy kołek |
+ Ve z akumulatora 9V Wejście |
NC |
2. kołek środkowy |
- Ve z akumulatora |
VSS, R / W, K z LCD GND ARM7 |
3. prawy pin |
Regulowane wyjście + 5 V. |
VDD, wyświetlacz LCD + 5V z ARM7 |
Potencjometr z wyświetlaczem LCD
Potencjometr służy do zmiany kontrastu wyświetlacza LCD. Potencjometr ma trzy piny, lewy pin (1) jest podłączony do + 5V, a środkowy (2) do VEE lub V0 modułu LCD, a prawy pin (3) jest podłączony do GND. Kontrast możemy regulować kręcąc gałką.
Ustawienia zworek
W ARM7-Stick znajduje się zworka, dzięki czemu możemy zasilać i przesyłać kod za pomocą USB lub używając wejścia 5 V DC tylko do zasilania. Możesz zobaczyć poniższe zdjęcia.
Poniższy rysunek pokazuje, że zworka jest w pozycji DC. Oznacza to, że musimy zasilać płytę z zewnętrznego źródła 5V.
Ten obraz pokazuje, że zworka jest podłączona w trybie USB. Tutaj zasilanie i kod są dostarczane przez port micro USB.
UWAGA: W tym samouczku załadowaliśmy kod za pomocą USB, ustawiając zworkę na USB, a następnie zmieniliśmy zworkę na tryb DC na zasilanie LPC2148 z wejścia 5 V regulatora. Możesz to sprawdzić w filmie podanym na końcu.
Końcowy obwód do połączenia wyświetlacza LCD 16x2 z mikrokontrolerem ARM7 będzie wyglądał następująco:
Programowanie ARM7-LPC2148
Aby zaprogramować ARM7-LPC2148 potrzebujemy narzędzia keil uVision & Flash Magic. Używamy kabla USB do programowania ARM7 Stick przez port micro USB. Piszemy kod za pomocą Keila i tworzymy plik hex, a następnie plik HEX jest sflashowany do pendrive'a ARM7 przy użyciu Flash Magic. Aby dowiedzieć się więcej o instalacji keil uVision i Flash Magic oraz o tym, jak z nich korzystać, kliknij łącze Pierwsze kroki z mikrokontrolerem ARM7 LPC2148 i zaprogramuj go za pomocą Keil uVision.
Kompletny kod do połączenia LCD z ARM 7 jest podany na końcu tego samouczka, tutaj wyjaśniamy kilka jego części.
Przede wszystkim musimy załączyć wymagane pliki nagłówkowe
#zawierać
Inicjalizacja modułu LCD jest bardzo ważnym krokiem. Tutaj używamy pewnych kodów HEX, które są w rzeczywistości poleceniami, aby poinformować LCD o trybie pracy (4-bitowy), typie LCD (16x2), linii startu itp.
void LCD_INITILIZE (void) // Funkcja przygotowania wyświetlacza LCD { IO0DIR = 0x0000FFF0; // Ustawia pin P0.4, P0.6, P0.12, P0.13, P0.14, P0.15 jako OUTPUT delay_ms (20); LCD_SEND (0x02); // Inicjalizacja lcd w 4-bitowym trybie pracy LCD_SEND (0x28); // 2 linie ( 16X2 ) LCD_SEND (0x0C); // Wyświetl kursor wyłączony LCD_SEND (0x06); // Kursor automatycznego inkrementacji LCD_SEND (0x01); // Wyświetl wyczyść LCD_SEND (0x80); // Pierwsza pozycja w pierwszej linii }
Dla trybu 4-bitowego mamy inny typ funkcji zapisu dla pinów, to znaczy za pomocą górnego i dolnego półbajtu. Zobaczmy, jak to się robi
void LCD_SEND (polecenie char) // Funkcja wysyłania poleceń szesnastkowych nibble przez półbajt { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((polecenie & 0xF0) << 8)); // Wyślij górny półbajt polecenia IO0SET = 0x00000040; // Włączanie HIGH IO0CLR = 0x00000030; // Sprawia, że RS & RW LOW delay_ms (5); IO0CLR = 0x00000040; // Włączanie LOW delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((polecenie & 0x0F) << 12)); // Wyślij niższy półbajt polecenia IO0SET = 0x00000040; // WŁĄCZ WYSOKI IO0CLR = 0x00000030; // RS & RW LOW delay_ms (5); IO0CLR = 0x00000040; // WŁĄCZ LOW delay_ms (5); }
Logika wysyłania Nibble
IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((polecenie & 0x0F) << 12)); // Wyślij niższy półbajt polecenia IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((polecenie & 0xF0) << 8)); // Wyślij górny półbajt polecenia
Powyższe dwa stwierdzenia odgrywają ważną rolę w tym programie. Pierwsze polecenie wysyła dolny półbajt, a drugie wysyła górny półbajt. Bez wpływu na inne szpilki, które robimy. Zobaczmy, jak to się dzieje, zanim najpierw dowiemy się o tej logice
ORing- (A-0 = A), (A-1 = 1) ANDing- (A i 0 = 0), (A i 1 = A)
Dlatego używamy koncepcji maskowania i logicznej operacji przesuwania bez wpływu na inne piny. Oznacza, że używane są tylko piny (P0.12-P0.15) i nie ma to wpływu na inne piny, takie jak P0.4, P0.6. Zostanie to zrobione przez przesunięcie danych na cztery bity i wykonanie górnego półbajtu w miejsce dolnego półbajtu i zamaskowanie górnego półbajtu. Następnie ustawiamy dolne bity na zero (0XF0) i wykonujemy OR z danymi półbajtowymi, aby uzyskać górne dane półbajtu na wyjściu.
Podobny proces jest stosowany w przypadku niższych danych półbajtowych, ale tutaj nie musimy przesuwać danych.
Podczas zapisywania danych na wyjście, czyli w trybie komend RS powinno być NISKIE, a zezwolenie na wykonanie musi być WYSOKIE, aw trybie danych RS powinno być WYSOKIE, a zezwolenie na wykonanie musi być WYSOKA.
Teraz do wysyłania danych ciągu, które mają zostać wydrukowane na wyjściu, ta sama zasada jest używana w przypadku półbajtu przez półbajt. Ważnym krokiem tutaj jest to, że WYBÓR REJESTRU (RS) musi być WYSOKI dla trybu danych.
void LCD_DISPLAY (char * msg) // Funkcja do drukowania znaków wysyłanych jeden po drugim { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Wysyła górny półbajt IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH, aby wydrukować dane IO0CLR = 0x00000020; // RW LOW Opóźnienie trybu zapisu ms (2); IO0CLR = 0x00000040; // EN = 0, RS i RW niezmienione (tj. RS = 1, RW = 0) opóźnienie ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Wysyła niższy półbajt IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; opóźnienie ms (2); IO0CLR = 0x00000040; opóźnienie ms (5); i ++; }
Pełne wideo dotyczące kodowania i demonstracji znajduje się poniżej.