background image

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).  
 
 

 

  
  
 
 
 
 
 
 
 

background image

 
 
 
 
 
 
 
 
 
 
 
Funkcje pinów układu HD44780 
 

  

 

background image

   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  

background image

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 

 

 

 
 
 
 
 
 

background image

 

  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  

background image

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: 

 

background image

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).   

background image

  
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. 

background image

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. ąęźŜó)