powrót do spisu treści

powrót do publikacje

4.4 Wyświetlacz.

Alfanumeryczny wyświetlacz LCD, na którym są wyświetlane parametry w trakcie pracy, składa się z czterech linii po szesnaście znaków. Układ ten posiada wbudowany sterownik zgodny z HD44780, który umożliwia pracę wyświetlacza w jednym z dwóch trybów – magistrala danych może być ośmiobitowa lub czterobitowa. W projektowanym sterowniku wyświetlacz jest podłączony magistralą czterobitową, która pozwala na oszczędzenie 4 portów mikrokontrolera. Jedynym minusem tej magistrali jest bardziej rozbudowana i skomplikowana obsługa programowa.

Rysunek 17 przedstawia rozmieszczenie wyprowadzeń wyświetlacza, a tabela 10 zawiera opis ich funkcji.

Rys. 17. Wyprowadzenia alfanumerycznego wyświetlacza LCD<

Tabela 10. Funkcje wyprowadzeń wyświetlacza LCD

Nr. wyprowadzenia Symbol Funkcja
1 GND Minus zasilania
2 Vcc Plus zasilania
3 Kontrast Regulacja kontrastu
4 RS Wybór rejestru
5 R/W 1 – odczyt, 0 – zapis
6 E Sygnał zezwalający enable
7 D0 Linia danych D0
8 D1 Linia danych D1
9 D2 Linia danych D2
10 D3 Linia danych D3
11 D4 Linia danych D4
12 D5 Linia danych D5
13 D6 Linia danych D6
14 D7 Linia danych D7
15 LED_A Anoda podświetlania
16 LED_C Katoda podświetlania

W wykorzystanym wyświetlaczu jest wbudowane podświetlanie (linie 15 i 16), które zrealizowano za pomocą diod LED. Podświetlanie wymagało dodania rezystora ograniczającego prąd, którego nie ma w module wyświetlacza. Bez rezystora ograniczającego wyświetlacz świeciłby bardzo jasno, wydzielając przy tym dużo ciepła. Prowadziłoby to do nadmiernego nagrzewania się matrycy oraz skróciłoby jej żywotność, a także mogłoby spowodować szybsze odparowanie ciekłego kryształu.

Do linii trzeciej dołączyłem potencjometr tak jak na rysunku 18, co umożliwiło regulację kontrastu. Standardowo kontrast regulowany jest przyłożeniem napięcia z zakresu od 0 do napięcia zasilania, gdzie zero odpowiada maksymalnemu kontrastowi, a napięcie zasilania - minimalnemu. Zastosowany wyświetlacz przy napięciu 0V miał za słaby kontrast, z tego powodu zastosowałem napięcie ujemne -1,2V, które zostało podłączone z siódmego wyprowadzenia układu ADM202 i dało pożądany efekt.

Rys. 18. Podłączenie kontrastu

Wyświetlacz LCD posiada następujące rejestry [2]:

- DataWR - rejestr danych przeznaczony do zapisu informacji; - DataRD - rejestr danych przeznaczony do odczytu informacji; - ControlRD - rejestr stanu wyświetlacza (Status) przeznaczony do odczytu; - ControlWR - rejestr sterujący wyświetlacza (Control) przeznaczony do zapisu;

O wyborze, do którego rejestru nastąpi zapis lub odczyt decydują linie 4 i 5 (D/C i R/W). W tym przypadku linia R/W jest na stałe podłączona do masy (tylko zapis), a linia D/C jest sterowana w zależności wysyłanych danych, 0-DataWR, 1-ControlWR, odczyt stanu wyświetlacza nie jest konieczny jeśli uwzględnimy w programie opóźnienia czasowe, potrzebne na wykonanie wysłanych instrukcji przez sterownik wyświetlacza. Linia 6 (E‑enable) uaktywnia wymianę informacji z wyświetlaczem [2].

