4. Wy
ś
wietlacz LCD
EasyWeb2 pracuje na procesorze z serii ‘1xx i nie zawiera wbudowanego sterownika
wyświetlacza. Wykorzystuje on do wyświetlania specjalizowany układ wyświetlacza LCD z
własnym sterownikiem. Rolę sterownika pełni układ firmy Hitach HD 44780. Do sterownika
mikrokontroler wysyła tylko dane (które mają być wyświetlane) i instrukcje (w jaki sposób
mają być wyświetlane).
Funkcje pinów układu HD44780
Wyświetlacz może pracować z ośmio- bądź cztero- bitową magistralą danych.
Zazwyczaj w systemach mikroprocesorowych stosuje się tryb pracy z czterobitową
magistralą danych. Oprócz linii danych DB4-DB7, do wyświetlacza podłączone są trzy linie
sterujące E,RS,R/W oraz zasilanie.
Sprawdźmy, w jaki sposób odbywa się komunikacja mikrokontrolera z układem HD44780.
Układ ma 2 8-bitowe rejestry rejestr instrukcji IR, wybierany przy stanie 0 na wejściu RS,
oraz rejestr danych DR, wybierany przy stanie 1 na wejściu RS.
Rejestr IR przyjmuje kody instrukcji (np. ustawienie stanu wyświetlacza, czyszczenie
wyświetlacza, przesunięcie kursora). Rejestr DR przyjmuje dane do przesłania na
wyświetlacz.
HD44780U może pracować w jednym z 2 trybów 4 i 8 bitowym. W układzie easyWeb mamy
podłączone wyjścia P2.4 do P2.7 do lini danych DB0 do DB3 kontrolera wyświetlacza.
Wobec tego układ należy ustawić do pracy w trybie 4 bitowym.
Linia RS odpowiada za interpretowanie danych przychodzących do sterownika
wyświetlacza. Gdy linia RS jest w stanie niskim to dane są interpretowane jako
instrukcje, gdy natomiast jest w stanie wysokim to dane są interpretowane jako adres
znaku z tablicy znaków zapisanej w pamięci ROM wyświetlacza. I na wyświetlaczu
pojawia się znak z tej właśnie tablicy.
Linia R/W informuje sterownik wyświetlacza czy mamy zamiar czytać, czy też pisać
do wyświetlacza. W EasyWeb linia ta jest na stałe podłączona do masy, czyli
możliwy jest tylko zapis. Takie rozwiązanie powoduje niewielkie zmniejszenie
funkcjonalności wyświetlacza, ale sprawia, że odchodzi nam problem sterowania tą
linią.
Linia E służy do aktywowania zapisu danych do układu i powinno być aktywna po podaniu
danych na linie danych.
Wysłanie instrukcji do układu powoduje ustawienie flagi BF, która jest aktywna aż do
przetworzenia bieżącej instrukcji i w tym czasie inne instrukcje nie są akceptowane.
Kiedy RS = 0 i R/S = 1 , BF jest podłączona do wyjścia DB7. Następna instrukcja może być
wysłana po sprawdzeniu, że BF jest równa 0.
Komendy Wy
ś
wietlacza
Na podstawie tabeli możemy zdefiniować komendy wyświetlacza.
#define
CLR_DISP
0x01
// clear display
#define
CUR_HOME
0x02
// return home
#define
ENTRY_INC
0x06 // entry mode increment
#define
ENTRY_INC_ROL
0x07 // entry mode increment with rol
data
#define
ENTRY_DEC
0x04 // entry mode decrement
#define
ENTRY_DEC_ROL
0x05 // entry mode decrement witch rol
dat
#define
DISP_OFF
0x08
// all display off
#define
DISP_ON
0x0c
// all display on
#define DATA_ROL_LEFT 0x18 // rol data left
#define DATA_ROL_RIGHT 0x1c // rol data right
#define CUR_SHIFT_LEFT 0x10 // shift coursor left
#define CUR_SHIFT_RIGHT 0x14 // shift coursor right
#define
DD_RAM_ADDR
0x80
// set DD_RAM
#define
DD_RAM_ADDR2
0xc0
// set CG_RAM
#define
DD_RAM_ADDR3
0x28
//
#define
CG_RAM_ADDR
0x40
//
INICJALIZACJA Wy
ś
wietlacza
Wiemy już jak przesyłać dane do sterownika. Jednak zanim zaczniemy to robić
trzeba jeszcze zainicjować sterownik wyświetlacza. Po pierwsze musi być ustalony
tryb pracy magistrali. W tym przypadku trzeba ustalić tryb 4-bitowy. Ponieważ po
włączeniu zasilania występują stany nieustalone, nie wiadomo, w jakim trybie jest
ustawiony interfejs. W tym celu trzykrotnie wysyła się do sterownika komendę
inicjującą tryb ośmiobitowy a następnie komendę inicjującą tryb czterobitowy
(pamiętamy, Se RS jest w stanie niskim). Sprawia to, że przechodzimy w tryb
czterobitowy. Następnie trzeba włączyć wyświetlacz, ustawić parametry wyświetlacza,
a po dokonaniu tego wyczyścić wyświetlacz. Opis wszystkich rozkazów wyświetlacza
znajduje się w tabeli.
Zalecenia producenta dotyczące sposobu inicjalizacji układu są następujące:
Na podstawie schematu możemy napisać kod inicjacji układu:
void InitLCD(void)
{
bitclr(P2OUT,RS);
Delay100ms();
//Delay 100ms
LCD_Data |= BIT4 | BIT5; //D7-D4 = 0011
LCD_Data &= ~BIT6 & ~BIT7;
_E(); //toggle E for LCD
Delayx10ms();
//10ms
_E(); //toggle E for LCD
Delayx10ms();
//10ms
_E(); //toggle E for LCD
Delayx10ms();
//10ms
LCD_Data &= ~BIT4;
_E(); //toggle E for LCD
SEND_CMD(DISP_ON);
SEND_CMD(CLR_DISP);
Delay100ms();
}
Opis podstawowych funkcji w powyższym kodzie:
bitclr(P2OUT,RS);
Wyzerowanie bitu RS w porcie P2
Delay100ms();
Pętla opóźniająca 100ms
_E();
Wysłanie impulsu na wyjście E wyświetlacza w celu aktywacji danych
ustawionych na liniach DB4-DB7
SEND_CMD(DISP_ON);
Wysłanie komendy do wyświetlacza DISP_ON
Podstawowe procedury obsługi wy
ś
wietlacza
Podstawowe funkcje obsługi wy
ś
wietlacza stanowi
ą
dwie procedury: SEND_CMD i
SEND_CHAR
void SEND_CMD (unsigned char e)
{
int temp;
Delayx100us(10); //10ms
temp = e & 0xf0;
//get upper nibble
LCD_Data &= 0x0f;
LCD_Data |= temp; //send CMD to LCD
bitclr(P2OUT,RS); //set LCD to CMD mode
_E(); //toggle E for LCD
temp = e & 0x0f;
temp = temp << 4; //get down nibble
LCD_Data &= 0x0f;
LCD_Data |= temp;
bitclr(P2OUT,RS);
//set LCD to CMD mode
_E(); //toggle E for LCD
}
void SEND_CHAR (unsigned char d)
{
int temp;
Delayx100us(5); //.5ms
temp = d & 0xf0;
//get upper nibble
LCD_Data &= 0x0f;
LCD_Data |= temp;
bitset(P2OUT,RS); //set LCD to data mode
_E(); //toggle E for LCD
temp = d & 0x0f;
temp = temp << 4; //get down nibble
LCD_Data &= 0x0f;
LCD_Data |= temp;
bitset(P2OUT,RS);
//set LCD to data mode
_E(); //toggle E for LCD
}
Napisy na wy
ś
wietlaczu
Mimo, że na wyświetlaczu jednocześnie możemy wyświetlać dwie linie danych po
16 znaków, to w pamięci danych wyświetlacza DD_RAM dla każdej z linii
wyświetlacza przyporządkowanych jest 40 znaków (00h-27h -górna linia , 40h-67h –
dolna linia).
Przyporządkowanie adresów w DD_RAM dla pozycji na wyświetlaczu
Pozycja 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Linia 1 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
Linia 2 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
Sprawia to, że możemy przesuwać dane na wyświetlaczu. Przesuwnie danych odbywa
się jednocześnie dla obu linii, ale dzieje się to niezależnie, co oznacza, Se dane nie
przesuwają się pomiędzy liniami.
Adresy DD_RAM po obrocie w lewo
Pozycja 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Linia 1 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10
Linia 2 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50
Po obrocie danych w prawo bądź w lewo zmianie ulegają adresy znaków w pamięci
DD_RAM. W ten sposób można uzyskać tzw. „efekt baneru”.
Adresy DD_RAM po obrocie w prawo
Pozycja 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Linia 1 27 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E
Linia 2 67 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E
Definicje własnych znaków
W pamięci CG_RAM można zdefiniować 8 własnych. Na każdy znak przeznaczonych
jest 8 bajtów w pamięci CG_RAM. Znaki definiuje się po przez odpowiednie ustawianie
bitów D4-D0 (bity D7-D5 są nieistotne) w wysyłanym bajcie.
Zadania
1.
Napisać funkcję wyświetlającą napis na ekranie wyświetlacza.
2.
Napisać funkcję wyświetlającą napis na ekranie wyświetlacza z możliwością
zdefiniowania przewijania tekstu w prawo i lewo.
3.
Napisać funkcję wyświetlającą napis na ekranie wyświetlacza z możliwością
zdefiniowania przewijania z pierwszej do drugiej linii wyświetlacza.
4.
Napisać funkcję wyświetlającą na ekranie wyświetlacza liczbę 32 bitową.
5.
Napisać funkcję wyświetlającą na ekranie wyświetlacza liczbę szesnastkową i binarną.
6.
Napisać program wyświetlający na ekranie napis podany przez prowadzącego zajęcia
7.
Napisać program wyświetlający na ekranie napis podany przez prowadzącego zajęcia,
używający zdefiniowanych w pamięci wyświetlacza własnych znaków (np. ąęźżó)