[LinuxFocus-icon]
<--  | Strona G��wna  | Mapa Serwisu  | Indeks  | Szukaj

Nowo�ci | Archiwum | Linki | O Nas
Ten dokument jest dost�pny w nast�puj�cych j�zykach: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Turkce  Polish  

[jan.svenungson]
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

[HD44780]

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�?

[schematic] 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:
 Strona talkback 

<--, back to the index of this issue

Strona prowadzona przez redakcj� LinuxFocus
© Jan Svenungson, FDL
LinuxFocus.org
t�umaczenie:
en --> -- : Jan Svenungson <jan.svenungson(at)linux.nu>
en --> pl: Mariusz Koz�owski <sp3fxc/AT/linuxfocus.org>

2004-01-31, generated by lfparser version 2.45