Jan Svenungson <jan.svenungson(at)linux.nu>
O Autorze:
Jan u�ywa GNU/Linux'a od 1996 i do tej pory mia� tylko 2 niechciane re-boot'y (nie licz�c tych z powodu braku zasilania).
T�umaczenie na j�zyk polski: :
Mariusz Koz�owski <sp3fxc/AT/linuxfocus.org>
Zawarto��:
|
Zrozumie� HD44780 i kompatybilne wy�wietlacze LCD
Notka:
Artyku� ten ma na celu nayczy� Ci� kilku rzeczy o HD44780 i kompatybilnych wy�wietlaczach LCD.
Poruszymy takie tematy jak pod��czenie wy�wietlacza do portu r�wnoleg�ego oraz jak go oprogramowa�
(na przyk�adzie ma�ego programu o nazwie LCDInfo)
Powiniene� nie tylko pod��czy� ten uk�ad, uruchomi� program i wy�wietli� par� znak�w ale tak�e zrozumie�
jak ten sprz�t pracuje i jak zmusi� go do zrobienia dok�adnie tego co chcesz.
_________________ _________________ _________________
|
Wprowadzenie
Po pierwsze, bedziesz potrzebowa� troch� sprz�tu i oprogramownia. Domy�lam si�, �e ju� masz komputer wyposa�ony w standardowy port r�wnoleg�y
(drukarki), na kt�rym masz dzia�ajac� dystrybucj� GNU/Linux wraz z gcc i glibc.
B�dziesz r�wnie� potrzebowa� wy�wietlacz LCD kompatybilny z HD44780
, kable do pod��czenia go do portu r�wnoleg�ego i potencjometr je�li chcesz mie� mo�liwo�� regulacji kontrastu.
Do zasilenia uk�adu b�dziesz prawie napewno potrzebowa� zr�d�a napiecia o wi�kszej wydajno�ci pr�dowej
ni� mo�e da� Ci port r�wnoleg�y. Najlepszym sposobem jest wzi�� je prosto z zasilacza komputera. Potrzebne b�dzie +5V
wi�c mo�na z powodzeniem u�y� standardowego +5V (tego do zasilania dysk�w twardych, stacji dyskietek, itp.).
Kiedy ju� pod��czysz wy�wietlacz LCD b�dziesz musia� wiedzie� jak to pracuje. Przewa�nie t� cz�� zostawia si� na odr�bne artyku�y
dotycz�ce danego tematu ale postaram si� przedstawi� niekt�re istotne cz�ci uk�adu, o kt�rych wiedza pomo�e Ci skutcznie go oprogramowa�.
Ostani� rzecz� jest w�a�ciwie wy�wietli� co� uzytecznego na wy�wietlaczu. Jako przyk�ad u�yj� ma�ego programu
zwanego LCDInfo kt�ry wspiera wi�kszo�� w�a�ciwo�ci uk�adu HD44780 ale nie wy�wietla za wiele jak narazie. Jest to wersja
alpha, nad kt�r� pracuj� kiedy mam czas.
Jesli nigdy nie programowa�e� w C lepiej �eby� najpierw wzi�� pod uwag� poczyta� troch� na temat C. Zak�adam, �e jeste� pocz�tkuj�cy w
C jako �e jest to m�j bie��cy poziom.
Jak to pod��czy�?
Po pierwsze,
sp�jrzmy na r�ne piny dost�pne na p�ytce z LCD i do czego w�a�ciwie s�u��.
Pin 1 -> VSS s�uzy do pod��czenia GND.
Pin 2 -> VDD s�uzy do pod��czenia zasilania do uk�adu czyli +5V.
Pin 3 -> VLC odpowiada za regulacj� kontrastu wy�wietlacza.
Pin 4 -> RS zale�nie od jego stanu wy�wietlacz oczekuje na instrukcje lub dane.
Pin 5 -> R/W stan jego decyduje czy LCD wysy�a czy odbiera.
Pin 6 -> Enable Kiedy stan tego pin'u zmienia si� z niskiego na wysoki i znowu na niski
wtedy LCD czyta pin'y 4,5 i 7-14.
Pin'y 7-14 to szyna danych oznaczona DB0-DB7. Po niej w�druj� dane
wysy�ane do LCD, kt�re kontroluj� gdzie i co ma by� wy�wietlone na wy�wietlaczu.
Pin'y 15 i 16 s� u�ywane tylko w wyswietlaczach z podswietlaniem i s� to po prostu +5V i GND z rezystorem 3.8 Ohm pomi�dzy pin'em 15 a +5V.
Aby dowiedzie� si� gdzie poweiniene� pod��czy� poszczeg�lne pin'y z portu drukarki
mo�esz pos�uzy� si� schematem po prawej stronie, na kt�rym stara�em si� wyja�ni� to tak prosto jak to mo�liwe. Kliknij na schemat aby obejre� jego wi�ksz� wersj�.
Ten schemat ma zastosowanie je�li chcesz mie� mo�liwo�� regulacji kontrastu wy�wietlacza LCD.
Ja po prostu pod��czy�em pin 3 i pin 1 do GND. Jak dla mnie pracuje to dobrze. Ale je�li masz nietypowe o�wietlenie w pomieszczeniu
mo�esz potrzebowa� wtedy potencjometra regulacji kontrastu.
B�dz ostro�ny podczas podpinania si� do zasilacza PC'ta. Je�li pod��czysz zasilanie ze z�ego przewodu to na uk�adzie mo�e si� pojawi� +12V
co z kolei usma�y Twoj wy�wietlacz LCD. W�a�ciwy kabel to ten o kolorze czerwonym. Z�ty to +12V, a czarny to GND.
Je�li zrobi�e� to poprawnie LCD powinien mie� pierwszy (i trzeci o ile istnieje) rz�d czarny kiedy w��czysz PC'ta.
Jak pracuje LCD?
LCD nie robi kompletnie nic czekaj�c a� mu nie powiesz ze ma cos zrobic.
Po prostu czeka a� wykryje zbocze narastaj�ce i opadaj�ce na sygnale enable (stanie si� to gdy ustawimy sygna� enable na wysoki,
poczekamy chwile i potem spowrotem ustawimy niski.
W tym momencie wy�witlacz odczytuje czy b�d� przesy�ane instrukcje lub dane dotycz�ce wy�wietlania,
a potem odbiera lub wysy�a informacje i ostatnie bity danych s� wysy�ane lub odbierane.
W naszym przypadku nigdy nie b�dziemy odczytywa� informacji z LCD
wi�c sygna� R/W b�dzie zawsze w stanie niskim co oznacza zapis.
Pin RS b�dzie w stanie niskim poza momentem gdy chemy wyprowadzic znaki na LCD,
a reszta b�dzie traktowana jako instrukcje.
Powoduje to bardzo prost� obs�ug� wy�wietlacza przez program.
Kiedy ju� wiemy co i jak chcemy zacz�� od w��czenia wy�wietlacza
i przygotowania go do odbioru informacji. Zaimplementowane jest to
w sekwencji incjalizacyjnej gdzie mowimy wy�wietlaczowi aby si� w��czy�.
Zasilanie powinno by� ju� dawno w��czone je�li pobieraz zasilanie z dodatkowego zr�d�a w PC. W innym przypadku jest to pierwsza rzecz jak� musisz zrobi�.
Nast�pna jest funkcja "Function set", kt�rej wygl�d zale�y od rodzaju wy�wietlacza jaki masz.
Zeby to upro�cic wyt�ymacz� dok�adnie co robimy gdy u�ywamy "function set".
DB2 to bit rodzaju czcionki, kt�ry powinien by� w stanie niskim co oznacza matryc� znaku typu 5x7.
DB3 to bit lini wy�wietlania i powinien by� w stanie wysokim
co oznacza 2 linie. A co je�li masz 4 linie na wy�wietlaczu? Nie martw si�, pierwsza i trzecia linia zajmuj� t� sam� przestrze� w pami�ci wyswietlacza
wi�c r�wnie� powiniene� u�y� stanu wysokiego.
DB4 to bit d�ugo�ci s�owa danych, kt�ry decyduje czy s�owo zawiera 4 czy 8 bit�w. Je�li pod��czysz wy�wietlacz zgodnie z moim schematem
powiniene� mie� ten bit w stanie wysokim.
Potem ustawiamy DB5 w stan wysoki aby poinformowa� wy�wietlacz, �e to co przesy�amy to rzeczywi�cie instrukcje "Function Set", a potem
upewniamy si�, �e RS i R/W s� w stanie niskim i w��czamy stan wysoki i nast�pnie niski.
Aby odpowiednio dobra� czasy zajrzyj do manuala ukladu. Zak�adami, �e ustawiamy stan wysoki (pauzujemy) na czas pojedynczych mikrosekund
gdy czekamy na reakcj� LCD co i tak jest du�o wi�ksz� warto�ci� ni� potrzebujemy.
Co z kodem?
Om�wi� tu fragmenty programy LCDInfo, kt�ry jest niezb�dny
aby zrozumie� jak pracuje interfejs uk�adu HD44780. Mo�esz
�ci�gn�� program LCDInfo klikaj�c na link na koncu artyku�u lub spojrze� bezpo�rednio na kod C iolcd.c i lcdinfo.c klikaj�c tutaj.
To czego teraz potrzebujemy to kod przedstawiony powy�ej i uwierzcie
mi kiedy mowi�, �e jest to na prawd� proste. Om�wi� kod krok po kroku
wi�c nawet je�li jeste� pocz�tkuj�cym programist� w C zrozumiesz o czym tu b�dzie mowa.
Po pierwsze za��czamy pliki nag��wkowe i definiujemy prototypy funkcji
(zajrzyj do zr�de� programu). I tu zaczyna si� zabawa.
#define D_REGISTER 0
#define I_REGISTER 2
#define WRITE_DATA 8
#define BASE 0x378
int main(void)
{
ioperm(BASE,3,1);
[CUT]
}
To pierwsza instrukcja w funkcji main, kt�ra nadaje nam uprawnienia do korzystania z portu r�wnoleg�ego.
BASE (adrez bazowy) powinien wynosi� 0x378 lub
co� ko�o tego, a "3" oznacza, �e mamy dost�p do adres�w 0x378, 0x379
i 0x380 co w praktyce obejmuje ca�y port drukarki.
Pow�d dla kt�rego s� tam 3 adresy to jego podzia� na data, status i control. Dla nas oznacza to, �e musimy
ustawi� cz�� data w pierwszej kolejno�ci potem cz�� control, a nie mo�emy wykona� tego w jednym kroku.
Nast�pnym krokiem jest zaimplementowanie funkcji "function set" opisanej powy�ej.
void function_set(void)
{
outb(56, BASE);
To ustawia nam: matryc� znaku typu 5x7, dwie linie wy�wietlacza, itp.
outb(I_REGISTER + WRITE_DATA, BASE + 2);
To ustawia sygna� RS i R/W na wysy�anie instrukcji i zapis. U�y�em dw�ch globalnych
zmiennych I_REGISTER i WRITE_DATA i wyosz� one odpowiednio 2 i 8.
Nast�pnie pojawia si� zbocze narastaj�ce i opadaj�ce na sygnale enable.
outb(ENABLE + I_REGISTER + WRITE_DATA, BASE + 2);
usleep(0);
outb(I_REGISTER + WRITE_DATA, BASE + 2);
}
To co ten kod czyni to w zasadzie ustawia 'enable' w stan wysoki, czeka i ustawia 'enable' w san niski.
Komenda usleep(0); nie jest idealna ale jecze nie sko�czy�em cz�� kodu odpowiadaj�cej za timingi wy�wietlacza.
Kilkoro z Was mo�e si� zastanawia� dlaczego ustawiam sygna�y RS i R/W
w stan wysoki kiedy mowi�em, �e powinny one by� w stanie niskim w czasie wysy�ania instrukcji.
Dzieje si� tak dlatego, �e piny 1, 14 i 17 s� sprz�towo zanegowane.
Hmmm... mowi�em, �e to b�dzie proste... nieprawda?
Jak wy�wietla� znaki?
Mo�e masz zamiar u�y� wy�wietlacza do jaki� praktycznych cel�w np.: wyswietlanie tekstu? Zaden problem.
Kod (w sensie uzytych funkcji) jest identyczny niezale�nie czy chcemy wy�wietla� znaki cz te� wysy�a� instrukcje steruj�ce wy�wietlaczem.
Jedyn� rzecz� jak� musimy zmieni� to zmiana pewnych zmiennych. Nie chcemy teraz aby sygna� RS m�wi� o wysy�aniu instrukcji tylko o wysy�aniu
danych do wy�wietlania. Powoduje to, �e funkcja print_character() wygl�da tak:
void print_character(int character)
{
outb(D_REGISTER + WRITE_DATA, BASE + 2);
outb(character, BASE);
outb(ENABLE + D_REGISTER + WRITE_DATA, BASE + 2);
usleep(0);
outb(D_REGISTER + WRITE_DATA, BASE + 2);
}
Jak wida� zmienili�my "I_REGISTER" na "D_REGISTER" i "56"
na "character" ale co to znaczy? Je�li spojrzysz na kody znak�w w manualucharacter to zrozumiesz.
trzeba tylko dostarczy� do funkcji znak (jako �e uzywamy C wi�c nie musimy si� nawet martwi� zamian� typu na int) i
, kt�ry nast�pnie pojawi si� na LCD. Dalej, huh?
Ta cz�� kodu to szkielet programu obs�ugi LCD. U�yj jej zgodnie ze swoimi potrzebami np.: wy�wietlanie wolnej pami�ci, aktywnych po��cze� http
lub cokolwiek. Kilka przyk�ad�w jest w programie LCDInfo, kt�ry wy�wietla pewne dane dost�pne w /proc dost�pnym w GNU/Linux.
Zr�d�a informacji.
Dyskusja dotycz�ca tego artyku�u
Komentarze do dyskusji:
<--, back to the index of this issue
2004-01-31, generated by lfparser version 2.45