Wyświetlacz zawiera dwa rodzaje wewnętrznej pamięci, które mogą być kontrolowane: pamięć DD (Display Data) i pamięć CG (Character Generator). Dostęp do tych pamięci odbywa się przez wymienione wyżej rejestry. Pamięć CG składa się z dwóch części: pamięci CG ROM zawierającej przygotowane przez producenta kody znaków oraz pamięci CG RAM przeznaczonej na kody znaków dowolnie zdefiniowane [2]. W pamięci CG RAM umieściłem tablicę ośmiu polskich znaków, które wzbogacają interfejs wyświetlacza, tablica ta ma postać:

static const unsigned char code fonttab[]=
{
0 ,0 ,14 ,1 ,15 ,17 ,15 ,2 , // ą
0 ,0 ,14 ,7 ,31 ,16 ,14 ,2 , // ę
2 ,4 ,14 ,16,16 ,17 ,14 ,0 , // ć
2 ,4 ,14 ,16,14 ,1 ,30 ,0 , // ś
4 ,0 ,31,2 ,4 ,8 ,31 ,0 , // ż
12,4 ,6 ,4 ,12 ,4 ,14 ,0 , // ł
2 ,4 ,22,25 ,17 ,17 ,17 ,0 , // n
2 ,4 ,14,17 ,17 ,17 ,14 ,0 , // ó
};

Aby wyświetlacz zaczął funkcjonować zawsze na początku programu po załączeniu zasilania należy go zainicjować, czyli wysłać kilka rozkazów sterujących w ściśle określonych odstępach czasu. Rozkazy oraz wszystkie zależności są zamieszczone w aplikacji sterownika HD44780. Przykładowa sekwencja inicjalizacji wyświetlacza LCD znajduję się na rysunku 18 [6]. Dodatkowo poniżej zamieściłem kod programu odpowiedzialny za start wyświetlacza:

void Lcd_init(void) //funkcja wywoływana po upływie 3s
{
char i;
static const unsigned char code fonttab[]= //deklaracja polskich znaków
{
0 ,0,14,1 ,15,17,15,2,0 ,0,14,17,31,16,14,2,2 ,4,14,16,16,
17,14,0, 2 ,4,14,16,14,1 ,30,0,4 ,0,31,2 ,4 ,8 ,31,0,12,4,6,
4 ,12,4 , 14,0,2,4,22,25,17,17,17,0,2 ,4,14,17,17,17,14,0,
};
DC_LCD = 0; E_LCD = 0;waitms(15);
for(i=0; i<3; i++)
{
E_LCD = 1; P2&=0x3F; E_LCD = 0; waitms(5);
}
E_LCD = 1; P2&=0x2F; E_LCD = 0;waitms(1);
LCD_ctrlWR(0x28);waitms(1);
LCD_ctrlWR(0x06);waitms(1);
LCD_ctrlWR(0x0c);waitms(1);
LCD_ctrlWR(0x01);waitms(2);
LCD_ctrlWR(0x80);waitms(1);
LCD_ctrlWR(CG_RAM);
for(i=0;i {
LCD_dataWR(fonttab[i]);
}
LCD_ctrlWR(DD_RAM);
}

Rys. 19. Programowa inicjalizacja modułu LCD [6]

Po prawidłowym zainicjowaniu startu wyświetlacza można przejść do komunikacji z tym modułem, która odbywa się przy wykorzystaniu magistrali czterobitowej. Każde wysyłane do LCD słowo składa się z ośmiu bitów, funkcja odpowiedzialna za wysyłanie danych do modułu dzieli je na dwie części czterobitowe i wysyła najpierw cztery starsze bity a następnie cztery młodsze. Działanie tej funkcji przedstawia poniższy fragment kodu:

void WriteByteToLcd(char X) //zapis bajtu
{
E_LCD = 1;
P2|=0xF0;
P2&=(X|0x0F); //wysłanie czterech starszych bitów
E_LCD = 0;
E_LCD = 1;
X<<=4;
P2|=0xF0;
P2&=(X|0x0F); //wysłanie czterech młodszych bitów
E_LCD = 0;
waitms(2);
}

powrót do spisu treści

powrót do publikacje