Sterowanie wskaznikami LCD - sterownik cz2.pdf

(73 KB) Pobierz
Sterowanie wskaźnikami ciekłokrystalicznymi. Sterownik wyświetlacza graficznego, część 2
S P R Z Ę T
Sterowanie wskaźnikami
ciekłokrystalicznymi
Sterownik wyświetlacza graficznego, część 2
W†drugiej czÍúci artyku³u
poúwiÍconego sterowaniu
graficznego wyúwietlacza LCD
prezentujemy listÍ rozkazÛw
kontrolera HD61830B oraz
algorytm rysowania figur
geometrycznych.
Programowanie uk³adu
HD61830B
Uk³ad HD61830B programowany jest za
pomoc¹ rejestru instrukcji (IR) oraz ogÛlne-
go rejestru danych wejúcia/wyjúcia (DIOR).
DostÍpnych jest 13 dwubajtowych rozka-
zÛw. Rozkazy do kontrolera przesy³ane s¹
w†dwu kolejnych cyklach. Pierwszy zapis
do rejestru IR specyfikuje kod rozkazu oraz
numer jednego z†13 wewnÍtrznych rejest-
rÛw danych. W†drugim cyklu zapisu do (lub
odczytu z) rejestru DIOR informacja zostaje
przes³ana do (odczytana z) wybranego re-
jestru wewnÍtrznego. Pe³na lista rozkazÛw
kontrolera HD61830B zestawiona jest w† tab.
1 . W†dalszej czÍúci przedstawiony jest szcze-
gÛ³owy opis poszczegÛlnych rozkazÛw.
Hp =6, dla szerokoúci 6†punktÛw,
Hp =7, dla szerokoúci 7†punktÛw,
Hp =8, dla szerokoúci 8†punktÛw.
W†trybie graficznym Hp okreúla ile bitÛw
z†bajtu ma byÊ wyúwietlanych ( Hp =8: ozna-
cza wszystkie bity).
Set number of characters.
Kod 0x02
Rozkaz ì Set number of characters î ustala
iloúÊ znakÛw wyúwietlanych w†linii w†try-
bie tekstowym lub iloúÊ bajtÛw (1 bit od-
powiada 1†punktowi) przypadaj¹cych na
jedn¹ linie w†trybie graficznym.
Set number of time division.
Kod 0x03
Parametr ì Time division î jest odwrotnoú-
ci¹ wielkoúci duty ratio (cykl wype³nienia)
charakteryzuj¹c¹ konkretny wyúwietlacz.
Dla wskaünika LMG640X duty ratio wynosi
1/128, st¹d Nx=128.
Mode control. Kod 0x00
Rozkaz ì Mode control î ustala sposÛb pra-
cy wskaünika (D1=0: tryb tekstowy, D1=1:
tryb graficzny). W†trybie tekstowym ustawia
siÍ atrybuty kursora (D2=0: kursor wy³¹czo-
ny, D2=1: kursor w³¹czony), mruganie zna-
ku pod kursorem (D3=0: znak nie mruga-
j¹cy, D3=1: znak mrugaj¹cy), wewnÍtrzny
(D0=0) lub zewnÍtrzny (D0=1) generator zna-
kÛw. ZarÛwno w†trybie tekstowym jak i†gra-
ficznym wskaünik moøna zgasiÊ (D5=0:
wskaünik w³¹czony, D5=1: wskaünik wy³¹-
czony). Bit D4 umoøliwia konfiguracjÍ ste-
rownika wskaünika w†ktÛrej wykorzystuje
siÍ dwa rÛwnolegle pracuj¹ce kontrolery
HD61830. W†przypadku stosowania poje-
dynczego kontrolera D4=1.
Set cursor position. Kod 0x04
Parametr ì Cursor position î waøny jedy-
nie w†trybie tekstowym ustala numer wier-
sza w†matrycy znaku gdzie wyúwietlany bÍ-
dzie kursor. Dla przyk³adu w†matrycy 5x7
kursor wyúwietlany bezpoúrednio pod zna-
kiem ustala siÍ przez Cp =8.
Set display start low address.
Kod 0x08
Set display start high address.
Kod 0x09
Rozkazy ì Set display address î ustalaj¹
odwzorowanie lewego gÛrnego rogu wskaü-
nika (pozycja Home) na pamiÍÊ RAM ek-
ranu. W†trybie graficznym adres ten sk³ada
siÍ 16 bitÛw. W†trybie tekstowym waøne s¹
jedynie bity D3..D0 starszego bajtu i†wszys-
tkie bity m³odszego.
Set character pitch. Kod 0x01
Rozkaz ì Set character pitch î dla trybu
tekstowego ustala rozmiary, wraz z†margi-
nesami, drukowanego znaku. WartoúÊ Vp,
istotna jedynie w†trybie tekstowym, ozna-
cza wysokoúÊ znaku a† Hp jego szerokoúÊ.
Moøliwe s¹ jedynie trzy wartoúci Hp :
Set cursor low address.
Kod 0x0a
Set cursor high address.
Kod 0x0b
Rozkazy ìSet cursor addressî ustalaj¹ ad-
res kursora w†pamiÍci RAM. Kolejne zapisy
(lub odczyty z) pamiÍci dokonywane bÍd¹
do (lub z) lokacji ustalonej przez po³oøenie
kursora. Producent zaleca aby adres kursora
by³ ustawiany w†kolejnoúci: najpierw m³od-
szy a†po tym starszy bajt.
Tab. 1. Lista rozkazów kontrolera HD61830B.
rozkaz
IR
DIOR
D7 D6 D5 D4 D3 D2 D1 D0
Mode control
0x00
0
0 dis ms blk cur gr cg
Set character pitch
0x01
(Vp−1)
0 (Hp−1)
Set number of chars 0x02
0
(Hn−1)
Set number of divs
0x03
0
(Nx−1)
Set cursor pos
0x04
0
0
0
0 (Cp−1)
Set disp addr low
0x08
(address)
Set disp addr high
0x09
(address)
Set cursor addr low
0x0a
(address)
Write display data. Kod 0x0c
Read display data. Kod 0x0d
Rozkazy ì Write/Read display data î s³uø¹
do zapisu/odczytu kodu znaku (w trybie
tekstowym) lub bajtu (w trybie graficznym).
Po wykonaniu rozkazu adres kursora jest
automatycznie zwiÍkszany o†1.
Set cursor addr high 0x0b
(address)
Write display data
0x0c (char/data)
Read display data
0x0d (char/data)
Clear bit
0x0e
0
0
0
0 0 (Nb−1)
Set bit
0x0f
0
0
0
0 0 (Nb−1)
Read busy flag
Elektronika Praktyczna 11/99
99
30567836.001.png
S P R Z Ę T
Clear bit. Kod 0x0e
Set bit. Kod 0x0f
Rozkazy ì Set/Clear bit î umoøliwiaj¹ ma-
nipulacjÍ pojedynczymi punktami na ekra-
nie. WartoúÊ Nb ustala pozycjÍ bitu w†bajcie
( Nb =1 odpowiada D0, Nb =8 odpowiada D7).
Po wykonaniu rozkazu adres kursora jest
automatycznie zwiÍkszany o†1.
TrochÍ rachunku
rÛøniczkowego
Nawet najwspanialszy wskaünik graficz-
ny bÍdzie ma³o uøyteczny jeúli nie bÍdzie-
my w†stanie generowaÊ na nim obrazÛw
graficznych. Aby mÛc praktyczne korzystaÊ
z†moøliwoúci graficznych potrzebne s¹ przy-
najmniej funkcje rysuj¹ce pojedynczy punkt,
liniÍ, prostok¹t i†okr¹g lub elipsÍ.
Podstawow¹ funkcj¹ graficzn¹ biblioteki
obs³ugi wskaünika LMG640X jest funkcja
lcgputpixel() umoøliwiaj¹ca w³¹czenie lub
zgaszenie dowolnego punktu na wskaüniku.
Punktem wyjúcia umoøliwiaj¹cym analizÍ
dzia³ania wszystkich funkcji graficznych jest
sposÛb w†jaki kontroler HD61830B odwzo-
rowuje wewnÍtrzny RAM na ekran. Lewy
gÛrny rÛg ekranu odpowiada najstarszemu
bitowi pierwszej komÛrki pamiÍci RAM. Ko-
lejne bity odwzorowuj¹ kolejne punkty na
ekranie. Na kaødy wiersz wskaünika w†try-
bie graficznym przypada 30 kolejnych baj-
tÛw. Logiczn¹ organizacjÍ ekranu przyjmu-
jemy podobnie jak na ekranie komputera PC
jako czwart¹ ÊwiartkÍ uk³adu wspÛ³rzÍd-
nych. Oú X†skierowana bÍdzie w†prawo zaú
oú Y†od punktu HOME w†dÛ³. Przy tak
przyjÍtym uk³adzie odniesienia punkt
o†wspÛ³rzÍdnej (x, y) odpowiadaÊ bÍdzie
bajtowi o†adresie: loc=(240*y+x)/8 i†bitowi
w†bajcie loc o†numerze pixel=(240*y+x)%8.
Maj¹c wartoúci loc i † pixel , rozkazami ì Set
cursor address î ustalamy adres bajtu a†roz-
kazami ì Set/Clear bit î w³¹czamy lub gasi-
my ø¹dany punkt na ekranie.
Maj¹c moøliwoúÊ kontroli dowolnego
punktu na ekranie moøemy juø kreúliÊ linie
i†okrÍgi. Rysowanie linii pionowych i†po-
ziomych jest trywialne. Wystarczy w†pÍtli
zmieniaÊ jedn¹ z†wspÛ³rzÍdnych i†rysowaÊ
kolejne punkty. Problem pojawia siÍ w†przy-
padku gdy zamierzamy narysowaÊ liniÍ pod
dowolnym k¹tem. Oczywiúcie moøna tÍ li-
niÍ rysowaÊ wprost korzystaj¹c z†ogÛlnego
wzoru funkcji liniowej: y=a*x+b, gdzie
a†i†b†s¹ sta³ymi a†x†zmienn¹ i†y†oczekiwan¹
wartoúci¹ funkcji. Niestety powyøszy spo-
sÛb jest ma³o efektywny i†w†rezultacie, ze
wzglÍdu na zaokr¹glenia, da nam poszar-
pan¹, a†co najwaøniejsze nieci¹g³¹ liniÍ.
Znacznie efektywniejszym i†elegantszym
rozwi¹zaniem jest uøycie algorytmu nume-
rycznego.
Podstaw¹ wszelkich metod numerycznych
jest zasada obliczania kolejnej wartoúci fun-
kcji w†oparciu o†wartoúÊ poprzedni¹ i†usta-
lony ma³y krok:
1. ustalamy wartoúci pocz¹tkowe (krok,
zmienna, wartoúÊ),
2. obliczamy kolejn¹ wartoúÊ,
3. zwiÍkszamy zmienn¹ o†wartoúÊ kroku,
4. przechodzimy do punktu 2.
W†przypadku kreúlenia figur na ekranie
krok bÍdzie mia³ wartoúÊ 1†(1 punkt)
a†wspÛ³rzÍdne bÍd¹ siÍ zmienia³y w†zakre-
sie <0, x, 240) i†<0, y, 128). Zauwaømy, øe
ekran moøemy potraktowaÊ jako prostok¹t-
n¹ siatkÍ z†punktami na ekranie odpowia-
daj¹cymi przeciÍciom linii siatki. Na tak
rozumiany ekran moøemy na³oøyÊ hipote-
tyczn¹ liniÍ (y=a*x+b) do wykreúlenia.
Oczywistym jest, øe na ekranie mog¹ po-
jawiÊ siÍ jedynie punkty wynikaj¹ce z†prze-
ciÍcia siÍ linii siatki a†nie wynikaj¹ce z†rÛw-
nania linii. Prezentowany algorytm Bresen-
hamía dzia³a w†ten sposÛb, øe obliczaj¹c
wartoúÊ funkcji (y) dla kolejnego punktu (x)
Read busy flag
Rozkaz ì Read busy flag î umoøliwia
sprawdzenie stanu zajÍtoúci kontrolera. Roz-
kaz wykonywany jest przez bezpoúrednie
odczytanie bajtu z†rejestru rozkazÛw IR . Bit
D7=1 oznacza, øe kontroler jest w†trakcie
wykonywania poprzedniego rozkazu i†nie
moøe otrzymaÊ ani nastÍpnego rozkazu ani
danej bÍd¹cej czÍúci¹ rozkazu.
Rys. 4.
dokonywane jest porÛwnanie z†najbliøszy-
mi punktami siatki. W†zaleønoúci od odleg-
³oúci od siatki punkt rysowany jest bliøej
gÛrnego (A) lub dolnego (B) wiersza tak jak
pokazane jest to na rys. 3. RÛwnanie linii
y=a*x+b moøna przekszta³ciÊ do postaci nu-
merycznej: y=(dy/dx)*x+b, gdzie dy/dx
oznacza tangens nachylenia linii (dy=y2-y1
i†dx=x2-x1). RÛønicÍ odleg³oúci pomiÍdzy
prawdziw¹ wartoúci¹ funkcji w†punkcie
x†((dy/dx)*x+b) a†punktami A†(y+1) i†B†(y)
moøna wyraziÊ jako: d(x)=a-b=2*(dy/dx)*x
- 2*y -1.
Istot¹ algorytmu Bresenhamía nie jest ob-
liczanie bezwzglÍdnej wartoúci odleg³oúci
(d(x)) od siatki w†punkcie x†ale rÛønicy
w†stosunku do odleg³oúci obliczonej w†po-
przednim punkcie (d(i)-d(i-1)). Jeúli wzglÍd-
na rÛønica jest wiÍksza od 0†punkt umiesz-
czamy w†A†w†przeciwnym razie w†B. W†po-
dobny sposÛb dzia³a algorytm rysowania
elipsy (lub okrÍgu jeúli przyjmiemy rÛwne
pÛ³osie). Co wiÍcej ze wzglÍdu na symetriÍ
elipsy wystarczy obliczyÊ jedynie wspÛ³-
rzÍdne dla pierwszej Êwiartki, a†nastÍpnie
symetrycznie w†pozosta³ych Êwiartkach
umieúciÊ punkty na ekranie. Mimo iø al-
gorytmy rysowania linii i†elipsy wygl¹daj¹
na skomplikowane ich praktyczna realizacja
w†funkcjach lcgline() i † lcgellipse() jest sto-
sunkowo prosta.
Konfiguracja wskaünika
LMG640X
Jak widaÊ z†powyøszego opisu konfigura-
cja wskaünika sprowadza siÍ do obliczenia
kilku parametrÛw a†nastÍpnie wpisania ich
do rejestrÛw wewnÍtrznych kontrolera. Do-
konajmy wszystkich obliczeÒ zarÛwno dla
trybu tekstowego jak i†graficznego. Aby usta-
wiÊ w³¹czony wskaünik w†trybie tekstowym,
z†wewnÍtrznym generatorem znakÛw,
z†mrugaj¹cym i†w³¹czonym kursorem nale-
øy ustawiÊ s³owo kontrolne na 0x3C. Usta-
wienie trybu graficznego z†wy³¹czonym kur-
sorem uzyskamy programuj¹c rejestr mode
na 0x32.
Za³Ûømy, øe w†trybie tekstowym stoso-
waÊ bÍdziemy matrycÍ 6x8 (znak 5x7 oraz
jednopunktowy margines), wtedy Vp=8,
Hp=6. Jeúli przyjmiemy dodatkowo, øe kur-
sor umieúcimy w†ostatniej linii matrycy zna-
kÛw to Cp=8. Jeúli w†trybie graficznym zmie-
rzamy odwzorowywaÊ kaødy bit bajtu z†pa-
miÍci RAM musimy przyj¹Ê Hp=8.
Przyjmuj¹c szerokoúÊ znaku jako Vp =6 to
w†linii moøemy wyúwietliÊ Hn =240/ Hp =40
znakÛw. W†trybie graficznym na jedn¹ liniÍ
bÍdzie przypadaÊ Hn =240/ Hp =30 bajtÛw.
WartoúÊ Nx dla wskaünika LMG640X z†da-
nych katalogowych producenta przyjmuje-
my jako Nx =128. Jako lokacjÍ Home najwy-
godniej bÍdzie przyj¹Ê pocz¹tek pamiÍci
RAM to jest adres 0. W† tab. 2 zebrane s¹
przyk³adowe parametry konfiguracyjne za-
rÛwno dla trybu tekstowego jak i†graficzne-
go.
Przyk³ad programu obs³ugi
wskaünika
Obs³uga wskaünika LMG640X sprowadza
siÍ do jego inicjacji do trybu tekstowego lub
graficznego. Po inicjacji wskaünik gotowy
jest do pracy. Przyk³ad programu przedsta-
wiony w†list. 2†(EP10/99) rysuje na ekranie
dwa prostok¹ty, dwie linie ukoúne po czym
wrysowuje we wskaünik elipsÍ i†okr¹g.
Janusz J. Młodzianowski
Karta katalogowa (PDF) sterownika
HD61830 jest dostÍpna pod adresem http:/
/www.ep.com.pl/ftp/lcdgraf.pdf.
Tabela 2. Przykładowe parametry
konfiguracyjne wskaźnika LMG640X.
rozkaz
tryb tryb
tekstowy graficzny
Mode control
0x3C
0x32
Set character pitch
0x75
0x77
Set number of chars
0x27
0x1D
Set number of divs
0x7F
0x7F
Set cursor pos
0x07
Set disp addr low
0x00
0x00
Set disp addr high
0x00
0x00
100
Elektronika Praktyczna 11/99
30567836.002.png 30567836.003.png
Zgłoś jeśli naruszono regulamin