Wyświetlacz telefonu Nokia 6100. Obsługa sterownika Epson S1D15G00

Wyświetlacz telefonu Nokia 6100. Obsługa sterownika Epson S1D15G00
Pobierz PDF Download icon
Mimo, że ceny graficznych wyświetlaczy LCD ciągle spadają, to koszt wyświetlacza kolorowego jest nadal stosunkowo wysoki. Jeżeli zależy nam na tym, aby w aplikacji był użyty kolorowy wyświetlacz graficzny o niewielkich rozmiarach ekranu, to zawsze można rozważyć zastosowanie kolorowego wyświetlacza od telefonu komórkowego.
105ELEKTRONIKA PRAKTYCZNA 8/2010 Wyświetlacz telefonu Nokia 6100 Wyświetlacze przeznaczone do telefo- nów komórkowych są tanie, a część z nich jest dość dobrze udokumentowana. Jed- nak trzeba pamiętać, że wyświetlacze tego samego modelu telefonu mogą mieć różne typy sterowników, a sterowniki montowa- ne w serwisowych zamiennikach wyświe- tlaczy, nie zawsze są wierną kopią ste- rownika firmowego. Również elektryczne połączenie wyprowadzeń wyświetlacza z układem sterowania często stanowi nie lada wyzwanie. Różnorodne wyprowadze- nia oferowanych wyświetlaczy: złącza, styki, taśmy itp. wymagają zaprojektowa- nia specjalnych płytek drukowanych lub stosowania niestandardowych złącz, co jest dość kłopotliwe, szczególnie w ukła- dach prototypowych. Wyświetlacz telefonu Nokia 6100 Obsługa sterownika Epson S1D15G00 Mimo, że ceny graficznych wyświetlaczy LCD ciągle spadają, to koszt wyświetlacza kolorowego jest nadal stosunkowo wysoki. Jeżeli zależy nam na tym, aby w  aplikacji był użyty kolorowy wyświetlacz graficzny o  niewielkich rozmiarach ekranu, to zawsze można rozważyć zastosowanie kolorowego wyświetlacza od telefonu komórkowego. Na rynku jest bardzo dużo modeli te- lefonów używających różnych rodzajów wyświetlaczy. Do stosowania we własnych urządzeniach warto wybrać taki, z którym będzie jak najmniej problemów. Powinien być tani, łatwo dostępny i ze znanym ste- rownikiem. Mój wybór padł na wyświet- lacz od telefonu Nokia 6100 (ale również paru innych modeli telefonów tego produ- centa). Wyświetlacz Nokii 6100 Jest to kolorowy wyświetlacz z  ma- trycą o  rozmiarze 132×132 piksele. Może być zasilany napięciem +3,3 V, a kolory są wyświetlane z 12-bitową głębią (4096 kolo- rów). Sterownik wyświetlacza komunikuje się z zewnętrznym sterownikiem (hostem) przez 3-przewodową magistralę SPI. Słowo przesyłane w  czasie pojedynczej transak- cji ma długość 9 bitów. Moduł ma wbu- dowane diody podświetlające. Wszystkie sygnały i linie zasilające są wyprowadzone elastyczną taśmą zakończoną specjalnym wtykiem, do którego można kupić gniazdo przeznaczone do montażu SMD. Wyświetlacz ma jednak wadę z  punk- tu widzenia przewidywanych zastosowań ? są w  nim montowane dwa różne typy sterowników: Epson S1D15G00 lub Philips PCF8833. Nie byłoby to jakimś wielkim problemem, gdyby sterowniki były ze sobą kompatybilne. Niestety tak nie jest. Mało tego, kupując wyświetlacz nie jesteśmy w stanie rozpoznać jaki ma sterownik. Je- dynym wyjściem jest napisanie obsługi dla obu typów sterowników, bo oba są znane i dostępna jest do nich dokumentacja. Żeby rozwiązać problem z  podłącze- niem wyświetlacza do zewnętrznego ste- rownika ? hosta zaprojektowano płytkę drukowaną, na której umieszczono gniazdo do podłączenia wyświetlacza, bufory linii sterujących, akceptujące poziomy logiczne +5 V, stabilizator +3,3 V i układ przetwor- nicy podwyższający napięcie do zasilania układu podświetlania. Zewnętrzne sygnały sterujące i zasilania są podłączene do złą- cza IDC10. Schemat układów z płytki po- kazano na rysunku 2. Zworka J1 pozwala na włączenie lub wyłączenie (ominięcie) stabilizatora SPX- 1117-3,3V. Stabilizator jest niezbędny, je- żeli system jest zasilany napięciem +5  V i nie ma dostępnego napięcia +3,3 V. Ob- wód z tranzystorem T1 pozwala na włącza- nie, wyłączanie podświetlenia lub sterowa- nie jego jasnością przebiegiem PWM. Ponieważ matryca wyświetlacza ma rozmiar 132×132 piksele, to patrząc na wyświetlacz nie możemy na podstawie jego wyglądu określić orientacji wyświe- tlanej informacji. Domyślną orientację wy- świetlacza pokazano na rysunku 3. Fotografia 1. Wyświetlacz telefonu Nokia 6100 Pin Funkcja 1 Vcc 2 !RESET 3 DATA 4 CLK 5 !CS 6 Vcc 7 NC 8 GND 9 VLED- 10 VLED+ notatnik konstruktora 106 ELEKTRONIKA PRAKTYCZNA 8/2010 notatnik konstruktora Rysunek 2. Schemat układów z płytki wyświetlacza Rysunek 3. Domyślna orientacja wyświetlacza Czasami mechaniczne mocowanie wyświetlacza wymusza odwrócenie obra- zu o  180°. Można to zrobić wysyłając do wyświetlacza odpowiednie komendy. Na rysunku 4 pokazano orientację po odwró- ceniu obrazu o 180°. Organizacja pamięci Sterownik S1D15G00 może sterować kolorowym wyświetlaczem o  organizacji 396 segmentów i  168 wierszy. Na każdy piksel przypadają 3 segmenty koloru czer- wonego, zielonego i  niebieskiego. Daje to możliwość sterowania wyświetlaczem o  rozdzielczości 168×132 (168=396/3) pikseli. Znając możliwości sterowania można określić potrzebną wielkość pamię- ci RAM obrazu. Intensywność świecenia każdego z segmentów koloru (R, G, B) jest kodowana 4 bitami. Trzy składowe koloru po 4 bity dają 12-bitową głębię kolorów. Zatem pamięć RAM musi mieć pojemność 396×168×4=266112 bitów. Na rysunku  5 pokazano położenie za- kodowanych 4 bitami składowych koloru dla 2 kolejnych pikseli. Informacja o kolo- rze pierwszego piksela zajmuje półtora baj- ta. Podobnie informacja o kolorze drugiego piksela zajmuje półtora bajta. Jest to nie- zbyt wygodna organizacja pamięci z punk- tu widzenia zorganizowanych bajtowo (8, 16, lub 32-bitowych) układów sterowania i  wymaga dodatkowych zabiegów progra- mowych. Jeżeli nie potrzeba 12-bitowej głębi kolo- rów, można użyć trybu z  8-bitowa głębią. Infor- macja o kolorze jest zapi- sywana na 8 bitach: D7, D6, D5 dla składowej R, D4, D3, D2 dla składo- wej G oraz D1, D0 dla składowej B (rysunek 6). Po zapisaniu bajtu, ste- rownik przekształca 2- i  3-bitowe składowe na 4-bitowe i zapisuje w pa- mięci RAM, tak jakby to była głębia 12-bitowa. Komendy SD15G00 Sterowanie wyświe- tlaczem odbywa się przez zapisywanie do niego komend z parame- trami. W tabeli 1 pokazano zbiorcze zesta- wienie wszystkich komend S1D15G00 Cześć komend sterownika jest oczywi- sta i nie będziemy ich szczegółowo opisy- wać. Zostaną natomiast opisane komendy 107ELEKTRONIKA PRAKTYCZNA 8/2010 Wyświetlacz telefonu Nokia 6100 bardziej skomplikowane i  wymagające szerszego wyjaśnienia. Adresowanie pamięci obrazu jest po- wiązane ze sposobem wyświetlania infor- macji na ekranie. Sterownik może kontro- lować wyświetlacz z  matrycą mającą 168 linii i 132 kolumny. Pamięć obrazu sterow- nika można traktować jako obszar o orga- nizacji 168×132 słów 12-bitowych. Pozy- cja danej w pamięci jest określana przez 2 liczniki: kolumn zmieniający się od 0 do 131 i wierszy (stron pamięci) zmieniający się od 0 do 167. Z modyfikacją liczników adresowych są związane komendy PASET i CASET. Obie mają po 2 argumenty okre- ślające początek zakresu zmiany i  koniec zakresu zmiany liczników. Na rysunku  7 pokazano komendę PA- SET, a na rysunku 8 komendę CASET. Używając tych komend programuje się zakres adresów w obszarze których będą się zmieniały liczniki stron i  kolumn po każ- dym zapisaniu danej do pamięci obrazu. Żeby pokazać mechanizm działania komend modyfikacji adresów, zdefiniuje- my obszar w kształcie kwadratu 8×8 pik- seli. Do tego celu wykorzystamy komendy PASET z argumentem 4 (początek) i 11( ko- niec) i CASET z argumentem 2 (początek) i 9 (koniec) ? rysunek 9. Po wysłaniu tych komend wyświetla- nie rozpocznie się od pozycji określonej przez argumenty adresu początku obu ko- mend (4, 2). Każde wpisanie danej do ste- rownika będzie powodowało zwiększanie zawartości licznika kolumn od wartości początkowej określonej przez pierwszy argument komendy CASET do wartości końcowej kreślonej przez drugi argument tej komendy. Po osiągnięciu wartości koń- cowej, zwiększana jest zawartość licznika stron (wierszy), a licznik kolumn jest zero- wany. W ten sposób kolejne zapisanie 64 danych tworzy obraz z 64 pikseli (kwadrat 8×8). Pokazano to na rysunku 10. Dalsze wpisywanie danych będzie zapełniało kwadrat od początku. Jest to bardzo uży- teczny mechanizm, pozwalający w prosty sposób wyświetlać znaki alfanumeryczne o dowolnej wielkości oraz bitmapy o róż- nych wielkościach. Można również zde- finiować wyświetlanie pojedynczego pik- sela przez wpisanie do komendy takich samych adresów początku i końca. Powiązanie pomiędzy danymi zapisy- wanymi do pamięci wyświetlacza, a infor- macją wyświetlaną na ekranie określają parametry komendy DATCTL (rysunek 11). Pierwszy parametr określa sposób mo- dyfikacji liczników adresowych w  zdefi- niowanym komendami PASET i  CASET obszarze. Na rysunku 11 jest pokazana mo- dyfikacja liczników w trybie normalnym, to znaczy po każdym wpisie do pamięci liczniki są inkrementowane. Tabela 1. Zestawienie komend sterownika S1D15G00 Komenda Opis Kod (hex) parametr DISON Włącz sterowanie wyświetlaczem AF brak DISOFF Wyłącz sterowanie wyświetlaczem AE brak DISNOR Sterowanie normalne A6 brak DISINV Inwersja wyświetlania A7 brak COMSCN Kierunek skanowania BB 1bajt DISCTL Sterowanie wyświetlaniem CA 3bajty SLPIN Włączenie uśpienia 95 Brak SLPOUT Wyłączenie uśpienia 94 Brak PASET Ustawienie adresu strony 75 2bajty CASET Ustawienia dresu kolumny 15 2bajty DATCTL Ustawienia sposobu zapisu danych BC 3bajty RGBSET8 Zapisanie tablicy konwersji kolorów CE 20bajtów RAMWR Zapisanie pamięci RAM 5C Dana RAMRD Odczytanie pamięci RAM 5D Dana PTLIN Włączenie trybu partial A8 2bajty PLTOUT Wyłączenie trybu partial A9 brak RMWIN Start odczyt i  zapis z  modyfikacją E0 brak RMWOUT Koniec trybu odczyt i  zapis z  modyfikacją EE brak ASCSET Ustawienie obszaru skrolowania AA 4bajty SCSTART Start skrolowania AB 1bajt OSCON Start wewnętrznego oscylatora D1 Brak OSCOFF Zatrzymanie wewnętrznego oscylatora D2 brak PWCTRL Sterowanie zasilaniem 20 1bajt VOLCTRL Sterowanie napięciem przetwornicy 81 2bajty VOLUP Zwiększenie sterowania przetwornicy o  1 D6 brak VOLDOWN Zmniejszenie sterowania przetwornicy o  1 D7 brak TMPGRD Współczynnik temperaturowy 82 1bajt EPCTIN Sterowanie EEPROM CD 1bajt EPCOUT Koniec sterowania EEPROM CC brak EPMWR Zapis do EEPROM FC brak EPMRD Odczyt z  EEPROM FD brak EPSRRD1 Odczyt rejestru 1 7C brak EPSRRD2 Odczyt rejestru 2 7D brak NOP NOP 25 brak STREAD Odczytanie rejestru statusowego ------- ------- Rysunek 4. Alternatywna orientacja wyświetlacza Kierunek zmiany licznika stron (wier- szy) określa bit P10 pierwszego parametru komendy DATCTL. Dla P10=0 licznik stron jest inkrementowany, a  dla P10 jest dekre- mentowany. Dokładnie tak samo z pomocą bitu P11 określa się kieru- nek modyfikacji liczni- ka kolumn. Bit P12 określa czy po zapisaniu danej zmienia się zawartość licznika kolumn, czy licznika stron. W przy- kładzie pokazanym na rysunku  11 po zapisa- niu danej inkremento- wany jest licznik ko- lumn. Tak dzieje się, kiedy P12=0. Kiedy P12=1, to po wpisaniu danej jest inkremento- wany licznik wierszy, a  po osiągnięciu war- tości granicznej jest dopiero modyfikowa- ny licznik kolumn. Wtedy na rysunku 10 108 ELEKTRONIKA PRAKTYCZNA 8/2010 notatnik konstruktora Rysunek 5. Położenie składowych koloru w pamięci RAM obrazu dla dwóch pikseli Składowa czerwona i zielona pierwszego piksela Składowa niebieska pierwszego i czerwona drugiego piksela Składowa zielona i niebieska drugiego piksela Rysunek 6. Położenie składowych koloru w bajcie dla trybu 8-bitowego Kod 75 parametr1 Adres strony początkowej parametr2 Adres strony końcowej Rysunek 7. Komenda PASET ustawienia zakresu numerów stron Kod 15 Parametr1 Adres kolumny początkowej Parametr2 Adres kolumny końcowej Rysunek 8. Komenda CASET ustawienia zakresu numerów kolumn Rysunek 9. Ustawianie zakresów adresów komendami Rysunek 10. Zapisywanie wcześniej zdefiniowanego obszaru czerwone strzałki byłaby zwrócone piono- wo poczynając od punktu początkowego. W  drugim parametrze komendy DACTL jest określone przypisanie skła- dowych koloru do bitów słowa danych. W domyślnym trybie normalnym to przy- pisanie wygląda tak jak na rysunku 5. Parametr 3 definiuje głębię kolo- rów 8-bitową lub 12-bitową. Dla P32=0, P31=0 i  P30=1 do sterownika wpisu- je się dane 8-bitowe. Dla P32=0, P31=1 i  P30=0 do sterownika wpisuje się dane 16-bitowe mając na uwadze pokazane na rysunku 6 położenie 12 bitów składowych koloru w 16-bitowym słowie. Komenda COMSCAN umożliwia od- wrócenie wyświetlanej informacji o  180 stopni bez konieczności zmiany mocowa- nia wyświetlacza. Kierunek skanowania linii określa 1-bajtowy parametr komendy ? rysunek 12. Trójparametrowa komenda DISCTL (rysunek 13) jest używana do ustawiania funkcji związanych z zależnościami cza- sowymi sygnałów sterujących segmen- tami wyświetlacza. Pierwszy parametr określa zależności czasowe sygnałów ste- rujących CL, F1 i F2 dostępnych na wy- prowadzeniach sterownika (rysunek 14). Drugi parametr określa zależności pomię- dzy współczynnikiem multipleksowania a  liczbą linii wyświetlacza. Trzeci para- metr określa liczbę linii wyświetlanych inwersyjnie (od 2 do 16). Inwersyjne wy- świetlanie jest wyłączone po wyzerowa- niu tego parametru (wartość domyślna). Rozbudowana komenda ACSET (rysu- Kod komendy DATCL BC Parametr 1 * * * * * * P12 P11 P10 Parametr 2 * * * * * * P22 P21 P20 Parametr 3 * * * * * * P32 P31 P30 Rysunek 11. Format komendy DATCTL Kod Komendy COMSCAN BB Parametr * * * * * P12 P11 P10 P12 P11 P10 Kierunek skanowania COM1 COM80 COM81 COM160 0 0 0 0 0 1 0 1 0 0 1 1 1 ? 80 1 ? 80 80 ? 1 80 ? 1 81 ? 160 160 ? 81 81 ? 160 160 ? 81 Rysunek 12. Komenda COMSTAN Kod komendy DISCTL CA Parametr 1 * * * * * * P12 P11 P10 Parametr 2 * * * * * * P22 P21 P20 Parametr 3 * * * * * * P32 P31 P30 Rysunek 13. Format komendy DISCTL nek  15) pozwala na elastyczne ustawie- nie obszaru i  rodzaju skrolowania. Do- stępne są 4 tryby skrolowania ustawiane bitami P41 i  P40 czwartego parametru komendy (rysunek 16). Dla współczynni- ka multipleksowania 1/132 zdefiniowany w sterowniku S1D15G00 blok ma szero- kość 4 linii. Dla ekranu o wysokości 132 linii mamy do dyspozycji 32 bloki. Para- metry komendy ASCSET definiują adres górnego bloku, adres dolnego bloku oraz liczbę bloków skrolowanego obszaru. Żeby w ogóle operację przesuwania moż- na było wykonać, to obszar pamięci musi być większy niż pamięć obrazu. W  tym celu definiuje się dodatkowy obszar na- zywany backgrund area o  wielkości 10 bloków, tak że cały obszar ma w  sumie 42 bloki. Na przykład przyjmijmy, że bę- dzie skrolowana centralna część ekranu. Obszar skrolowany ma 112 linii czyli 28 bloków. Od góry zarezerwujemy na nie- 109ELEKTRONIKA PRAKTYCZNA 8/2010 Wyświetlacz telefonu Nokia 6100 Działanie tak zdefiniowanego przesu- wania zostało pokazane na rysunku  17. Uruchomienie przesuwania następuje po wysłaniu komendy SCSTART. Jej parame- trem jest adres bloku, od którego rozpo- czyna się skrolowanie. Komenda RMWIN działa w  połącze- niu z komendami CASET i PASET. Używa się jej do wprowadzenia w  sterowniku mechanizmu: odczytaj/modyfikuj/zapisz. W  pierwszym kroku jest odczytywana dana z lokalizacji określonej przez bieżącą zawartość liczników kolumn i  stron. Od- czyt nie powoduje modyfikacji liczników adresowych. Dopiero po zmodyfikowaniu danej i  jej zapisaniu są modyfikowane liczniki adresowe (rysunek 18). Działanie trybu odczytaj/modyfikuj/zapisz kończy komenda RMWOUT. Rozpoczęcie zapisu danych jest wy- konywane po wysłaniu komendy RMWIN. Wykonanie kodu komendy zawsze powo- duje ustawienie liczników adresowych na wartości początkowe, ustawione komen- dami PASET i CASET. Dane są kierowane do sterownika do momentu wysłania do- wolnej komendy. Wyświetlacze LCD ze sterownikiem S1D15G00 są głównie przeznaczone do pracy w  urządzeniach przenośnych, za- silanych bateryjnie. Matryce LCD wyma- gają do prawidłowej pracy napięć wyż- szych, niż napięcie baterii zasilające ste- rownik (+3,3...3,6  V). Dlatego w  układ sterownika wbudowano przetwornicę podwyższająca napięcie i programowany układ regulacji napięcia zasilania drive- rów matrycy. Każdy z układów przetwor- nicy może być programowo włączany lub wyłączany komendą PWRCTR (rysu- nek 19). Układ regulacji napięcia zasilającego segmenty matrycy V2 pokazano na ry- sunku  20. Napięcie wyjściowe zależy od napięcia podawanego na nieodwracające wejście wzmacniacza, dzielnika rezysto- rowego Rb i  Ra oraz programowanego współczynnika alfa. Obie te wartości są programowane komendą VOLCTR (rysu- nek 21). Współczynnik alfa jest związany ze stopniem podziału elektronicznego poten- cjometru podającego napięcie na wyjście elektronicznego układu regulacji. Wyjście to jest połączone z nieodwracającym wej- ściem wzmacniacza z rysunku 21. Parametr1 komendy VOLCTR można modyfikować przez wysyłanie komendy VOULP (inkrementacja) i komendy VOLDN (dekrementacja). Modyfikacja odbywa się modulo 256. Korekcja napięcia zasilania driverów matrycy w funkcji temperatury otoczenia jest programowana komendą TMPGRD (ry- sunek 22). P13 P12 Współczynnik podzia- łu sygnału CL 0 0 1 1 0 1 0 1 2 4 8 1 P13 P12 Okres przełączania F1, F2 0 0 1 1 0 1 0 1 8H 4H 16H pole Rysunek 14. Znaczenie bitów pierwszego argumentu komendy DISCTL Kod komendy ASCSET AA Parametr 1 * * * P15 P14 P13 P12 P11 P10 Adres górnego bloku Parametr 2 * * * P25 P24 P23 P22 P21 P20 Adres dolnego bloku Parametr 3 * * * P35 P34 P33 P32 P31 P30 Liczba bloków Parametr 4 * * * * * * * P41 P40 Tryb skrolowania Rysunek 15. Komenda ustawienia skrolowania ASCSET P41 P40 0 0 Skrolowanie centralnej części ekranu 0 1 Skrolowanie górnej części ekranu 1 0 Skrolowanie dolnej części ekranu 1 1 Skrolowanie całego ekranu Rysunek 16. Dostępne tryby skrolowania ekranu Rysunek 17. Działanie mechanizmu skrolowania skrolowany obszar 8 linii, czyli 2 bloki i  od dołu 8 linii, czyli również 2 bloki. Komenda ASCSET musi mieć następujące parametry: ? P1 (adres górnego bloku) =2. ? P2 (Adres dolnego bloku) =39. Ta war- tość wynika z dodania wielkości back- ground area ( 10 bloków) i adresu 29. Adres 29, to 2 bloki górnego obszaru nieskrolowanego i 28 bloków obszaru skrolowanego z zastrzeżeniem, że ad- resy są liczone od 0. ? Liczba bloków równa 28 110 ELEKTRONIKA PRAKTYCZNA 8/2010 notatnik konstruktora Rysunek 18. Działanie komendy RMWIN Kod komendy PWCTR 20 Parametr * * * * P13 P12 P11 P10 P10 ? sterowanie układem generowania napięcia referencyjnego P10 = 1 załączony P10=0 wyłączony P11- sterowanie układem regulatora napięcia wyjściowego P11 = 1 załączony P11=0 wyłączony P12 ? sterowanie drugim stopniem boostera P12 = 1 załączony P12=0 wyłączony P13 ? sterowanie pierwszym stopniem boostera P13 = 1 załączony P13=0 wyłączony Rysunek 19. Komenda PWCTR Rysunek 20. Układ regulacji napięcia zasilającego matrycę Kod komendy VOLCTR 81 Parametr1 * * P15 P14 P13 P12 P11 P10 Parametr alfa Parametr2 * * * * * P22 P21 P20 1+Rb/ Ra Parametr 1+Rb/Ra Napięcie P22 P21 P20 0 0 0 3.95 Małe Duże 0 0 1 4.27 0 1 0 4.60 0 1 1 4.93 1 0 0 4.26 1 0 1 5.59 1 1 0 5.92 1 1 1 6.25 Rysunek 21. Komenda VOLCTR Programowa obsługa wyświetlacza Sterownik S1D15G00 może się komu- nikować z hostem z pomocą 8- lub 16-bi- towej równoległej magistrali pracującej w  przemysłowym standardzie Intel8080 lub Motorola 6800. Takie połącze- nie zapewnia dużą prędkość przesyłanych danych, ale jest kłopotliwe w  implementacji ze względu na dużą liczbę linii sterujących. Dlatego ste- rownik wyposażono też w  3- lub 4-przewodowy interfejs SPI. Do przesyłania danych używane są linie danych DATA, zegarowa CLK i wybo- ru CS. W interfejsie 4-przewodowym do- dano jeszcze linię wyboru dane/komendy ? D/C. Można wtedy przesyłać interfejsem standardowe dane 8-bitowe i wykorzystać w tym celu sprzętowe interfejsy SPI. W  interfejsie 3-przewodowym wybo- ru dane/komendy dokonuje się przesyła- jąc dodatkowy, dziewiąty bit. Upraszcza to interfejs (jedna linia mniej), ale trochę komplikuje obsługę programową. W  wy- świetlaczu z  telefonu Nokia 6100 w  ste- rowniku S1D15G00 jest wybrany na stałe interfejs SPI w wersji 3-przewodowej (ry- sunek? 23). Nietypowy interfejs SPI, którym prze- syła się 9 bitów danych, najwygodniej jest zaimplementować programowo. Na listin- gu 1 pokazano funkcję WriteSpi wysyłają- cą przez hosta 8 bitów danych. Przesyła- nie kompletnego 9-bitowego słowa można łatwo zrealizować przez poprzedzenie wy- wołania WriteSpi wysłaniem zera (zapis komendy) lub wysłaniem jedynki (zapis danej 8-bitowej). Procedury realizujące wysyłanie komend i danych zostały poka- zane na listingach 2 i 3. Po włączeniu zasilania sterownik wy- świetlacza nie jest gotowy do pracy i wy- maga zerowania oraz programowego za- inicjalizowania. Pierwszą czynnością jaką należy wykonać jest sprzętowe zerowanie sterownika przez podanie na wejście ze- rowania (doprowadzenie Reset) poziomu niskiego, a  następnie wymuszenie na tej linii poziomu wysokiego (listing  4). Pro- gramową inicjalizację sterownika poka- zano na listingu  5. Rozpoczynamy ją od wysłania komendy Display Control. Pa- rametr P1 komendy jest wyzerowany, co oznacza współczynnik podziału wynoszą- cy 2 i okres przełączania równy 8 (wartość domyślna). Parametr P2 ma wartość 0x20 (132 dzies.). Ponieważ nie chcemy aby jakieś linie były wyświetlane inwersyj- nie, to trzeci parametr zerujemy. Kolejna komenda COMSCAN określa orientacje wyświetlanej informacji. Po wpisaniu do parametru komendy wartości 0x01 będzie to skanowanie 1->80, 160<-81. Następ- ne dwie komendy włączają wewnętrzny oscylator (OSCON) i  wybudzają sterow- nik (drivery) z domyślnego stanu uśpienia (SLPOUT). W trakcie prób z wyświetlaczem oka- zało się, że aby wyświetlane kolory były prawidłowe, trzeba wysłać komendę DI- SINV. W opisie sterownika nie znalazłem informacji o tym, w jakiej sytuacji należy używać tej komendy. Być może jej działa- nie jest związane z konstrukcją samej ma- trycy LCD. Pierwszy parametr następnej komen- dy DACTL określa sposób modyfikacji liczników stron i kolumn. Dokładnie zo- stało to opisane przy okazji omawiania samej komendy. W inicjalizacji pierwszy parametr ma wartość 0x01. Adres stron 111ELEKTRONIKA PRAKTYCZNA 8/2010 Wyświetlacz telefonu Nokia 6100 Listing 1. Wysyłanie 8 bitów danych przez SPI void WriteSpi(unsigned char data) { unsigned char i; SetBit(CLK); //linia zegarowa stan wysoki for (i=0;i<8;i++) { ClrBit(CLK); //linia zegarowa stan niski if ((data&0x80)==0) ClrBit(DATA); //na linii danych ?0? else SetBit(DATA); //na linii danych ?1? SetBit(CLK); //linia zegarowa stan wysoki data<<=1; //kolejny bit danych } SetBit(CS); //linia SCF w stan nieaktywny ( wysoki) } Listing 2. Wysłanie komendy void WriteSpiCommand(unsigned char cmd){ ClrBit(CS); //SCF w stan aktywny niski ClrBit(CLK); ClrBit(DATA);//pierwszy bit =0 - komendy WriteSpi(cmd); } Listing 3. Wysłanie danej void WriteSpiData(unsigned char data){ ClrBit(CS); //SCF w stan aktywny niski ClrBit(CLK); SetBit(DATA);//pierwszy bit =1 - dane WriteSpi(data); } Listing 4. Inicjalizacja interfejsu SPI i zerowanie sterownika SetBit(CS);//linie interfejsu SPI inicjowane w stan wysoki SetBit(CLK); SetBit(DATA); ClrBit(RES);//reset wyświetlacza aktywny for(i=0;i<8000;i++) delay(); SetBit(RES);//reset nieaktywny for(i=0;i<8000;i++) delay(); Fotografia 25. Wielkości zdefiniowanych znaków P11 P10 Współczynnik korekcji %/C 0 0 -0,05 0 1 -0,1 1 0 -0,15 1 1 -0,2 Kod komendy TMPGRD 82 Parametr * * * * * * P11 P10 Rysunek 22. Komenda TMPGRD Rysunek 23. Przesłanie danych 3-przewodową magistralą SPI Rysunek 24. Przykład wyświetlania zna- ku? E jest dekrementowany, a adres kolumn in- krementowany. Po każdym zapisaniu da- nych są modyfikowane liczniki kolumn. Drugi parametr jest wyzerowany dla uzy- skania domyślnej wartości sekwencji ko- lorów RGB. Trzeci parametr programuje tryb wyświetlania 8- lub 12-bitowy. Po wpisaniu wartości 0x02 wybrany zostaje tryb 16-bitowej skali szarości równoważ- ny 12-bitowemu kolorowi. Kontrast wyświetlacza jest regulowany parametrami komendy VOLCTR. Pierwszy parametr to opisywany wcześniej parametr alfa. Można go ustawiać w zakresie 0...63. Drugi parametr określa współczynnik po- działu dzielnika rezystancyjnego Ra/Rb (wzmocnienie wzmacniacza). Dobierając eksperymentalnie wartości tych parame- trów można ustawić optymalny kontrast wyświetlacza. W trakcie prób u okazało się, że po podaniu jako drugi parametr komen- dy VOCTR wartości innej niż 2, regulacja kontrastu nie działa prawidłowo Po włączeniu układu przetwornicy i  ustawieniu napięcia wyjściowego trzeba odczekać czas potrzebny na ustabilizowa- nie się napięcia zasilającego drivery i moż- na włączyć komendą DISON sterowanie matrycą wyświetlacza. Ostatnią czynnością wykonywaną w trakcie inicjalizacji jest czyszczenie pa- mięci obrazu sterownika, bo po włączeniu zasilania w  pamięci są zapisane wartości przypadkowe. Czyszczenie będzie pole- gało na zapisie wartości odpowiadającej jednakowemu kolorowi wszystkich pikseli wyświetlacza. Kolor inicjalizacji jest argu- mentem procedury ClsLCD umieszczonej na listingu 6. Do czyszczenia (i  nie tylko tutaj) wy- korzystamy mechanizm pokazany na ry- sunkach  10 i  11. Najpierw komendami PASET i CASET definiuje się zakresy zmian adresów liczników stron i kolumn. Ponie- waż zapisywanie będzie dotyczyło całego ekranu, to liczniki muszą się zmieniać w zakresie od 0 do 131 dla stron (wierszy) i kolumn. Zapisywanie danych do pamięci wyświetlacza należy poprzedzić komendą RAMWR. Jej wykonanie powoduje wpisanie do liczników adresowych wartości począt- kowych ustawionych komendami PASET i CASET. Każde zapisanie danej będzie po- wodowało modyfikację liczników w sposób określony komendą DATCTL z  procedury inicjalizacji. Jako argument komendy trzeba podać 12-bitową wartość odpowiadającą oczekiwa- nemu kolorowi. Na listingu 7 pokazano de- finicje 12-bitowych liczb odpowiadających kolorom w systemie RGB. Jednemu pikselo- wi odpowiada 12 bitów w  pamięci obrazu. Jednak dane są zapisywane do sterownika bajtowo. Kiedy popatrzymy na rysunek  5 to możemy dojść do wniosku, że najlepiej 112 ELEKTRONIKA PRAKTYCZNA 8/2010 notatnik konstruktora Listing 5. przykładowa inicjalizacja sterownika S1D15G00 // Display control WriteSpiCommand(DISCTL); WriteSpiData(0x00); // P1: 0x00 = 2 współczynnik podziału i  period=8 WriteSpiData(0x20); // P2: 0x20 = 132/4 - 1 = 32 linii WriteSpiData(0x00); // P3: 0x00 = bez inwersji // COM scan WriteSpiCommand(COMSCN); WriteSpiData(1); // P1: 0x01 = skanowanie 1->80, 160<-81 // Właczenie wewnętrznego oscylatora WriteSpiCommand(OSCON); // Wyjście ze stanu uśpienia WriteSpiCommand(SLPOUT); // programowanie układu zasilania ( przetwornicy) WriteSpiCommand(PWRCTR); WriteSpiData(0x0f); // wł. Regulatora nap. ref., wł układu regulatora nap. wyjściowego, wł układu boostera // Wyświetlanie inwersyjne WriteSpiCommand(DISINV); // Data control WriteSpiCommand(DATCTL); WriteSpiData(0x01); // P1: 0x01 = dekrementowanie licznika stron, inkrementowanie licznika kolumn, zmiana licznika kolumn WriteSpiData(0x00); // P2: 0x00 = sekwencja RGB (wartość domyślna) WriteSpiData(0x02); // P3: 0x02 = 16 bitowa skala szarości (12 bitowy kolor A) // sterowanie kontrastem WriteSpiCommand(VOLCTR); WriteSpiData(32); // P1 = 32 współczynnik alfa WriteSpiData(3); // P2 = 3 współczynnik podziału Ra/Rb for(i=0;i<8000;i++) //opóźnienie na ustabilizowanie się napięcia wyjściowego delay();; // włączenie sterowania wyświetlaczem WriteSpiCommand(DISON); Listing 6. Czyszczenie wyświetlacza Void ClsLCD(short color) { int i; // ustawienie zakresu zmian licznika adresowego stron pamięci WriteSpiCommand(PASET); WriteSpiData(0); //adres początkowy WriteSpiData(131);//adres końcowy // ustawienie zakresu zmian licznika adresowego kolumn WriteSpiCommand(CASET); WriteSpiData(0);//adres początkowy WriteSpiData(131);//adres końcowy // zapisanie pamięci kolorem z  WriteSpiCommand(RAMWR); for(i = 0; i < ((131 * 131) / 2); i++) { WriteSpiData((color >> 4) & 0xFF); //kopiowanie 12 bitów dla //1 piksela na 24 bity dla 2 pikseli WriteSpiData(((color & 0xF) << 4) | ((color >> 8) & 0xF)); WriteSpiData(color & 0xFF); } } Listing 7. Definicja 12- bitowych kolorów // definicja kolorów 12-bitowych #define WHITE 0xFFF #define BLACK 0x000 #define RED 0xF00 #define GREEN 0x0F0 #define BLUE 0x00F #define CYAN 0x0FF #define MAGENTA 0xF0F #define YELLOW 0xFF0 #define BROWN 0xB22 #define ORANGE 0xFA0 #define PINK 0xF6A Listing 8. Wyświetlanie znaku na ekranie LCD (autor James P. Lynch) void LCDPutChar(char c, int x, int y, int size, int fColor, int bColor) { //deklaracje tablic z generatorami znaków extern const unsigned char FONT6x8[97][8]; extern const unsigned char FONT8x8[97][8]; extern const unsigned char FONT8x16[97][16]; int i,j; unsigned int nCols; unsigned int nRows; unsigned int nBytes; unsigned char PixelRow; unsigned char Mask; unsigned int Word0; unsigned int Word1; unsigned char *pFont; unsigned char *pChar; unsigned char *FontTable[] = {(unsigned char *)FONT6x8, (unsigned char *) FONT8x8, (unsigned char *)FONT8x16}; //pobranie wskaźnika wybranej argumentem size jednej z trzech tablicy znaków pFont = (unsigned char *)FontTable[size]; // pobranie nColumns, nRows and nBytes ? ilość kolumn, wierszy i bajtów na znak nCols = *pFont; nRows = *(pFont + 1); nBytes = *(pFont + 2); razy jest realizowane kopiowanie 12-bitów argumentu koloru dla jednego piksela na 24 bity dla dwóch pikseli. Na prawidłowo zainicjowanym wy- świetlaczu możemy wyświetlać informacje tekstowe lub bitmapy. Wyświetlanie tekstu wymaga zdefiniowania w  pamięci mikro- kontrolera hosta tablicy z generatorem zna- ków. Graficzna natura wyświetlacza powo- duje, że można definiować znaki o różnych wielkościach, elastycznie dostosowując je do potrzeb. Dodatkowo, w kolorowym wy- świetlaczu można definiować kolor znaku i kolor tła podnosząc czytelność i atrakcyj- ność wyświetlanej informacji. Pierwszą bardzo żmudną czynnością, którą należy wykonać, jest zdefiniowanie tablicy generatora znaków. Pierwsza moja próba z wyświetlaniem znaków alfanume- rycznych polegała na wykorzystaniu tabli- cy generatora znaków o wielkości 8×6 pik- seli z  monochromatycznego wyświetlacza od telefonu Nokia 3310. Jednak okazało się, że znaki o tej wielkości nie są zbyt czy- telne i  w  większości przypadków przyda- łyby się większe. Przy definiowaniu więk- szych znaków postanowiłem posiłkować się zawartością Internetu. Znalazłem tam gotową tablicę znaków o  trzech wymia- rach: 6×8 pikseli, 8×8 pikseli i 8×16 pik- seli autorstwa Jamesa P. Lyncha. Do tablicy została dołączona procedura LCDPutChar (również tego autora) służąca do wyświe- tlania pojedynczych znaków. Po testach okazało się, że procedura działa doskonale i jest elastyczna, dlatego zdecydowałem się ją tutaj przedstawić (listing 8). Argumentami funkcji LCDPutChar są: ? znak do wyświetlania c, ? współrzędne x, y początku umieszcze- nia znaku, ? parametr size określający wielkość zna- ku, ? definicja koloru znaku fColor, ? definicja koloru tła bColor. Aby wyświetlanie mogło dobrze dzia- łać dla znaków o różnych wielkościach, na początku każdej tablicy generatora znaków zostały umieszczone informacje o  liczbie kolumn i wierszy w znaku oraz liczbie baj- tów do pobrania z tablicy niezbędnych do jego wyświetlenia. Te informacje są pobie- rane z tablicy i zapisywane do zmiennych nColumns, nRows i  nBytes. Na podstawie nColumns i nRows oraz argumentów współ- rzędnych x i y wyliczane są adresy początku wyświetlania napisu i  zapisywane komen- dami PASET i  CASET. Do samego wyświe- tlania wykorzystano taki sam mechanizm automatycznej zmiany adresów w obszarze zdefiniowanym przez PASET i CASET. Podobnie jak w procedurze czyszczenia ekranu do pamięci wyświetlacza są zapisy- wane za każdym razem 3 bajty określające kolor dwóch pikseli. jest przesyłać dane w 3-bajtowych porcjach (3×8=24 bity) odpowiadających kolejnym dwóm pikselom po 12 bitów każdy. Dla zapi- sania całej pamięci wyświetlacza trzeba za- pisać 131×131 12-bitowych słów. Ale mając ciągle na uwadze rysunek 5 lepiej jest zapi- sać 131×131/2 24-bitowych słów. Tak też jest to robione w procedurze ClsLCD z listingu 7. W pętli, która wykonywana się (131×131/2) 113ELEKTRONIKA PRAKTYCZNA 8/2010 Wyświetlacz telefonu Nokia 6100 Listing 10. Zapisanie pełnowymiarowej bitmapy w trybie koloru 8-bitowego. void LCDWriteBmp(void) { long j; WriteSpiCommand(DATCTL); WriteSpiData(7); // P1: 0x00 = adres strony dekr., adres //kolumn dekr. ,mod. licznika stron WriteSpiData(0x00); // P2: 0x00 = RGB (wartosc domyslna) WriteSpiData(0x01); // P3:tryb 8 bitowy WriteSpiCommand(CASET); //zakres licznika kolumn WriteSpiData(0); WriteSpiData(131); WriteSpiCommand(PASET);//zakres licznika stron WriteSpiData(0); WriteSpiData(131); WriteSpiCommand(RAMWR); //zapis do pamieci 17424 (132*132)bajtow for(j = 0; j < 17424; j++) { WriteSpiData(bmp[j]); } // powrót do ustawień dla wyświetlania tekstu WriteSpiCommand(DATCTL); WriteSpiData(0x01); //P1: 0x01 = adres strony dekr., //adres kolumn inkr ,mod. licznika stron WriteSpiData(0x00); // P2: 0x00 = RGB WriteSpiData(0x02); // P3: 0x02 = tryb 12 bitowy // Display On WriteSpiCommand(DISON); } Listing 9. Funkcja wyświetlająca napisy void LCDPutStr(char *pString, int x, int y, int Size, int fColor, int bColor) { // w pętli do napotkania znacznika końca łańcucha znaków 0x00 while (*pString != 0x00) { // wyświetlanie znaku LCDPutChar(*pString++, x, y, Size, fColor, bColor); // wyliczenie pozycji następnego znaku w zależności od jego wielkości if (Size == SMALL) y = y + 6; //dla 6x8 else if (Size == MEDIUM) y = y + 8; //dla 8x8 else y = y + 8; //dla 8x16 // współrzędna poza zakresem if (y > 131) break; } } Listing 8. cd. //pobranie wskaźnika do ostatniego znaku do wyświetlania i  //korekcja z kodu ASCII do kodów tablicy generatora pChar = pFont + (nBytes * (c - 0x1F)) + nBytes - 1; // zapisanie zakresu adresowania stron ( wierszy) ? komenda PASET WriteSpiCommand(PASET); WriteSpiData(x); WriteSpiData(x + nRows - 1); // zapisanie zakresu adresowania kolumn? komenda CASET WriteSpiCommand(CASET); WriteSpiData(y); WriteSpiData(y + nCols - 1); // komenda RAMWR WriteSpiCommand(RAMWR); //pętla dla każdego wiersza od góry do dołu for (i = nRows - 1; i >= 0; i--) { //kopiowanie wiersza pikseli z tablicy generatora i dekrementacja wiersza PixelRow = *pChar--; //pętla dla każdego piksela w wierszu ( z lewej do prawej) ? każda pętla to 2 piksele Mask = 0x80; for (j = 0; j < nCols; j += 2) { //jeżeli bit piksela jest ustawiony, to używamy koloru znaku //w przeciwnym przypadku koloru tła if ((PixelRow & Mask) == 0) Word0 = bColor; else Word0 = fColor; Mask = Mask >> 1; if ((PixelRow & Mask) == 0) Word1 = bColor; else Word1 = fColor; Mask = Mask >> 1; //zapisanie 3 bajtów dla 2 pikseli WriteSpiData((Word0 >> 4) & 0xFF); WriteSpiData(((Word0 & 0xF) << 4) | ((Word1 >> 8) & 0xF)); WriteSpiData(Word1 & 0xFF); } } Trzeba pamiętać, że argument c zawie- ra kod ASCII znaku, a tablica z wzorcami znaków zaczyna się od znaku spacji. Z tego powodu, od kodu zawartego w zmiennej c trzeba odjąć 0x20. Jednak pierwsze 8 lub 16 bajtów tablicy są zajęte na informacje o wielkości znaku i liczbie bajtów na znak. Dlatego od kodu ASCII odejmuje się war- tość 0x1F. Na rysunku 24 pokazano przykład wy- świetlania znaku ?E? o wielkości 8×8 pik- seli, od współrzędnej (20, 20). Najpierw definiujemy obszar 8×8 pikseli od współ- rzędnych początkowych komendami PA- SET i CASET: WriteSPICommand (PASET); WriteData(20); WriteData(27); //limit 20,27 WriteSPICommand (CASET); WriteData(20); //limit 20,27 WriteData(27); W  czasie wpisywania danych licz- nik kolumn jest inkrementowany i  kiedy osiągnie wartość 27 zostanie wyzerowany, a zwiększy się zawartość licznika wierszy. W ten sposób po wpisaniu 64 słów 12-bito- wych wyświetlony zostanie znak ?E?. Trze- ba wpisać 64 słowa, bo każdy bajt z genera- tora odpowiada 8 pikselom, a bajtów jest 8. Po analizie list.  8 można zauważyć, że napisanie uniwersalnej procedury wy- świetlania znaków alfanumerycznych nie jest banalne. Jeżeli dołączymy do tego ko- nieczność zdefiniowania wzorów znaków w tablicy generatora znaków, to okaże się, że trzeba wykonać niemałą pracę tylko dla samego wyświetlania napisów. Jednak war- to to zrobić dobrze, bo z mojego doświad- czenia wynika, że wyświetlanie tekstów to najczęściej wykorzystywana funkcja w ob- słudze wyświetlaczy graficznych. Funkcję wyświetlania pojedynczego znaku użyjemy do napisania funkcji wy- świetlającej napisy (listing 9). Jej argumen- tami są: wskaźnik do początku tablicy z na- pisem, współrzędne x, y, wielkość znaku i kody koloru znaku oraz tła. Wyświetlanie pełnowymiarowych bit- map jest bardzo proste pod warunkiem, że mamy przygotowaną przez odpowied- ni program tablicę z  zapisanymi 8-bito- wymi danymi RGB dla każdego z  pikseli lub tablicę, w  której na trzech bajtach są zapisane dwa piksele. W  zasadzie zapisy- wanie bitmapy niewiele różni się od czysz- czenia ekranu. Zamiast wpisywania stałej wartości koloru czyszczenia zapisuje się do pamięci dane z tablicy bitmapy. Na li- stingu 10 pokazano wyświetlanie bitmapy w trybie koloru 8-bitowego. Podsumowanie Przedstawione w  artykule informacje pozwalają na użycie wyświetlacza od te- lefonu Nokia 6100 ze sterownikiem Epson S1D15G00. Programowanie sterownika NXP PCF8833 jest podobne, a  nawetnie prostsze. W przyszłości postaram się uzu- pełnić opis sterowania wyświetlaczem z tym sterownikiem Tomasz Jabłoński, EP tomasz.jablonski@ep.com.pl
Artykuł ukazał się w
Sierpień 2010
DO POBRANIA
Pobierz PDF Download icon

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik kwiecień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio marzec - kwiecień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje marzec 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna kwiecień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich kwiecień 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów