
Zazwyczaj elektronicy-amatorzy stosujący w swoich projektach wyświetlacze ciekłokrystaliczne posługują się dedykowanymi sterownikami (np. HD44780) pośredniczącymi pomiędzy mikrokontrolerem a LCD, a przynajmniej można wyciągnąć taki wniosek na podstawie wyników zwracanych przez wyszukiwarki. Jednak możliwe jest uruchomienie wyświetlacza bez dodatkowego układu scalonego - poprzez doprowadzenie sygnałów cyfrowych z GPIO standardowego mikrokontrolera na przezroczyste elektrody, pomiędzy którymi znajduje się ciekły kryształ. Można w ten sposób wykorzystać wyświetlacze wymontowane z różnorodnych urządzeń, których nie dało / nie opłacało się naprawiać, ale w razie ich braku w wielu sklepach z częściami elektronicznymi dostępne są nowe LCD nieprzylutowane do PCB ze sterownikiem.
Podłączenie LCD
Wyświetlacze pochodzące z różnych urządzeń mają rozmaite sposoby podłączenia. Jedne wyposażone są w polimerowe, elastyczne taśmy z naniesionymi ścieżkami, inne w piankowe paski zawierające materiał przewodzący (umieszczane pomiędzy PCB a krawędziami LCD), wreszcie inne posiadają wystające metalowe druciki. W przypadku tych ostatnich wykonanie połączeń elektrycznych będzie najprostsze - wystarczy przylutować przewody, które można podłączyć również do płytki stykowej (jeżeli rozstaw drucików jest taki sam, jak otworów na płytce, nawet to nie będzie konieczne).
Zasilanie wyświetlacza - podstawy
Aby dany segment wyświetlacza (obszar, który może być sterowany niezależnie od pozostałych segmentów - np. ikonki lub poszczególne kreski tworzące cyfry) stał się widoczny, pomiędzy tworzącymi go elektrodami musi pojawić się napięcie.
UWAGA!!! Należy w tym celu stosować napięcie przemienne (o częstotliwości np. kilkudziesięciu Hz lub kilku kHz), ponieważ napięcie stałe może powodować nieodwracalną elektrolizę ciekłego kryształu i zniszczenie wyświetlacza!
Jednak napięcie przemienne (o przebiegu prostokątnym) można łatwo dostarczyć za pomocą GPIO - na wyprowadzeniu podłączonym do jednej elektrody w danej chwili musi być stan niski, a na drugiej wysoki, po czym obydwa stany muszą być cyklicznie zamieniane na przeciwne (przez pewien czas pomiędzy tymi zmianami mogą być takie same, o czym będzie później, kiedy poruszymy temat regulacji kontrastu za pomocą PWM).
Ważna jest również odpowiednia wartość napięcia - np. mój wyświetlacz działa prawidłowo przy 3,3 V, natomiast przy 5 V już nie (występują wtedy objawy podobne do podłączenia napięcia stałego, więc po chwili wyłączyłem zasilanie). Jednak obydwa napięcia mieszczą się w zakresie dopuszczalnym do zasilania zastosowanego mikrokontrolera ATmega8.
Przyporządkowanie segmentów do wyprowadzeń
Zazwyczaj producenci zepsutych urządzeń, które rozmontowujemy, nie udostępniają informacji o tym, które wyprowadzenia wyświetlacza odpowiadają poszczególnym segmentom (w dodatku przy braku zasilania często możemy nawet nie widzieć, jakie segmenty są dostępne). Jednak można to łatwo sprawdzić. Trzeba w tym celu podłączyć poszczególne piny wyświetlacza do oddzielnych pinów mikrokontrolera. Program musi działać w następujący sposób: na jednym wyprowadzeniu początkowo jest stan wysoki, a na pozostałych niski, a po pewnym czasie cyklicznie zmieniają się na przeciwne. Czas należy dobrać tak, aby przełączanie następowało co najmniej kilkadziesiąt razy na sekundę. Po uruchomieniu programu obserwujemy wyświetlacz i rysujemy na kartce widoczne segmenty. W następnych etapach przeciwfaza musi występować na kolejnych pinach. Ich przełączanie można zrealizować na różne sposoby:
-po upływie zadanego czasu (musi być na tyle duży, żebyśmy zawsze zdążyli narysować widoczne segmenty)
-po naciśnięciu przycisku / przekręceniu enkodera / odebraniu sygnału przez UART itp.
-po uruchomieniu/zresetowaniu mikrokontrolera - trzeba w tym celu wykorzystać pamięć nieulotną (EEPROM, ew. FLASH), z której na początku programu odczytywany jest numer aktualnie "wyróżnionego" pinu, a następnie zapisywana wartość o 1 większa (lub zerowana, jeżeli osiągnie maksimum).
Następnie rysujemy większy schemat, na którym widoczne są wszystkie segmenty, a na każdym z nich zapisujemy numery wyprowadzeń z przeciwfazą, dla których był widoczny. W ten sposób każdemu segmentowi odpowiada niepowtarzalna para wyprowadzeń wyświetlacza. Możemy przyjąć, że pierwsze liczby w poszczególnych parach odpowiadają elektrodom w jednej warstwie (górnej lub dolnej), a drugie - w pozostałej. Np. w moim wyświetlaczu pierwsze 4 druciki zasilają elektrody z jednej warstwy, pozostałe z drugiej.

Wyświetlacze multipleksowane
W przypadku prostych wyświetlaczy jedna z elektrod jest wspólna dla wszystkich segmentów. Jednak w tych bardziej złożonych (multipleksowanych) konieczne jest ograniczenie liczby wyprowadzeń, co utrudnia sterowanie. Jeśli trafiliśmy na wyświetlacz multipleksowany, mogliśmy już w poprzednim kroku zauważyć, że nie da się zaczernić tylko jednego, wybranego segmentu, bo wraz z nim pojawia się kilka innych. Jak rozwiązać ten problem? Czy trzeba użyć więcej niż dwóch potencjałów i zrezygnować z bezpośredniego sterowania za pomocą GPIO?
Chciałbym tutaj podziękować Użytkownikowi supercat z tego forum za opisanie interesującego rozwiązania. Polega ono na wygenerowaniu takiego sygnału, aby każdy segment był prawidłowo zasilany przez 3/4 czasu, a nieprawidłowo przez 1/4. Wprawdzie kontrast będzie nieco gorszy, ale takie rozwiązanie sprawdzi się w wielu aplikacjach.
Konieczne jest napisanie odpowiedniej funkcji, która będzie wyznaczała kombinacje stanów wysokich i niskich na wyprowadzeniach LCD dla poszczególnych kroków czasowych. Dane wejściowe (obraz do wyświetlenia) mogą być przedstawione w formie tablicy, w której poszczególne wiersze odpowiadają elektrodom z jednej warstwy, kolumny - elektrodom z drugiej warstwy, a komórki - poszczególnym segmentom (odpowiadającym danej parze elektrod). Sygnał dla jednej z warstw musi zmieniać się jak kolejne liczby w systemie binarnym - proponuję wybrać tę warstwę, dla której liczba wyprowadzeń jest mniejsza, aby uzyskać większą częstotliwość odświeżania obrazu na LCD przy mniejszej częstotliwości przełączania GPIO. W moim przypadku na pierwszych 4 wyprowadzeniach sygnał zmienia się więc następująco: 0000, 0001, 0010, ..., 1111, po czym cykl się powtarza. Dla drugiej warstwy, która zawiera więcej elektrod, sygnał jest wyznaczany na podstawie obrazu do wyświetlenia oraz stanu pierwszej warstwy. Dla każdej kolumny obliczana jest suma XOR poszczególnych komórek tablicy i odpowiadających im stanom pierwszej warstwy - jeżeli ta suma osiągnie co najmniej połowę swojej maksymalnej wartości, na odpowiednim pinie pojawi się stan wysoki, jeżeli będzie mniejsza - niski.
Na razie mój program wyświetlający napis testowy nie wykonuje tych obliczeń, a jedynie zapisuje w rejestrach PORTx gotowe liczby, które obliczyłem za pomocą załączonego arkusza kalkulacyjnego, wpisując do komórek A3:A6 poszczególne kombinacje 0 i 1.
Regulacja kontrastu - PWM
Niestety, po pierwszym uruchomieniu programu wszystkie segmenty zaczerniły się, jednak pod pewnymi kątami z trudem dało się dostrzec wyświetlaną informację. Okazało się, że rozwiązaniem tego problemu jest ustawienie odpowiedniego kontrastu za pomocą PWM (zrealizowanego programowo, ponieważ ATmega8 posiada wyjście sprzętowego PWM jedynie na 3 pinach). W dodatku współczynnik wypełnienia musi być bardzo mały - dla 500 us (mikrosekund) przypadających na każdą kombinację włączonych i wyłączonych segmentów (co daje częstotliwość odświeżania 125 Hz) jedynie przez 1 us podawany jest sygnał obliczony w sposób opisany w poprzednim akapicie. Przez pozostałe 499 us na wszystkich wyprowadzeniach wyświetlacza jest stan niski.
Współczynnik wypełnienia należy dobrać do konkretnej aplikacji, mając na uwadze to, że widoczny kontrast może zależeć również od kąta patrzenia na wyświetlacz, ewentualnie umożliwić użytkownikowi jego regulację w odpowiednim zakresie.
Bezpieczne wyłączanie wyświetlacza
Jak już wspomniałem, pozostawienie napięcia stałego na elektrodach wyświetlacza może powodować jego awarię na skutek elektrolizy. Jeżeli w danej aplikacji przewiduje się ograniczenie zużycia energii poprzez uśpienie mikrokontrolera, trzeba pamiętać, aby wcześniej ustawić taki sam potencjał na wszystkich wyprowadzeniach wyświetlacza. W przeciwnym razie zatrzymanie wykonywania programu przy jednoczesnym pozostawieniu zasilania mikrokontrolera mogłoby zatrzymać GPIO w stanie, w którym część segmentów byłaby zasilana.
Ważne jest również uniknięcie takich sytuacji w razie zawieszenia się programu - w takiej sytuacji rejestry GPIO również mogłyby nie być aktualizowane. Aby temu zapobiec, można wykorzystać wbudowany w mikrokontroler układ watchdog.
Czy kiedykolwiek próbowaliście uruchomić LCD bez dedykowanego sterownika? Zapraszam do komentowania.