S P R Z T
Sterowanie wskaznikami
ciekłokrystalicznymi
Sterownik wyświetlacza graficznego
W drugiej czści artykułu o wskanikach Znaki o kodach powyłej 128, podobnie jak
W drugiej czści artykułu
ciekłokrystalicznych zajmiemy si obsługą w przypadku kontrolera HD44780, zawiera-
poświconego wyświetlaczom LCD
graficznych. Wyświetlaczegraficzneskładają ją wybr glifw Kata-kana i greckich. Ste-
omawiamy zagadnienia związane
siz dwuwymiarowej matrycy punktw,kt- rownik wyświetlacza LMG640X posiada
ze sterowaniem wyświetlaczy
reindywidualniesterowane umołliwiają wy- rwnieł zintegrowaną pamiĘ RAM
graficznych. Ze wzgldu na
świetlanie nie tylko kilku lub kilkunastu o pojemności 8kB. Cały moduł ma wymiary
znaczną objtośĘ artykułu, jego wierszy tekstu, ale rwnieł obrazw graficz- 159x101x9,5mm z ekranem 126x71mm
nych. Nowoczesne moduły graficzne dorw- i kwadratowym punktem o rozmiarze
dokoczenie przedstawimy za
nująrozdzielczością kartomgraficznymtypu 0,47mm.
miesiąc.
SVGA i 15" monitorom kolorowym. Do za- Wyświetlaczoprczsygnałwsterujących
stosowa kontrolno-pomiarowych w zupeł- wymaga dwu napiĘ zasilających oraz na-
ności wystarczą małe jednokolorowe picia sterującego kontrastem. Do zasilania
wyświetlaczeo rozdzielczościrzdu100x100 czścicyfrowej wyświetlaczastosujesi na-
punktw. picie +5V, natomiast do zasilania matrycy
Istotną, praktyczną wadą dostpnych mo- LCD wymagane jest stałe napicie -15V.
dułw wyświetlaczy jest koniecznośĘ sto- Napicie sterujące kontrastem uzyskuje si
sowania skomplikowanych układw steru- z suwaka potencjometru o wartości
jących. Obraz na wyświetlaczu ciekłokrys- 10..20k&!. Sposb podłączenia napiĘ zasi-
talicznym, przechowywany w pamici lających wyświetlacz i potencjometru kon-
obrazu RAM, podobnie jak w zwykłym mo- trastu przedstawiony jest na rys. 1.
nitorze komputerowym generowany jest li- W przypadku sterowania wskanikiem
niami. W zalełnościodkonstrukcji wyświe- z płyty głwnej komputera PC uzyskanie
tlacza mołliwe jest jednoczesne odświeła- napicia-15V niejest wprost mołliwe. Prze-
niekilkusekcjiekranu. Niestety producenci prowadzone prby pokazały jednak, łe
wyświetlaczy graficznych stosują indywi- wyświetlacz działa poprawnie, gdy polary-
dualne specyfikacje do swoich produktw, zuje si go dostpnym z zasilacza napi-
co wicej, informacje te przynajmniej do ciem -12V. Sygnały sterujące sterownikiem
niedawna były skrztnie ukrywane, co nie wyś-wietlacza LMG640X wyprowadzone są
ułatwiało indywidualnym konstruktorom na 20-stykowe złącze, do ktrego mołna
łycia. podlutowaĘ pojedynczą szyn z kołkami
Obecnie dostpnesą narynku dwiekategorie Berga i złączem do kabla wstgowego.
modułw:sterowaneszeregowoi z zintegrowa-
ną elektroniką. Moduły sterowane szeregowo Interfejs układu HD61830B
są znacznie tasze, ale - jak wcześniej wspo- Podobniejak w przypadku wcześniej opi-
mniano- wymagajązewntrznych układwste- sywanego układu HD44780,interfejs układu
HD61830B przeznaczony jest do bezpośred-
rujących. Do szybkich zastosowa, w ocenie
piszącego te słowa, nadają si jedynie wska- niej wspłpracy z szyną procesorw 6502/
6800. Podobne są wic sekwencje sygnałw
niki zintegrowane z elektroniką sterującą.
sterujących. Procedura zapisu do układu
W skład układusterującego wyświe-tlaczem
HD61830rozpoczynasiod ustawienialinii
wchodzi kontroler, sterowniki linii i kolumn
RS (RS=1, dane lub RS=0, rozkaz) i linii R/
samej matrycy graficznej oraz pamiĘ RAM
ekranu. Jako kontroler zintegrowanych ste- W (R/W=0, zapis lub RW=1, odczyt).
Kałdy cykl rozpoczyna si rosnącym zbo-
rownikw najczściej stosuje si układ
HD61830B (lub zgodny) firmy Hitachi. Do- czem sygnału zezwalającego E. Dane do re-
jestru wewntrznego wpisywane są zboczem
stpne są rwnieł inne interesujące
układyjak na przykład HD63645, kt- opadającym E. Podobnie cykl odczytu inicjo-
wany jest ustawieniem linii RS i R/W, a sam
ry całkowicie emuluje MC6845, czyli
klasycznysterownikterminalialfanu- odczyt dokonywany jest w czasie aktywności
linii E. Wyświetlacz LMG640X, oprcz przed-
merycznych i graficznych.
stawionych sygnałw RS, RW i E, dodatkowo
W dalszej czści opracowania
przedstawiony zostanie sposb ob- posiada wejście wybierające CS (CS=0: układ
aktywny, CS=1: układ nieaktywny)orazsygnał
sługi sterownika wyświetlacza
zerowania RES(RES=0-zerowanie kontrolera,
LMG6400PLGR firmy Hitachi.
RES=1- wkład pracuje). Podobniejak w przy-
Wyświetlacze z serii LMG640X
padku kontrolera HD44780 obowiązują ogra-
posiadają zintegrowany sterownik
HD61830Bi umołliwiają wyświetla- niczenia dynamicznecyklw dostpu. Sygnały
nie w trybie tekstowym do 40 zna- CS, RS i RW muszą byĘ stabilne na co naj-
kw w 16 wierszach lub jednokolo- mniej 140ns przed pojawieniemsirosnącego
zbocza E. Czas trwania aktywności sygnału
rowejgrafikio rozdzielczości240 na
128 punktw. Wewntrzny genera- E nie mołe byĘ krtszy nił 450ns, a cały cykl
zapisu lub odczytu musi trwaĘ co najmniej
tor znakw umołliwia wyświetlanie
1s.
do 160 glifw na matrycy 5x7 lub
32 na matrycy 5x11. Generator zna- Przebiegiczasowecyklwzapisui odczy-
tu przedstawione na rys. 2 i 3 realizowane
kw jest zgodny z ASCII (ISO646).
Rys. 1.
Elektronika Praktyczna 10/99
93
S P R Z T
Listing 1. Kod zródłowy biblioteki HD61830.h
lcgwait();
/*********************************************************
outportb(PORTB,LCGDATA|LCGWR|LCGDIS);
* HD61830.h
outportb(PORTB,LCGDATA|LCGWR|LCGEN);
* biblioteka obsługi HD61830 za pośrednictwem PPI 8255
outportb(PORTA,value);
*
delay(EDELY);
* wykorzystywane linie 8255:
outportb(PORTB,LCGDATA|LCGWR|LCGDIS);
* PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 tryb 2 dwukierunkowy
}
* D7 D6 D5 D4 D3 D2 D1 D0
*
/******************************************************
* PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 tryb 0 wyjście
* cykl odczytu pamięci VRAM
* x x x res cs rs rw e
******************************************************/
*
char lcgin(void)
* PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 (*) zarezerwowane
{
* * * * * * x x x
char tmp;
*
* (c) Janusz J. Młodzianowski
lcgwait();
*********************************************************/
outportb(PORTB,LCGCMD|LCGWR|LCGDIS);
#include
outportb(PORTB,LCGCMD|LCGWR|LCGEN);
#include
outportb(PORTA,LCGRDATA);
#include
delay(EDELY);
outportb(PORTB,LCGCMD|LCGWR|LCGDIS);
/* konfiguracja 8255 */
#define BASE 0x300
lcgwait();
#define PORTA BASE
outportb(PORTB,LCGDATA|LCGRD|LCGDIS);
#define PORTB BASE+1
outportb(PORTB,LCGDATA|LCGRD|LCGEN);
#define PORTC BASE+2
delay(EDELY);
#define PORTR BASE+3
tmp=inportb(PORTA);
#define MODE8255 0xC9
outportb(PORTB,LCGDATA|LCGRD|LCGDIS);
return(tmp);
/* sterowanie interfejsem HD61830*/
}
#define LCGRESET 0x0c /* res=0 */
#define LCGDATA 0x10 /* rs=0 */
/*********************************************************
#define LCGCMD 0x14 /* rs=1 */
* inicjacja trybu tekstowego
#define LCGRD 0x12 /* rw=1 */
*********************************************************/
#define LCGWR 0x10 /* rw=0 */
void lcgtext(void)
#define LCGEN 0x11 /* e=1 */
{
#define LCGDIS 0x10 /* e=0 */
outportb(PORTR,MODE8255); /* ustawienie 8255*/
outportb(PORTB,LCGRESET); /* reset kontrolera */
#define EDELY 1
delay(10);
/* min 540ns */
outportb(PORTB,LCGCMD|LCGWR|LCGDIS);
/* rozkazy HD61830 */
lcgout(SETLCGMODE,0x3c); /* tryb tekstowy*/
#define SETLCGMODE 0x00
lcgout(SETCHPITCH,0x75); /* znak 5x7*/
#define SETCHPITCH 0x01
lcgout(SETCHARNUM,39); /* 40 znaków/wiersz*/
#define SETCHARNUM 0x02
lcgout(SETTIMEDIVS,127); /* cykl wypełnienia*/
#define SETTIMEDIVS 0x03
lcgout(SETCURSPOS,7); /* położenie kursora*/
#define SETCURSPOS 0x04
lcgout(SETHOMLADDR,0); /* adres HOME */
#define SETHOMLADDR 0x08
lcgout(SETHOMHADDR,0);
#define SETHOMHADDR 0x09
lcgout(SETCURLADDR,0); /* kursor w HOME*/
#define SETCURLADDR 0x0a
lcgout(SETCURHADDR,0);
#define SETCURHADDR 0x0b
lcgtxtcls();
#define LCGWRDATA 0x0c
}
#define LCGRDATA 0x0d
#define LCGCLEARBIT 0x0e
/*********************************************************
#define LCGSETBIT 0x0f
* inicjacja trybu graficznego
*********************************************************/
/* parametry trybu tekstowego */
void lcdgraph(void)
#define CURSORON 0x14
{
#define BLINK 0x18
int i;
#define DISPON 0x30
#define MODEGRAPH 0x12
outportb(PORTR,MODE8255); /* ustawienie 8255*/
outportb(PORTB,LCGRESET); /* reset kontrolera*/
/* prototypy funkcji */
delay(10);
void lcgwait(void);
outportb(PORTB,LCGCMD|LCGWR);
void lcgout(int where, int value);
char lcgin(void);
lcgout(SETLCGMODE,0x32); /* tryb graficzny*/
void lcgtext(void);
lcgout(SETCHPITCH,0x77); /* 8 punktów z bajtu*/
void lcdgraph(void);
lcgout(SETCHARNUM,29); /* 30 bajtów/linia*/
void lcgtxtcls(void);
lcgout(SETTIMEDIVS,127); /* cykl wypełnienia*/
void lcggraphcls(void);
lcgout(SETHOMLADDR,0); /* adres HOME*/
void lcggotoxy(int x,int y);
lcgout(SETHOMHADDR,0);
void lcgputc(char c);
lcgout(SETCURLADDR,0); /* kursor w HOME*/
void lcgputs(char *s);
lcgout(SETCURHADDR,0);
void lcgline(int x1,int y1,int x2,int y2,int c);
lcggraphcls();
void lcgrectangle(int x1,int y1,int x2,int y2,int c);
}
void lcgellipse(int xc,int yc,int a0,int b0,int c);
void lcgcircle(int x,int y,int r,int c);
/*********************************************************
* kasowanie ekranu tekstowego
/******************************************************
*********************************************************/
* oczekiwanie na zwolnienie kontrolera
void lcgtxtcls(void)
******************************************************/
{
void lcgwait(void)
int i;
{
char busy;
lcgout(SETCURLADDR,0); /* HOME*/
lcgout(SETCURHADDR,0);
outportb(PORTB,LCGCMD|LCGRD|LCGDIS);
for(i=0;i<16*40;i++) lcgout(LCGWRDATA,0);
do{
lcgout(SETCURLADDR,0); /* HOME*/
outportb(PORTB,LCGCMD|LCGRD|LCGEN);
lcgout(SETCURHADDR,0);
delay(EDELY);
}
busy=inportb(PORTA)&0x80;
outportb(PORTB,LCGCMD|LCGRD|LCGDIS);
/*********************************************************
delay(EDELY);
* kasowanie ekranu graficznego
}while(busy);
*********************************************************/
}
void lcggraphcls(void)
{
/******************************************************
int i;
* cykl zapisu
******************************************************/
lcgout(SETCURLADDR,0); /* HOME*/
void lcgout(int where, int value)
lcgout(SETCURHADDR,0);
{
for(i=0;i<240*128/8;i++) lcgout(LCGWRDATA,0);
lcgwait();
lcgout(SETCURLADDR,0); /* HOME*/
outportb(PORTB,LCGCMD|LCGWR|LCGDIS);
lcgout(SETCURHADDR,0);
outportb(PORTB,LCGCMD|LCGWR|LCGEN);
}
outportb(PORTA,where);
delay(EDELY);
/*********************************************************
outportb(PORTB,LCGCMD|LCGWR|LCGDIS);
* ustawienie kursora tekstowego w x,y
Elektronika Praktyczna 10/99
94
S P R Z T
*********************************************************/
void lcggotoxy(int x,int y)
/*********************************************************
{
* rysowanie prostokąta
int n=40*y+x;
*********************************************************/
void lcgrectangle(int x1,int y1,int x2,int y2,int c)
lcgout(SETCURLADDR,n&0xff);
{
lcgout(SETCURHADDR,n>>8);
lcgline(x1,y1,x2,y1,c);
}
lcgline(x1,y2,x2,y2,c);
lcgline(x1,y1,x1,y2,c);
/*********************************************************
lcgline(x2,y1,x2,y2,c);
* zapisanie znaku na ekran tekstowy
}
*********************************************************/
void lcgputc(char c)
/*********************************************************
{
* funkcja pomocnicza grafiki
lcgout(LCGWRDATA,c);
*********************************************************/
}
void swap(int *a,int *b)
{
/*********************************************************
int c;
* zapis ciągu znaków na ekran tekstowy
*********************************************************/
c=*a;
void lcgputs(char *s)
*a=*b;
{
*b=c;
while(*s) lcgout(LCGWRDATA,*s++);
}
}
/*********************************************************
/*********************************************************
* funkcja pomocnicza grafiki
* ustawianie/kasowanie punktu na ekranie graficznym
*********************************************************/
*********************************************************/
void lcg4pixels(int x,int y,int xc,int yc,int c)
void lcgpixel(int x,int y,int c)
{
{
lcgpixel(xc+x,yc+y,c);
int loc;
lcgpixel(xc-x,yc+y,c);
char pixel;
lcgpixel(xc+x,yc-y,c);
lcgpixel(xc-x,yc-y,c);
loc=(y*240+x)/8;
}
/* adres w VRAM*/
pixel=(y*240+x)%8; /* numer bitu*/
/*********************************************************
* rysowanie elipsy, algorytm Bresenham'a
lcgout(SETCURLADDR,loc&0xff); /* ustawienie kursora*/
*********************************************************/
lcgout(SETCURHADDR,loc>>8);
void lcgellipse(int xc,int yc,int a0,int b0,int c)
if(c==0)
{
lcgout(LCGCLEARBIT,pixel);
int x=0;
else
int y=b0;
lcgout(LCGSETBIT,pixel);
float a=a0;
}
float b=b0;
float asqr=a0*a0;
/*********************************************************
float twoasqr=2*a0*a0;
* rysowanie linii, algorytm Bresenham'a
float bsqr=b0*b0;
*********************************************************/
float twobsqr=2*b0*b0;
void lcgline(int x1,int y1,int x2,int y2,int c)
float d=bsqr-asqr*b+asqr/4;
{
float dx=0;
int d,dx,dy;
float dy=twoasqr*b;
int ainc,binc,yinc;
int x,y;
while(dx lcg4pixels(x,y,xc,yc,c);
if(d>0){
if(x1>x2){
y--;
swap(&x1,&x2);
dy-=twoasqr;
swap(&y1,&y2);
d-=dy;
}
}
x++;
if(x2==x1){
dx+=twobsqr;
if(y1>y2) swap(&y1,&y2);
d=d+bsqr+dx;
for(d=y1;d }
return;
d=d+(3*(asqr-bsqr)/2-(dx+dy))/2;
}
while(y>=0){
lcg4pixels(x,y,xc,yc,c);
if(y2>y1) yinc=1; else yinc=-1;
if(d<0){
x++;
dx=x2-x1;
dx+=twobsqr;
dy=abs(y2-y1);
d+=dx;
d=2*dy-dx;
}
ainc=2*(dy-dx);
y--;
binc=2*dy;
dy-=twoasqr;
x=x1;
d=d+asqr-dy;
y=y1;
}
lcgpixel(x,y,c);
}
x=x1+1;
/*********************************************************
do{
* rysowanie okręgu
if(d>=0){
*********************************************************/
y+=yinc;
void lcgcircle(int x,int y,int r,int c)
d+=ainc;
{
}else
lcgellipse(x,y,r,r,c);
d+=binc;
}
lcgpixel(x,y,c);
}while(++x}
Listing 2. Przykład programu obsługi wskaznika LMG640X.
są za pomocą funkcji lcgwr() i lcgrd() zebranych w bibliotece
HD61830.h i przedstawionych na list. 1.
#include "HD61830,h"
Funkcja lcgwait(), wykonywana na początku cyklw dostpu,
void main(void)
sprawdza stan gotowości kontrolera. W standardowych konfigura-
{
cjach szyn ISA komputerw PC, cykle zapisu i odczytu (instrukcje
lcdgraph();
outportb i inportb) trwają 1s. Mołliwa jest wic pewna optyma-
lcgrectangle(0,0,239,127,1);
lizacjafunkcjilcgwr()i lcgrd(). Funkcje lcgwait() i delay() mogą byĘ
lcgline(1,1,239,127,1);
pominite. Powyłsza optymalizacja wymagajednak dokonania prb
lcgline(239,0,0,127,1);
lcgline(0,63,239,63,1);
na konkretnym sprzcie.
lcgline(120,0,120,127,1);
Na list. 2 znajduje si przykładowy program obsługi wskanika
lcgrectangle(80,23,160,103,1);
lcgcircle(120,63,40,1);
LMG640X. Dokładny opis sposobu programowania układu
lcgellipse(120,63,80,47,1);
HD61830B przedstawimy w nastpnej czści artykułu.
}
Elektronika Praktyczna 10/99
95
S P R Z T
Sterowanie układem HD61830B wewntrznych, to układ 8255 obsłu-
poprzez kart prototypową
giwanyjest w trybie 2. W trybie dwsu-
i układ 8255
kierunkowej magistrali danych czśĘ
Interfejs sprztowy kontrolera z kompu-
bitw PORTC słuły do obsługi szyny
terem PC w opisywanym rozwiązaniu zre-
PORTA. W szczeglności bit PC6
alizowany został za pomocą standardowej
(ACK) otwiera wyjściowy bufortrjsta-
karty prototypowej z układem PPI typu
nowy PORTA(ACK=1-buforzamkni-
8255. Łącze z komputerem mołe byĘ rw-
ty, ACK=0 - bufor otwarty). Bit PC4
niełzrealizowane, podobniejak w przypad-
(STB) spełnia rol sygnału zatrzasku-
ku kontrolera HD44780, za pomocą portu
jącegoinformacj w wejściowym bufo-
drukarkowego.
rze PORTA (aktywne zbocze opadają-
Koniecznym jednak bdzie modyfikacja
ce). Bity PC3, PC5 i PC7 są zarezer-
funkcjikomunikacyjnych. Podłączenie ukła-
wowane i mogą słułyĘ do generacji
du 8255 do komputera i jego programowa-
przerwa(PC3) oraz dodatkowegosyg-
nie było juł wielokrotnie opisywane w po-
nalizowaniastanutransmisji. Bity PC2,
przednich numerach EP (np. 3/94).
PC1 i PC0 mogą byĘ programowane
Rys. 2.
Ograniczymy wic rozwałania do najistot-
jako proste wejście lub wyście.
niejszych szczegłw. Układ peryferyjny PPI
W opisywanym interfejsie wyświe-
8255 posiada trzy 8-bitowe porty danych
tlacza PORTA steruje magistralą da-
(PORTA, PORTB i PORTC) oraz rejestr kon-
nych układu HD61380B, PORTB ste-
figuracyjny (PORTR). Nastandardowej karcie
ruje sygnałami RES, CS, RS, RW
prototypowej PPIjesttorwnowałneczterem
i E (odpowiedniobity PB4, PB3, PB2,
kolejnym lokacjom w przestrzeni adresowej
PB1 i PB0). Pozostałe bity nie są wy-
układw wejścia/wyjścia. Adres bazowy
korzystane.
(PORTA) układu 8255 zwykle ustawiony jest
W celu zapewnienia poprawnego
na wartośĘ 0x300. Aby układ mgł byĘ po-
sterowania PORTA sygnał RW dołą-
prawnie ułytkowany naleły go skonfiguro-
czonyjestbezpośrednio do ACK,a syg-
waĘ poprzez wpisanie do rejestru konfigura-
nał E do STB. Schemat interfejsu
cyjnego(PORTR,adres bazowy+3) odpowied-
wyświetlacza przedstawiony jest na
niego słowa kontrolnego. Mołliwe są trzy
rys. 1.
tryby pracy portw PPI: proste wejście/wy-
Janusz J. Młodzianowski
jście(tryb0),strobowane wejście/wyjście(tryb
1) oraz dwukierunkowa magistrala danych
Kartakatalogowa(PDF)jest dostpna
(tryb 2, jedynie dla PORTA).
podadresem http://www.ep.com.pl/ftp/
Poniewał obsługa kontrolera wymaga za-
lcdgraf.pdf
Rys. 3.
rwno zapisu do, jak i odczytu z rejestrw
Elektronika Praktyczna 10/99
96
Wyszukiwarka
Podobne podstrony:
Prosty sterownik do SAA1057 na AT89C1051 Obsluguje LCD 1x16
Obsługa wyświetlacza Lcd z układem sterowania Hd44780U
Sterowanie wskaznikami LCD sterownik cz2
programowanie sterowników wyświetlaczy LCD 2
automatyka i sterowanie wyklad
Sterownik dwubarwnych diod LED
Sterownik nadajnika do lowow na lisa
sterowniki programowalne plc, cz??? 3
Sterownik oswietlenia kabiny samochodu
Optymalne sterowanie i tradycyjny rachunek wariacyjny Dwuwymiarowe zagadnienie Newtona
PRZYCISKI STEROWANIA RT3
Moduł zdalnego sterowania PC 1
Sterowce latające dinozaury
[N16] Resetowanie sterownika airbag
więcej podobnych podstron