Wyświetlacz telefonu Nokia 6100. Obsługa sterownika Epson S1D15G00
Niedziela, 01 Sierpień 2010
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
Zobacz więcej w kategorii Notatnik konstruktora