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