Ćwiczenie 3 Wyświetlacz ciekłokrystaliczny Warszawa, 2007-11-09
IMiO PW, LPTM, Ćwiczenie 3, Wyświetlacz ciekłokrystaliczny -2-1. Cel ćwiczenia Celem ćwiczenia jest zapoznanie się z obsługą programową wyświetlacza ciekłokrystalicznego. 2. Opis wyświetlacza W ćwiczeniu oprogramowywany jest wyświetlacz ciekłokrystaliczny (LCD) o organizacji 8 linii po 21 znaków (pozycji). Każda pozycja zorganizowana jest w postaci matrycy punktów o wymiarach 6 8. Wyświetlacz sterowany jest przez kontroler typu T6963C firmy Toshiba. Firmowy opis kontrolera znaleźć można w dokumencie T6963C.pdf. UWAGA! W dostępnych na rynku znakowych wyświetlaczach LCD spotkać można również kontrolery innych producentów (HITACHI, SEIKO, SANYO) mogące mieć nieco inną architekturę, listę poleceń czy sposób działania. Kontroler wyświetlacza ciekłokrystalicznego T6963C może pracować w dwóch trybach. W trybie graficznym wyświetlacz ten jest matrycą o rozdzielczości 128 64, natomiast w trybie znakowym (alfanumerycznym) ma 8 linii po 21 znaków (matryca znaku 6 8) lub 8 linii po 16 znaków (matryca znaków 8 8). Kontroler wyświetlacza komunikuje się z mikrokontrolerem za pomocą 8-bitowej szyny danych oraz 6-ciu sygnałów sterujących: /WR (zapis), /RD (odczyt), /CE (chip enable aktywacja układu), C/D (command/data wybór między instrukcją a daną), /RESET (zerowanie kontrolera), FS (font selekt - wybór czcionki). Kontroler wyświetlacza współpracuje z zewnętrzną pamięcią RAM o pojemności 8 kb. Schemat blokowy przedstawiono na rys. 1. Rys. 1. Schemat blokowy wyświetlacza LCD
IMiO PW, LPTM, Ćwiczenie 3, Wyświetlacz ciekłokrystaliczny -3-3. Podłączenie wyświetlacza do mikrokontrolera Ponieważ mikrokontroler jest zasilany napięciem 3.3 V, a kontroler wyświetlacza napięciem 5V szyna danych kontrolera wyświetlacza oraz port P7 mikrokontrolera są połączone za pomocą układu przesuwającego napięcia z 3.3V na 5V i odwrotnie. Sygnały sterujące są zawsze wystawiane przez mikrokontroler, dlatego odpowiednie wyjścia mikrokontrolera połączono z wejściami sterującymi kontrolera wyświetlacza za pomocą układu HCT244 (zasilanego napięciem 5V), który reaguje na sygnały o wartości rzędy 1.5V. Ponieważ nie można jednocześnie dokonywać odczytu i zapisu z wyświetlacza, sygnały /RD i /WR są sterowane z jednego wyjścia mikrokontrolera, przy czym sygnał RD jest negowany. /RD - /P5.0 /WR - P5.0 C/D - P5.2 /CE - P5.1 FS - nie podłączony RESET nie podłączony Dodatkowa linia P5.3 steruje podświetlaniem wyświetlacza LCD. Żeby umożliwić sterowanie podświetleniem, odpowiednią linię portu należy skonfigurować w trybie push-pull P5MDOUT, #08H Schemat podłączenia wyświetlacza do mikrokontrolera przedstawiono na rys. 2. Rys. 2. Schemat połączenia wyświetlacza z mikrokontrolerem.
IMiO PW, LPTM, Ćwiczenie 3, Wyświetlacz ciekłokrystaliczny -4-4. Komunikacja między mikrokontrolerem a wyświetlaczem Komunikacja między mikrokontrolerem a wyświetlaczem może zachodzić w obu kierunkach. Przesyłanie danych może się odbywać w jednym z 3 trybów: a) polecenie wraz z dwoma bajtami danych, b) polecenie wraz z jednym bajtem danych oraz c) polecenie bez danych. Wyświetlacz sygnalizuje gotowość do przyjęcia informacji za pomocą dwóch najmłodszych bitów bajtu statusu (STA0 oraz STA1). Przed wysłaniem każdego bajtu informacji do wyświetlacza należy sprawdzić jego status. Komunikacja przebiega w następującej kolejności: wysłanie młodszego bajtu danych (po uprzednim sprawdzeniu statusu), wysłanie starszego bajtu danych (po uprzednim sprawdzeniu statusu), wysłanie komendy (po uprzednim sprawdzeniu statusu). 4.1. Odczyt statusu Przed wysłaniem dowolnej informacji do wyświetlacza należy sprawdzić czy jest on gotów do odbioru danych. Jeżeli wyślemy dane, mimo że wyświetlacz jest zajęty, zostaną one zignorowane. Sprawdzenia zajętości wyświetlacza dokonuje się odczytując jego bajt statusowy. Jeżeli dwa najmłodsze bity tego bajtu są równe jedności, to wyświetlacz jest gotów do odbioru danych. Jeżeli chociaż jeden z tych bitów jest równy zeru, wyświetlacz jest zajęty. Procedura odczytu statusu jest następująca: LCD_CE equ P5.1 LCD_RW equ P5.0 LCD_CD equ P5.2 busy: check: push ACC ; zapamietaj akumulator na stosie setb LCD_CD ; wybierz rodzaj informacji polecenie/dana (polecenie) setb LCD_RW ; wybierz kierunek przesyłu informacji (odczyt) P7, #0FFH ; wpisz same jedynki do portu P7 (wejście) R1,#10h ; opoznienie djnz R1, $ clr LCD_CE ; uaktywnij kontroler wyswietlacza R1,#10h ; opoznienie djnz R1, $ A, P7 ; odczytaj bajt statusu setb LCD_CE ; wylacz kontroler wyswietlacza jnb ACC.0, check ; sprawdz status jnb ACC.1, check R1,#10h ; opoznienie djnz R1, $ pop ACC ; przywroc pierwotna wartość akumulatora ret
IMiO PW, LPTM, Ćwiczenie 3, Wyświetlacz ciekłokrystaliczny -5-4.2. Zapis bajtu danych lub bajtu polecenia Po stwierdzeniu, że wyświetlacz jest gotów do odbioru, można doń wysłać polecenie lub daną. W przypadku wysyłania polecenia sygnał C/D musi być w stanie wysokim, natomiast podczas przesyłu danej w stanie niskim. Przykładowe procedury zapisu polecenia i danej do wyświetlacza przedstawiono poniżej. Write_command: busy ;prawdz czy wyświetlacz gotowy nop nop clr LCD_RW ; wybierz kierunek przesyłu informacji (zapis) setb LCD_CD ; wybierz rodzaj informacji polecenie/dana (polecenie) P7, A ; kod polecenia jest w akumulatorze clr LCD_CE ; uaktywnij kontroler wyświetlacza R1,#10h ; opoznienie djnz R1, $ setb LCD_CE ; wylacz kontroler wyswietlacza ret ;--------------------------------------------------------------------------------------------------- Write_data: busy ; sprawdz czy wyświetlacz gotowy nop nop clr LCD_RW ; wybierz kierunek przesyłu informacji (zapis) clr LCD_CD ; wybierz rodzaj informacji polecenie/dana (dana) P7, A ; kod danej jest w akumulatorze clr LCD_CE ; uaktywnij kontroler wyświetlacza R1,#10h ; opoznienie djnz R1, $ setb LCD_CE ; wylacz kontroler wyswietlacza ret 4.3. Schemat przesyłu polecenia Jak już wspomniano wcześniej, poleceniu mogą towarzyszyć 2 bajty danych, 1 bajt danych, lub też poleceniu nie towarzyszą żadne dane. Najpierw wysyłane są dane towarzyszące poleceniu (za pomocą procedury Write_data), a na końcu wysyłany jest kod polecenia (za pomocą procedury Write_command). Przebieg wysyłania polecenia do wyświetlacza przedstawiono w tabeli poniżej Polecenie z 2 towarzyszącymi bajtami danych A, #Data_L Write_data A, #Data_H Write_data A, #kod_polecenia Write_command Polecenie z 1 towarzyszącymi bajtem danych A, #Data Write_data A, #kod_polecenia Write_command Polecenie bez towarzyszących danych A, #kod_polecenia Write_command
IMiO PW, LPTM, Ćwiczenie 3, Wyświetlacz ciekłokrystaliczny -6-5. Inicjalizacja wyświetlacza Inicjalizacja wyświetlacza polega na ustaleniu związku między położeniem danej w pamięci VRAM (Video RAM) wyświetlacza, a miejscem na wyświetlaczu, w którym dana ta zostanie wyświetlona. Związek ten jest określony przez 4 parametry: Text Home Address (TH) początkowy adres VRAM dla danych tekstowych. Dana umieszczona pod tym adresem w pamięci VRAM zostanie wyświetlona w lewym górnym rogu ekranu Text Area (TA) liczba kolumn w linii wyświetlacza Graphic Home Address (GH) początkowy adres VRAM dla danych graficznych. Dana umieszczona pod tym adresem w pamięci VRAM zostanie wyświetlona w lewym górnym rogu ekranu Graphic Area (GA) liczba kolumn danych graficznych w linii Kontroler wyświetlacza współpracuje z zewnętrzną pamięcią RAM o pojemności 8 kb. Mapę tej pamięci zamieszczono w poniższej tabeli. Obszar pamięci graficznej (0000H 13FFH) 5120 bajtów Obszar pamięci atrybutów (1400H 16FFH) 767 bajtów Obszar pamięci tekstowej (1700H 1BFFH) 1280 bajtów Obszar pamięci generatora znaków (CG-RAM: 1C00-1FFFH) 1024 bajty Wynika z niej, że: GH = 0000H oraz TH = 1700H 5.1. Polecenie Graphic Home Address Set (GH) Polecenie należy do grupy Control Word Set i definiuje początkowy adres VRAM dla danych graficznych. Dana przechowywana pod Graphic Home Address (GH) zostanie wyświetlona jako pierwsze 6 lub 8 bitów górnego wiersza po lewej stronie ekranu, w zależności od wybranego rozmiaru czcionki. Opis (zakres) D7 D6 D5 D4 D3 D2 D1 D0 Pierwszy argument (0-FFH) Graphic Home Address (młodszy bajt GH) Drugi argument (0-FFH) Graphic Home Address (starszy bajt GH) Graphic Home Address Set (42H) 0 1 0 0 0 0 1 0 Zgodnie z mapą pamięci graficzny obszar pamięci VRAM powinien się zaczynać od 0000H. Poniżej przedstawiono polecenie Graphic Home Address Set odpowiadające temu założeniu: 1 bajt danych 0 0 0 0 0 0 0 0 0 00H 2 bajt danych 0 0 0 0 0 0 0 0 0 00H Graphic Home 1 0 1 0 0 0 0 1 0 42H Address Set Uwaga: w zacieniowanej kolumnie przedstawiono wartości wejścia sterującego C/D wyświetlacza przy wysyłaniu kolejnych bajtów.
IMiO PW, LPTM, Ćwiczenie 3, Wyświetlacz ciekłokrystaliczny -7-5.2. Polecenie Graphic Area Set (GA) Polecenie należy do grupy Control Word Set i definiuje liczbę kolumn danych graficznych dla obszaru graficznego (GA) pamięci VRAM. Opis (zakres) D7 D6 D5 D4 D3 D2 D1 D0 Pierwszy argument (0-FFH) Liczba kolumn (GA) Drugi argument (00H) 0 0 0 0 0 0 0 0 Graphic Area Set (43H) 0 1 0 0 0 0 1 1 Liczba kolumn w linii powinna wynosić 21, czyli 15H. Poniżej przedstawiono polecenie Graphic Area Set odpowiadające powyższemu założeniu: Liczba kolumn 0 0 0 0 1 0 1 0 1 15H Drugi bajt 0 0 0 0 0 0 0 0 0 00H Graphic Area 1 0 1 0 0 0 0 1 1 43H Address Set 5.3. Polecenie Text Home Address Set (TH) Polecenie należy do grupy Control Word Set i definiuje początkowy adres VRAM dla danych tekstowych. Dana przechowywana pod Text Home Address (TH) zostanie wyświetlona w lewym górnym rogu obszaru wyświetlania (pozycja Home) Opis (zakres) D7 D6 D5 D4 D3 D2 D1 D0 Pierwszy argument (0-FFH) Text Home Address (młodszy bajt TH) Drugi argument (0-FFH) Text Home Address (starszy bajt TH) Text Home Address Set (40H) 0 1 0 0 0 0 0 0 Zgodnie z mapą pamięci obszar pamięci VRAM przeznaczony dla danych tekstowych powinien się zaczynać od 1700H. Poniżej przedstawiono polecenie Text Home Address Set odpowiadające temu założeniu: 1 bajt 0 0 0 0 0 0 0 0 0 00H 2 bajt 0 0 0 0 1 0 1 1 1 17H Text Home 1 0 1 0 0 0 0 0 0 40H Address Set 5.4. Text Area Set (TA) Polecenie należy do grupy Control Word Set i definiuje liczbę kolumn tekstu dla obszaru tekstowego (TA) pamięci VRAM (zazwyczaj równą liczbie znaków w linii wyświetlacza). Opis (zakres) D7 D6 D5 D4 D3 D2 D1 D0 Pierwszy argument (0-FFH) Liczba kolumn znaków (TA) Drugi argument (00H) 0 0 0 0 0 0 0 0 Text Area Set (41H) 0 1 0 0 0 0 0 1
IMiO PW, LPTM, Ćwiczenie 3, Wyświetlacz ciekłokrystaliczny -8- Liczba kolumn powinna wynosić 21, czyli 15H. Poniżej przedstawiono polecenie Text Area Set odpowiadające powyższemu założeniu: Liczba kolumn 0 0 0 0 0 0 0 0 0 15H 2 bajt 0 0 0 0 1 0 1 0 1 00H Text Area Set 1 0 1 0 0 0 0 0 1 41H 6. Inne polecenia wyświetlacza 6.1. Polecenie Address Pointer Set Polecenie to należy do grupy Pointer Set i definiuje adres początkowy dla zapisu danych do pamięci VRAM Opis (zakres) D7 D6 D5 D4 D3 D2 D1 D0 Pierwszy argument (0-FFH) Wskaźnik adresu (młodszy bajt) Drugi argument (0-FFH) Wskaźnik adresu (starszy bajt) Address Pointer Set (24H) 0 0 1 0 0 1 0 0 Na początku będziemy czyścić obszar graficzny pamięci VRAM, toteż polecenie Address Pointer Set ma następującą postać: 0 0 0 0 0 0 0 0 0 00H 0 0 0 0 0 0 0 0 0 00H Address Pointer Set 1 0 0 1 0 0 1 0 0 24H 6.2. Polecenie Mode Set Polecenie Mode Set określa z jakiego generatora znaków korzystamy i jak grafika łączy się na wyświetlaczu z tekstem. Opis D7 D6 D5 D4 D3 D2 D1 D0 Uwagi Mode Set 1 0 0 0 CG N2 N1 N0 0 tryb CG-ROM 1 tryb CG-RAM 0 0 0 tryb OR 0 0 1 tryb EXOR 0 1 1 tryb AND 1 0 0 tryb Text Only (atrybuty) CG=0 CG=1 dostępnych jest zarówno 128 znaków wbudowanego generatora znaków (tryb CG-ROM), jak i 128 znaków zdefiniowanych przez użytkownika (tryb CG-RAM) dostępnych jest 256 znaków zdefiniowanych przez użytkownika Bity D2-D0 określają, w jaki sposób grafika łączy się na wyświetlaczu z tekstem. Poszczególne tryby wyjaśniono na rysunku poniżej.
IMiO PW, LPTM, Ćwiczenie 3, Wyświetlacz ciekłokrystaliczny -9- Grafika Tekst Tryb OR Tryb AND Tryb EXOR Należy wybrać tryby CG-ROM oraz Text Only. Poniżej przedstawiono polecenie Mode Set odpowiadające tym założeniom. Mode Set 1 1 0 0 0 0 1 0 0 84H 6.3. Polecenie Display Mode Set Polecenie określa sposób wyświetlania danych Opis D7 D6 D5 D4 D3 D2 D1 D0 Uwagi Display Mode 1 0 0 1 N3 N2 N1 N0 0 Grafika wyłączona 1 Grafika włączona 0 Tekst wyłączony 1 Tekst włączony 0 Kursor wyłączony 1 Kursor włączony 0 Migotanie kursora wyłączone 1 Migotanie kursora włączone Należy wyłączyć grafikę, włączyć tekst, wyłączyć kursor i migotanie. Poniżej przedstawiono odpowiedni wariant polecenia Display Mode Set Display Mode Set 1 1 0 0 1 0 1 0 0 94H
IMiO PW, LPTM, Ćwiczenie 3, Wyświetlacz ciekłokrystaliczny -10-6.4. Polecenie Data Write Polecenie Data Write umożliwia zapisanie danej do pamięci VRAM. Opis D7 D6 D5 D4 D3 D2 D1 D0 Uwagi Data 1 1 0 0 0 N2 N1 N0 Read/Write 0 Address Pointer up/down 1 Address Pointer unchanged 0 Address Pointer up 1 Address Pointer down 0 Data Write 1 Data Read Należy wybrać opcje: Address Pointer up/down, Address Pointer up, Data Write. Odpowiadające temu założeniu polecenie przedstawiono poniżej: Data Write 1 1 1 0 0 0 0 0 0 C0H Wysłanie np. znaku 0 do pamięci wyświetlacza ma następujący przebieg: Mov A, #adres_low ; młodszy bajt adresu w pamięci VRAM Call Write_data Mov A, #adres_high ; starszy bajt adresu w pamięci VRAM Call Write_data Mov A, #Address_Pointer_Set ; kod polecenia Address Pointer Set Call Write command Mov A, #znak_zera ; kod znaku zera Call Write_data Mov A, #Data_Write ; kod polecenia Data Write Call Write_command Wysyłając do wyświetlacza polecenie Mode Set wybraliśmy tryb CG-ROM, co oznacza, że korzystamy z wewnętrznego generatora znaków. Zawiera on 128 znaków. Ich kody przedstawiono w tabeli poniżej: MSB LSB 0 1 2 3 4 5 6 7 8 9 A B C D E F 0! # $ % & ( ) * +, -. / 1 0 1 2 3 4 5 6 7 8 9 : ; < = >? 2 @ A B C D E F G H I J K L M N O 3 P Q R S T U V W X Y Z [ \ ] ^ _ 4 \ a b c d e f g h i j k l m n o 5 p q r s t u v w x y z { : } ~ 6 Ç ü é â ä ŕ ĺ ç ę ë č ď î ĕ Ä Ĺ 7 É ô ö ň ű ů ö ü Ł Ą Z tabeli generatora znaków wynika, że kod znaku 0 wynosi 10H (cztery starsze cyfry to 1, cztery młodsze to 0). Kod ASCII tego znaku jest równy 30H, można zatem napisać, że kod
IMiO PW, LPTM, Ćwiczenie 3, Wyświetlacz ciekłokrystaliczny -11- znaku dla wyświetlacza jest równy kodowi ASCII pomniejszonemu o 20H. Jeżeli do wyświetlacza chcemy wysłać znak 0, najprościej jego kod obliczyć w następujący sposób: A, # 0 załaduj kod ASCII liczby 0 do akumulatora clr C ; wyczyść bit przeniesienia subb A, #20H ; odejmowanie zawsze jest wykonywane z pożyczką 7. Zadanie do wykonania 3 p. Wyświetlić napis w co najmniej 4 liniach wyświetlacza 6 p. Wyświetlić napis płynący przez trzy linie wyświetlacza 8 p. Wyświetlić napis płynący przez cały ekran wyświetlacza Uwaga: po inicjalizacji wyświetlacza oraz wysłaniu poleceń Mode Set i Display Mode Set należy wyczyścić pamięć graficzną i tekstową wyświetlacza. UWAGA!!!! Przed przystąpieniem do realizacji ćwiczenia przeprowadzony zostanie krótki (ok. 10 min.) sprawdzian za 2p. Zakres materiału: posługiwanie się asemblerem (dopuszcza się korzystanie z listy instrukcji); przeznaczenie rejestrów specjalnych wykorzystywanych w ramach ćwiczenia.