Bardzo popularnym sposobem prezentacji informacji wynikowej w systemach z użyciem mikrokontrolerów jest użycie gotowych modułów wyświetlaczy alfanumerycznych LCD. Jest to gotowy do użycia, zawierający własny sterownik i nie wymagający dodatkowych elementów, podzespół elektroniczny do zastosowania w systemach mikroprocesorowych. Najbardziej rozpowszechnionym rozwiązaniem tych sterowników jest sterownik zgodny z układem HITACHI HD44780. Elastyczność sterownika pozwala on na obsługę wyświetlaczy jedno lub dwuwierszowych z maksymalnie do 40 znaków w jednym wierszu. Oba pokazane na fotografii układy wyświetlaczy wymagają identycznej obsługi, która jest realizowana za pośrednictwem 8-bitowej szyny danych (do przesyłania kodów poleceń oraz wyświetlanych danych) oraz trzech sygnałów sterujących. Każdy wyświetlacz (zgodny z HD44780) zawiera złącze 14-pinowe lub 16-pinowe w zależności, czy wyświetlacz jest podświetlany (dwa dodatkowe piny służą do zasilania LED-owego podświetlenia). Jak widać na ilustracji 1, spotykane są dwa rozwiązania złącza: jako jednorzędowe lub dwurzędowe. Wyprowadzenia o identycznych numerach spełniają identyczną funkcję (różnica pomiędzy złączami sprowadza się do “geometrii”). Wyprowadzenia wyświetlacza ze złączem jednorzędowym jest pokazane na ilustracji 2. i jako moduł: Wyprowadzenia wyświetlacza ze złączem dwurzędowym jest pokazane na ilustracji 4. i jako moduł: Znaczenie poszczególnych wyprowadzeń jest następujące:
- Pin Symbol Znaczenie
- 1 GND Masa zasilania (0V)
- 2 VDD Zasilanie wyświetlacza (+5V)
- 3 V5 Napięcie kontrastu dla LCD, napięcie analogowe do regulacji kontrastu, najczęściej stosowanym rozwiązaniem jest to napięcie z suwaka potencjometru włączonego między 0V i +5V.
- 4 RS Sygnał sterujący wyborem rejestru (Register Select):
RS=1 – operacja dotycząca rejestru danych
RS=0 – operacja dotycząca rejestru poleceń - 5 R/W Sygnał informujący moduł, czy operacja dotyczy zapisu do modułu czy odczytu z modułu:
R/W = 0 – operacja zapisu
R/W = 1 – operacja odczytu - 6 E Sygnał wyboru (Enable), aktywny dla E=1
- 7 DB0 Bit 0 szyny danych do modułu
- 8 DB1 Bit 1 szyny danych do modułu
- 9 DB2 Bit 2 szyny danych do modułu
- 10 DB3 Bit 3 szyny danych do modułu
- 11 DB4 Bit 4 szyny danych do modułu
- 12 DB5 Bit 5 szyny danych do modułu
- 13 DB6 Bit 6 szyny danych do modułu
- 14 DB7 Bit 7 szyny danych do modułu
- 15 A 15 A Anoda diody LED podświetlenia
- 16 K 16 K Katoda diody LED podświetlenia
Wyświetlacz może być przyłączony do mikrokontrolera w jednym z dwóch możliwych trybach:
- z 4-bitowym interfejsem szyny danych do wyświetlacza (w tym wypadku jako szyna danych używane są DB4 do DB7, pozostałe bity szyny danych nie mają znaczenia),
- z 8-bitowym interfejsem szyny danych do wyświetlacza.
Polecenia sterujące wyświetlaczem HD44780 (w operacjach zapisu do rejestru instrukcji RS=0 i R/W=0).
- DB7 .. DB0 Czas wykonania Opis
- 0 0 0 0 0 0 0 1 1,52 ms Polecenie czyszczenia wyświetlacza i ustawienia pozycji kursora na adresie 0.
- 0 0 0 0 0 0 1 - 1,52 ms Polecenie przestawienia kursora na adres 0.
- 0 0 0 0 0 1 I S - 37 µs Polecenie określenia trybu przestawiania kursora w czasie pracy:
I=0 – zmniejszanie pozycji kursora,
I=1 – zwiększanie pozycji kursora,
S=1 – włącza (S=1) lub wyłącza (S=0)
autonomiczne przewijanie wyświetlonych informacji. - 0 0 0 0 1 D C B - 37 µs Polecenia sterujące wyświetlaczem:
D=0 – wyłącza wyświetlacz,
D=1 – włącza wyświetlacz,
C=0 – wyłącza kursor,
C=1 – włącza kursor,
B=0 – wyłącza pulsowanie kursora,
B=1 – włącza pulsowanie kursora. - 0 0 0 1 S R - - 37 µs Polecenia sterujące kursorem:
S=0 – oznacza, że zapisy znaków powodują przestawienie pozycji kursora,
S=1 – oznacza, że zapisy znaków powodują przewijanie wyświetlonej informacji,
R=0 – przesuwanie w prawą stronę,
R=1 – przesuwanie w lewą stronę. - 0 0 1 L N F - - 37 µs Polecenie ustawienia funkcji:
L=0 – określa 4-bitowy interfejs do modułu,
L=1 – określa 8-bitowy interfejs do modułu,
N=0 – określa, że wyświetlacz jest jednowierszowy,
N=1 – określa, że wyświetlacz jest dwuwierszowy,
F=0 – określa użycie znaków w matrycy 5 x 8 punktów,
F=1 – określa użycie znaków w matrycy 5 x 10 punktów. - 01AAAAAA 37 µs Polecenie ustawienia adresu pamięci generatora znaków (adres jest reprezentowany przez 6-bitową liczbą AAAAAA).
- 1AAAAAAA 37 µs Polecenie ustawienia adresu pamięci wyświetlanych danych (adres jest reprezentowany przez 7-bitową liczbą AAAAAAA).
Polecenia odczytu rejestru statusu wyświetlacza HD44780 (w operacjach odczytu z rejestru instrukcji RS=0 i R/W=1).
- DB7 .. DB0 Opis
- BAAAAAAA Polecenie odczytu statusu sterownika,
B=0 – oznacza gotowość sterownika do przyjęcia kolejnego polecenia,
B=1 – oznacza, że sterownik jest zajęty realizacją wydanego polecenia.
AAAAAAA - adres w pamięci wyświetlanych danych (adres jest reprezentowany przez 7-bitową liczbą).
Zapis danych (znaków) na ekran wyświetlacza następuje dla RS=1 i R/W=0. Wykonanie operacji wymaga 37 µs.
Rozpatrując różne rozwiązania modłów LCD można zauważyć, że istnieją wyświetlacze posiadające (1 wiersz, 16 znaków w wierszu), które w rzeczywistości są dwuwierszowe po 8 znaków w wierszu, to znaczy, że należy je traktować w ten sposób. Oba wiersze fizycznie na ekranie znajdują się obok siebie tworząc jeden 16-znakowy wiersz. Aby uzyskać poprawną postać informacji na ekranie, po wyświetleniu 8 znaków należy przejść do następnego wiersza. Zaprogramowanie takiego wyświetlacza jako jednowierszowego spowoduje, że na ekranie będzie widoczna jedynie połowa wiersza.
Posiłkując się pojęciem zaczerpniętym z muzyki, oto kilka “wariacji na druty i bajty z prockiem AVR i modułem LCD w tle”.
Wariant sprzętowo najprostszy sprowadza się do 4-bitowego interfejsu szyny danych oraz dwóch sygnałów sterujących. Przykład użycia prezentuje poniższy rysunek. Użyte są w module LCD:
- 4 sygnały szyny danych: DB4 .. DB7 przyłączone odpowiednio do PORTB0 do PORTB3,
- sygnał RS przyłączony do PORTD5,
- sygnał R/W przyłączony na stałe do masy (wszelkie operacje dotyczące modułu LCD będą operacjami zapisu),
- sygnał E przyłączony do PORTD6.
Używając modułów wyświetlaczy przyłączonych do mikrokontrolera poprzez 4-bitowy interfejs szyny danych należy mieć na uwadze, że wyświetlacz od momentu włączenia mu zasilania autonomicznie realizuje pewne czynności, po wykonaniu których ma on określony interfejs jako 8-bitowy. Oznacza to, że pierwsze polecenie wysłane do modułu powinno być poleceniem przełączenia na 4-bitowy interfejs i należy je wysłać jak w przypadku interfejsu 8-bitowego, to jest wystawić na szynie danych odpowiedni kod i wykonać jednorazową operację zapisu (jeden impuls strobu E). Każde kolejne powinno być wykonane w następujący sposób (wykonać “dwutakt”):
- wystawić starszą część bajtu na szynie danych,
- dokonać zapisu do modułu (wygenerować jeden impuls strobu E),
- wystawić młodszą część bajtu na szynie danych,
- dokonać zapisu do modułu (wygenerować jeden impuls strobu E).
Program znajduje się w zbiorze: EXAMPLE-A.ASM.
Wariant sprzętowy (ten sam model wyświetlacza): 8-bitowy interfejs szyny danych oraz dwa sygnały sterujące. Przykład użycia prezentuje poniższy rysunek. W oprogramowaniu ulegają pewnym uproszczeniom same operacje zapisu danych do modułu LCD.
Program znajduje się w zbiorze: EXAMPLE-B.ASM.
Można pokusić się o “wyższy poziom abstrakcji” rozwiązania polegający na “maksymalizacji oderwania oprogramowania od rozwiązania sprzętowego”. Jednym z możliwych rozwiązań jest wprowadzenie własnych makroinstrukcji. Pozwala to określić w jednym miejscu istniejące zależności sprzętowe bez żadnych ingerencji w algorytm obsługi.
Środowisko sprzętowe jest identyczne jak w: EXAMPLE-A.ASM
Program znajduje się w zbiorze: EXAMPLE-C.ASM.
Dotychczasowe przykłady (EXAMPLE-A i EXAMPLE-C) miały pewne wady, to jest używały dość niefrasobliwie PORTB. Wpisując dane instrukcją out zmianie mogą ulegać piny nie używane przez wyświetlacz, do których mogą być przyłączone inne zespoły cyfrowe, wpływając niewłaściwie na ich pracę. Można pokusić się o jeszcze “wyższy poziom abstrakcji” i większą parametryzację.
Przykład prezentuje użycie modułu LCD w konfiguracji umożliwiającej odczyt statusu (moduł: 2 wiersze po 40 znaków, więc nie istnieje problem zliczania wyświetlonych znaków). Dotychczasowe operacje związane z odczekaniem wymaganego czasu są zastąpione przez operacje odczytu statusu, więc program uwalnia się od odmierzania czasu przez wykonywanie pustych instrukcji. Środowisko użycia modułu przedstawia poniższy rysunek.
Z punktu widzenia oprogramowania, w tym przypadku użycie portu jest zrealizowane “w delikatny” sposób bez zamieszania na sąsiednich wyprowadzeniach. Definicja stałych :
- lcd_E_pin
- lcd_RS_pin
- lcd_RW_pin
- lcd_D4_pin
- lcd_D5_pin
- lcd_D6_pin
- lcd_D7_pin
Program znajduje się w zbiorze: EXAMPLE-D.ASM.
Powyższy przykład rozwiązania programu nie wyczerpuje możliwości związanych z dalszą parametryzacją. Można pokusić się o definicję dodatkowych stałych pozwalających opisać samo przyłącze modułu LCD do mikrokontrolera i uzyskać w dużym stopniu uniwersalny zestaw procedur obsługi. Inny projekt urządzenia z użyciem wyświetlacza posiadający inaczej przyłączony moduł nie musi być kolejną rewolucją w programie.
Załącznik: prezentowane programy