Czym jest HD44780 i jakie moduły LCD go wykorzystują
HD44780 oraz jego kompatybilne odpowiedniki to popularne kontrolery znakowych wyświetlaczy LCD. Najczęściej występują w modułach 16×2, 20×4 i 8×1.
Typowy moduł wykorzystujący ten sterownik zawiera:
- matrycę LCD – przeznaczoną zwykle do wyświetlania znaków 5×8 lub 5×10 punktów;
- kontroler HD44780 – albo zgodny z nim układ realizujący obsługę wyświetlacza;
- dodatkowy sterownik linii – stosowany w większych modułach;
- złącze sygnałowe – obejmujące zasilanie, regulację kontrastu, magistralę danych oraz linie RS, R/W i E.
HD44780 jest kontrolerem tekstowym, dlatego nie wyświetla dowolnej grafiki pikselowej. Prezentuje znaki zapisane w pamięci CGROM lub zdefiniowane w CGRAM, umieszczając je pod odpowiednimi adresami pamięci ekranu DDRAM.
Organizacja pamięci, licznik adresowy i flaga zajętości
Sterownik HD44780 wykorzystuje kilka obszarów pamięci i rejestrów odpowiedzialnych za przechowywanie znaków, adresowanie pozycji oraz synchronizację operacji.
DDRAM – pamięć ekranu
DDRAM (Display Data RAM) przechowuje kody znaków przypisane do poszczególnych pozycji wyświetlacza.
Najważniejsze zasady działania DDRAM są następujące:
- adresowanie pozycji – każda widoczna pozycja ma własny adres DDRAM zależny od konstrukcji modułu;
- wyświetlanie znaków – zapis kodu do DDRAM powoduje wyświetlenie odpowiadającego mu znaku;
- wybór miejsca zapisu – odpowiedni adres ustala komenda Set DDRAM Address.
CGRAM – pamięć własnych znaków
CGRAM (Character Generator RAM) służy do definiowania własnych znaków, takich jak polskie litery, ikony, wskaźniki i proste elementy animacji.
Definiowanie znaku przebiega w następujący sposób:
- Ustaw początkowy adres pamięci za pomocą komendy Set CGRAM Address.
- Wyślij 8 bajtów opisujących kolejne wiersze znaku 5×8.
- Zapisz w DDRAM kod utworzonego znaku, zwykle z zakresu od
0do7.
Standardowo CGRAM mieści osiem własnych znaków o wymiarach 5×8 punktów.
Licznik adresowy i flaga zajętości
Licznik adresowy AC (Address Counter) wskazuje aktualny adres DDRAM lub CGRAM używany podczas zapisu i odczytu.
Na jego wartość wpływają między innymi następujące operacje:
- wykonanie komendy Set DDRAM Address,
- wykonanie komendy Set CGRAM Address,
- przesuwanie kursora lub obrazu za pomocą Cursor/Display Shift,
- zapis albo odczyt danych.
Flaga zajętości Busy Flag informuje, czy sterownik zakończył wykonywanie poprzedniej instrukcji. Znajduje się w bicie 7 odczytywanego słowa stanu.
Zasady odczytu flagi Busy są następujące:
- RS = 0 – wybór rejestru instrukcji i stanu;
- R/W = 1 – wybór operacji odczytu;
- Busy = 1 – sterownik nadal wykonuje instrukcję;
- Busy = 0 – sterownik jest gotowy na kolejną operację.
W prostych układach zamiast odczytu flagi Busy często stosuje się stałe opóźnienia. Rozwiązanie to upraszcza połączenia i program, lecz może spowalniać działanie, szczególnie po komendach Clear Display i Return Home.
Interfejs sprzętowy HD44780
Typowy moduł LCD zgodny z HD44780 ma 14 lub 16 wyprowadzeń. Dwa dodatkowe piny są zwykle przeznaczone do zasilania podświetlenia.
Najważniejsze wyprowadzenia modułu to:
- VSS i VDD – masa i zasilanie, najczęściej 5 V;
- VO – wejście regulacji kontrastu, zazwyczaj połączone z potencjometrem;
- RS – wybór rejestru instrukcji lub danych;
- R/W – wybór zapisu albo odczytu;
- E – sygnał Enable zatwierdzający operację;
- D0–D7 – linie 8-bitowej magistrali danych, przy czym w trybie 4-bitowym używane są tylko D4–D7;
- LED+ i LED− – opcjonalne wyprowadzenia zasilania podświetlenia.
Pin RS
RS (Register Select) określa, czy wartość na magistrali jest instrukcją, czy danymi znakowymi. Znaczenie poziomów logicznych przedstawia tabela:
| Stan RS | Wybrany rejestr | Zastosowanie |
|---|---|---|
RS = 0 |
rejestr instrukcji | zapis komendy lub odczyt stanu |
RS = 1 |
rejestr danych | zapis lub odczyt DDRAM albo CGRAM |
Pin R/W
R/W określa kierunek transmisji między mikrokontrolerem a wyświetlaczem. Prawidłowe znaczenie sygnału jest następujące:
| Stan R/W | Kierunek transmisji |
|---|---|
R/W = 0 |
zapis komend lub danych do sterownika |
R/W = 1 |
odczyt danych albo słowa stanu |
Niektóre materiały podają odwrotne znaczenie tego sygnału. Jest to sprzeczne z dokumentacją HD44780 i może prowadzić do błędów w połączeniach oraz oprogramowaniu.
Jeżeli program nie korzysta z odczytu danych ani flagi Busy, pin R/W można na stałe połączyć z masą. Sterownik pracuje wtedy wyłącznie w trybie zapisu.
Pin E
Linia E (Enable) zatwierdza operację zapisu lub umożliwia odczyt danych ze sterownika.
Jej działanie zależy od kierunku transmisji:
- podczas zapisu – należy ustawić RS, R/W oraz dane, a następnie wygenerować impuls na linii E;
- podczas odczytu – po ustawieniu RS i
R/W = 1aktywacja E powoduje wystawienie danych lub stanu na magistrali; - w trybie 4-bitowym – dla każdego bajtu trzeba wygenerować dwa impulsy E, osobno dla starszego i młodszego półbajtu.
Tryby pracy magistrali
HD44780 może komunikować się przez magistralę 8-bitową lub 4-bitową. Najważniejsze różnice przedstawia tabela:
| Cecha | Tryb 8-bitowy | Tryb 4-bitowy |
|---|---|---|
| linie danych | D0–D7 | D4–D7 |
| liczba cykli na bajt | jeden | dwa |
| kolejność transmisji | cały bajt | najpierw starszy, następnie młodszy półbajt |
| liczba zajętych pinów | większa | mniejsza |
Tryb pracy ustala komenda Function Set. Odpowiada za niego bit DL: wartość 1 oznacza magistralę 8-bitową, a wartość 0 magistralę 4-bitową.
Tryb 4-bitowy jest najczęściej wybierany w projektach mikrokontrolerowych, ponieważ pozwala ograniczyć liczbę zajętych wyprowadzeń. Każdy bajt wymaga jednak dwóch cykli transmisji.
Cykl zapisu i odczytu
Zapis komendy
Aby przesłać instrukcję do kontrolera, wykonaj następujące czynności:
- Ustaw RS = 0, aby wybrać rejestr instrukcji.
- Ustaw R/W = 0, aby wybrać zapis.
- Umieść kod komendy na magistrali danych. W trybie 4-bitowym najpierw wyślij starszy półbajt.
- Wygeneruj impuls na linii E.
- W trybie 4-bitowym wyślij młodszy półbajt i ponownie wygeneruj impuls E.
- Odczekaj wymagany czas albo sprawdzaj flagę Busy do momentu uzyskania wartości
0.
Zapis danych znakowych
Aby zapisać znak w DDRAM lub fragment wzorca w CGRAM, wykonaj następujące kroki:
- Ustaw RS = 1, aby wybrać rejestr danych.
- Ustaw R/W = 0, aby wybrać zapis.
- Wyślij kod znaku lub bajt wzorca przez magistralę danych.
- Wygeneruj impuls E dla każdego przesyłanego bajtu lub półbajtu.
Po zapisie licznik adresowy jest automatycznie zwiększany albo zmniejszany zgodnie z konfiguracją Entry Mode Set.
Odczyt stanu i adresu
Aby odczytać flagę Busy oraz aktualny adres, wykonaj następujące czynności:
- Skonfiguruj linie danych mikrokontrolera jako wejścia.
- Ustaw RS = 0.
- Ustaw R/W = 1.
- Aktywuj linię E.
- Odczytaj bit 7 jako flagę Busy, a pozostałe bity jako aktualny adres.
- W trybie 4-bitowym wykonaj drugi cykl odczytu, aby odebrać młodszy półbajt.
Inicjalizacja wyświetlacza HD44780
Przed rozpoczęciem wyświetlania danych trzeba wykonać sekwencję inicjalizacji zgodną z dokumentacją kontrolera i wymaganiami konkretnego modułu.
Typowa procedura uruchamiania obejmuje:
- Włącz zasilanie i odczekaj kilkadziesiąt milisekund na ustabilizowanie układu.
- Kilkukrotnie wyślij ustawienie odpowiadające trybowi 8-bitowemu, nawet jeśli docelowo będzie używany tryb 4-bitowy.
- Przełącz interfejs do docelowego trybu 4-bitowego, jeżeli jest wymagany.
- Ustaw szerokość magistrali, liczbę linii i format znaku komendą Function Set.
- Skonfiguruj widoczność obrazu, kursora i migania za pomocą Display ON/OFF Control.
- Ustaw kierunek zmiany adresu i opcjonalne przesuwanie obrazu komendą Entry Mode Set.
- Wyczyść ekran komendą Clear Display i zapewnij wymagany czas jej wykonania.
W bibliotekach dla mikrokontrolerów AVR sekwencję tę często realizuje funkcja lcd_init() lub funkcja o zbliżonej nazwie.
Zestaw komend HD44780
Komendy kontrolera odpowiadają za czyszczenie ekranu, pozycjonowanie kursora, konfigurację interfejsu oraz dostęp do pamięci DDRAM i CGRAM.
Clear Display – czyszczenie ekranu
Najważniejsze parametry komendy są następujące:
- kod binarny –
00000001; - kod szesnastkowy –
0x01; - działanie – wypełnienie DDRAM spacjami, ustawienie licznika adresowego na
0x00i wyzerowanie przesunięcia obrazu.
Clear Display należy do najwolniejszych komend HD44780. Jej wykonanie może trwać około 1,64 ms, dlatego trzeba zastosować odpowiednie opóźnienie lub odczytywać flagę Busy.
Return Home – powrót do pozycji początkowej
Komendę opisują następujące parametry:
- kod binarny –
0000001x, gdzie najmłodszy bit jest ignorowany; - kod szesnastkowy –
0x02; - działanie – ustawienie licznika adresowego na
0x00i wyzerowanie przesunięcia bez usuwania zawartości DDRAM.
Czas wykonania może wynosić około 1,64 ms, podobnie jak w przypadku komendy Clear Display.
Entry Mode Set – tryb wprowadzania danych
Komenda określa sposób zmiany adresu po zapisie lub odczycie oraz zachowanie obrazu:
- kod binarny –
000001IS; - bit I/D – wybór kierunku zmiany licznika adresowego;
- bit S – włączenie albo wyłączenie przesuwania obrazu;
- kod bazowy –
0x04uzupełniony bitami I/D i S.
Znaczenie poszczególnych ustawień przedstawia się następująco:
- I/D = 1 – zwiększanie adresu i przesuwanie kursora w prawo;
- I/D = 0 – zmniejszanie adresu i przesuwanie kursora w lewo;
- S = 1 – przesuwanie obrazu podczas zapisu;
- S = 0 – zmiana pozycji kursora bez przesuwania obrazu.
Przykładowe konfiguracje mogą wyglądać następująco:
- przesuwanie kursora w prawo –
HD44780_ENTRY_MODE | HD44780_EM_INCREMENT; - przesuwanie kursora i obrazu w prawo –
HD44780_ENTRY_MODE | HD44780_EM_INCREMENT | HD44780_EM_SHIFT_DISPLAY; - przesuwanie kursora w lewo – użycie kodu bazowego bez ustawionego bitu I/D.
Display ON/OFF Control – sterowanie ekranem i kursorem
Komenda kontroluje widoczność obrazu, kursora oraz migającego pola:
- kod binarny –
00001DCB; - bit D – sterowanie widocznością obrazu;
- bit C – sterowanie widocznością kursora;
- bit B – sterowanie miganiem;
- kod bazowy –
0x08uzupełniony bitami D, C i B.
Znaczenie bitów jest następujące:
- D = 1 – włączenie wyświetlania;
- D = 0 – wygaszenie obrazu bez usuwania danych z DDRAM;
- C = 1 – wyświetlenie kursora;
- B = 1 – włączenie migania pola kursora.
Przykładowe ustawienia programu to:
- ekran włączony, kursor wyłączony –
HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF; - ekran i kursor włączone bez migania –
HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_ON | HD44780_CURSOR_NOBLINK; - ekran i migający kursor włączone – ustawienie bitów D, C oraz B.
Cursor/Display Shift – przesuwanie kursora lub obrazu
Komenda umożliwia ręczne przesuwanie kursora albo całej zawartości wyświetlacza:
- kod binarny –
0001S/CR/Lxx; - bit S/C – wybór kursora albo obrazu;
- bit R/L – wybór kierunku przesunięcia.
Znaczenie dostępnych ustawień jest następujące:
- S/C = 0 – przesuwanie kursora bez zmiany położenia obrazu;
- S/C = 1 – przesuwanie całego obrazu;
- R/L = 1 – przesunięcie w prawo;
- R/L = 0 – przesunięcie w lewo.
Cursor/Display Shift można wykorzystać między innymi do przewijania tekstu bez modyfikowania zawartości DDRAM.
Function Set – konfiguracja trybu pracy
Komenda ustala szerokość magistrali, liczbę linii i format matrycy znaku:
- kod binarny –
001DLNFxx; - bit DL – szerokość magistrali danych;
- bit N – liczba obsługiwanych linii;
- bit F – format matrycy znaku.
Znaczenie bitów konfiguracyjnych jest następujące:
- DL = 1 – magistrala 8-bitowa D0–D7;
- DL = 0 – magistrala 4-bitowa D4–D7;
- N = 1 – tryb dwuliniowy;
- N = 0 – tryb jednoliniowy;
- F = 1 – matryca znaku 5×10;
- F = 0 – matryca znaku 5×8.
Dla typowego wyświetlacza 16×2 pracującego w trybie 4-bitowym należy ustawić DL = 0, N = 1 i F = 0. Warto jednak sprawdzić dokumentację konkretnego modułu, ponieważ nie wszystkie kombinacje parametrów są dostępne jednocześnie.
Set CGRAM Address – ustawienie adresu CGRAM
Komendę opisują następujące parametry:
- kod binarny –
01AAAAAA; - adres – sześciobitowa wartość wskazująca pozycję w CGRAM;
- działanie – przełączenie kolejnych operacji zapisu lub odczytu na pamięć własnych znaków.
Po ustawieniu adresu kolejne bajty opisują wiersze wzorca. Dla znaku 5×8 zapisuje się zwykle osiem bajtów, z których pięć najmłodszych bitów określa widoczne punkty.
Set DDRAM Address – ustawienie adresu DDRAM
Komenda wybiera pozycję pamięci ekranu, od której rozpocznie się zapis albo odczyt:
- kod binarny –
1AAAAAAA; - adres – siedmiobitowa wartość wskazująca pozycję DDRAM;
- działanie – ustawienie licznika adresowego na wybranej pozycji ekranu.
Dla typowego modułu 16×2 początek pierwszego wiersza ma adres 0x00, a początek drugiego wiersza adres 0x40.
Read Busy Flag and Address – odczyt flagi Busy i adresu
Odczytywane słowo stanu ma postać BAAAAAAA i zawiera:
- bit 7 – flagę Busy;
- bity adresowe – aktualną wartość licznika adresowego;
- warunki odczytu – ustawienia
RS = 0orazR/W = 1.
Odczyt flagi Busy pozwala rozpocząć następną operację natychmiast po zakończeniu poprzedniej, bez stosowania nadmiarowych opóźnień.
Write Data to RAM – zapis danych
Operację zapisu opisują następujące zasady:
- ustawienia sterujące –
RS = 1iR/W = 0; - miejsce docelowe – DDRAM albo CGRAM, zależnie od ostatniej komendy adresującej;
- zmiana adresu – automatyczna aktualizacja licznika zgodnie z Entry Mode Set.
Read Data from RAM – odczyt danych
Operację odczytu opisują następujące zasady:
- ustawienia sterujące –
RS = 1iR/W = 1; - źródło danych – DDRAM albo CGRAM pod aktualnym adresem;
- zastosowanie – diagnostyka, analiza zawartości pamięci i realizacja niestandardowych efektów.
Adresowanie pozycji na wyświetlaczu 16×2
Fizyczne wiersze wyświetlacza nie muszą odpowiadać kolejnym zakresom adresów DDRAM. Dla typowego modułu 16×2 mapowanie wygląda następująco:
| Wiersz | Początek | Koniec |
|---|---|---|
| pierwszy | 0x00 |
0x0F |
| drugi | 0x40 |
0x4F |
Ustawienie adresu 0x40 za pomocą komendy Set DDRAM Address przenosi kursor na początek drugiego wiersza.
W większych modułach, takich jak 20×4, mapowanie jest bardziej złożone. Pierwszy i trzeci oraz drugi i czwarty wiersz mogą należeć do wspólnych bloków adresowych. Dokładne adresy należy zawsze sprawdzić w dokumentacji konkretnego wyświetlacza.
Definiowanie własnych znaków w CGRAM
Własny znak 5×8 można utworzyć w kilku krokach:
- Wywołaj Set CGRAM Address z adresem wybranego obszaru. Początek kolejnego znaku jest zwykle wielokrotnością ośmiu.
- Wyślij 8 bajtów, z których każdy opisuje jeden poziomy wiersz matrycy.
- W każdym bajcie wykorzystaj pięć najmłodszych bitów do określenia widocznych punktów.
- Ustaw odpowiedni adres DDRAM.
- Zapisz kod własnego znaku, zazwyczaj od
0do7, aby wyświetlić go na ekranie.
CGRAM pozwala zwykle przechowywać jednocześnie osiem własnych znaków 5×8. Wzorce można nadpisywać podczas pracy programu, co umożliwia tworzenie prostych animacji.
Przykłady kodu i popularne biblioteki
AVR w języku C
W programach dla mikrokontrolerów AVR można zdefiniować stałe odpowiadające podstawowym komendom:
#define HD44780_CLEAR 0x01
#define HD44780_HOME 0x02
#define HD44780_ENTRY_MODE 0x04
#define HD44780_DISPLAY_ONOFF 0x08
Obsługę transmisji warto rozdzielić na następujące funkcje:
lcd_command(uint8_t cmd)– wysyłanie komendy przyRS = 0iR/W = 0;lcd_data(uint8_t data)– wysyłanie danych przyRS = 1iR/W = 0;lcd_init()– realizacja pełnej sekwencji inicjalizacji wyświetlacza.
Funkcja inicjalizacyjna powinna wykonać co najmniej Function Set, Display ON/OFF Control oraz Entry Mode Set. Zwykle wywołuje się w niej również Clear Display.
Arduino
W środowisku Arduino szczegóły protokołu może obsługiwać biblioteka LiquidCrystal, która wewnętrznie wysyła odpowiednie instrukcje HD44780.
Najczęściej używane operacje to:
- inicjalizacja –
lcd.begin(16, 2);; - ustawienie kursora –
lcd.setCursor(kolumna, wiersz);; - wyświetlenie tekstu –
lcd.print("tekst");.
Biblioteka automatycznie realizuje konfigurację interfejsu i przelicza współrzędne na właściwe adresy DDRAM.
Typowe problemy i pułapki
Do najczęstszych przyczyn nieprawidłowego działania wyświetlacza należą:
- błędna inicjalizacja – nieprawidłowa sekwencja Function Set, szczególnie podczas uruchamiania trybu 4-bitowego;
- zbyt krótkie opóźnienia – wysłanie następnej instrukcji przed zakończeniem inicjalizacji, czyszczenia ekranu lub powrotu kursora;
- nieprawidłowe ustawienie RS albo R/W – zinterpretowanie danych jako komendy lub pomylenie odczytu z zapisem;
- błędna obsługa linii E – niewłaściwy czas impulsu albo brak drugiego cyklu w trybie 4-bitowym;
- zły kontrast – nieprawidłowe napięcie na VO, przez które obraz pozostaje niewidoczny mimo poprawnej pracy kontrolera;
- błąd adresowania DDRAM – próba przejścia do drugiego wiersza bez ustawienia adresu
0x40; - nieprawidłowy kierunek magistrali – pozostawienie pinów mikrokontrolera jako wyjść podczas odczytu danych;
- zbyt szybka transmisja – brak kontroli flagi Busy lub odpowiednich opóźnień.
Podczas uruchamiania własnej biblioteki warto stosować następującą procedurę diagnostyczną:
- Ustaw początkowo dłuższe opóźnienia, w tym około 2 ms po komendach Clear i Home.
- Sprawdź połączenia RS, R/W, E oraz mapowanie linii danych.
- Zweryfikuj napięcie kontrastu na pinie VO.
- Rozpocznij test od wyświetlenia jednego znaku w znanej pozycji.
- Sprawdź osobno przejście do drugiego wiersza i zapis pod adresem
0x40. - Porównaj działanie własnego kodu z biblioteką pochodzącą z zaufanego źródła.


