Elektronika cyfrowa mikrokontrolery dla początkujących. Część 12 Kolorowy wyświetlacz LCD Kurs przygotowany wraz z firmą producentem zestawów do nauki programowania procesorów AVR 1
Wstęp Dotychczas korzystaliśmy jedynie z wyświetlacza alfanumerycznego do prezentowania danych. Teraz przyszła pora na nieco ambitniejsze zagadnienie obsługę kolorowego, graficznego wyświetlacza LCD. Obecnie BASCOM oferuje wsparcie dla dwóch modeli kolorowych wyświetlaczy. Jednym z nich jest wyświetlacz oparty o sterownik PCF8833. Wyświetlacze takie swego czasu były popularnie stosowane w telefonach marki Nokia (np. model N6100). Wyświetlacze te jednak posiadają bardzo niewygodne złącza i tylko na niektórych starszych modelach znajdziemy specjalne pady, pod które łatwiej przylutować kabelki. Dodatkowo konieczna jest konwersja stanów logicznych z 5V na 3,3V oraz zapewnienie napięcia rzędu 6,5-7V dla podświetlania. Firma And-Tech ma w swojej ofercie gotowy moduł wyświetlacza (And-Graph132), który rozwiązuje wszystkie te problemy i na swoim pokładzie posiada dodatkowo joystick. Przygotowania Przygotowania do korzystania z modułu rozpoczniemy od połączenia całości z procesorem. Na początku podłączmy zasilanie do płytki naszego wyświetlacza (GND i VCC). Dodatkowo podłączmy pin BL do +5V. teraz obserwujemy wyświetlacz. Jeśli jego podświetlanie miga przy delikatnym przechylaniu samego wyświetlacza w prawo lub lewo, to oznacza iż mamy niewielki problem ze złączami 1. W takiej sytuacji odpinamy wyświetlacz od płytki i w złączu od strony wyświetlacza delikatnie doginamy w stronę środka złącza wszystkie styki za pomocom cienkiej igły. UWAGA! Operację tę należy wykonać bardzo ostrożnie, gdyż zbytnie wygięcie styków może doprowadzić do ich uszkodzenia. Autor kursu nie ponosi żądnej odpowiedzialności za uszkodzenia spowodowane podczas tej czynności. Jeśli teraz wyświetlacz jest ciągle podświetlany, oznacza to, że złącze działa poprawnie. Kolejne połączenia z procesorem wykonujemy według opisów w kodach programów. 1 Pomimo tego, iż złącza są dokładnie opisane standardami, występują między nimi różnice rzędu dziesiątych i setnych części milimetra, co staje się przyczyną problemów. 2
Pierwsze uruchomienie Teraz nadszedł czas aby zainicjalizować nasz wyświetlacz i wyświetlić na nim jakiś tekst. I tu zauważymy pierwszą różnicę między wyświetlaczami tekstowymi a graficznymi. Otóż konieczne jest dołączenie pliku zawierającego definicję czcionki, w której opisany jest układ pikseli tworzących każdą literę. Dodatkowo w przypadku naszego wyświetlacza mamy do wyboru różne ustawienia jego pracy, takie jak kontrast, czy obrót 2. Inicjalizacji wyświetlacza oraz wyświetlenia prostych rysunków dokonuje poniższy prosty program. $regfile = "m644pdef.dat" '$regfile = "m32def.dat" '$regfile = "m16def.dat" $baud = 9600 $crystal = 16000000 $lib "lcd-pcf8833.lbx" 'dołą czamy bibliotekę do obsł ugi wyś wietlacza na sterowniku pcf8833 (zwykle cze rwone PCB) Const Mirror_x = 7 Const Mirror_y = 6 Const Ram_direction = 5 Const Line_order = 4 Const Color_mode = 3 Dim Cfg As Byte 'stał e pomagają nam czytelnie zapisać konfigurację Cfg.color_mode = 1 'tryb kolorów 1 - kolory w formacie RRRGGGBB, 0 - kolory w formacie BBBGGGRR Cfg.line_order = 0 Cfg.ram_direction = 0 'parametry dotyczą ce kolejnosci przesył ania danych o pikselach pozostawiamy bez zmian Cfg.mirror_y = 0 'włączanie/wyłą czanie odbicia lustrzanego wzglę dem osi Y Cfg.mirror_x = 1 'włączanie/wyłą czanie odbicia lustrzanego wzglę dem osi X 'powyż sze parametry powodują poprawną interpretację kolorów i ustawienie doł u wyś wietlacza do joysticka Config Graphlcd = Color, Controlport = Portc, Cs = 7, Rs = 4, Scl = 6, Sda = 5 'konfigurujemy wyświetlacz '( Powinniś my Wykonać Następują ce Połą czenia Pomię dzy Wyś wietlaczem A Płytk ą: Wyś wietlacz - Płytka Vcc - Vcc Gnd - Gnd 2 w rzeczywistości ustawiamy jedynie odwrócenie względem osi X (u nas równoległa do złącz) oraz Y (prostopadła do X) 3
Bl - Vcc Cs - Pc7 Clk - Pc6 Dat - Pc5 Res - Pc4 ') Glcdcmd &H25 'wysył amy polecenie ustawienia kontrastu Glcddata 50 'podajemy wartość kontrastu (z zakresu 0-127) Glcdcmd &H36 'wysył amy polecenie zapisu konfiguracji Glcddata Cfg 'wysył amy konfigurację Glcdcmd &H21 'włą czamy inwersję kolorów (aby kolory wyświetlał y się poprawnie 'jeś li kolory są odwrócone zamiast powyż szej komendy wysył amy następującą 'Glcdcmd &H20 'wyłą czamy inwersję kolorów Glcdcmd &H29 'wysył amy komendę włączającą wyświetlacz Cls 'teraz moż emy normalnie wyczyścić wyświetlacz Pset 10, 10, &B111000000 Pset 20, 0, &B000111000 Pset 0, 20, &B000000011 'ustawiamy na ekranie 3 punkty 'skł adnia Pset X, Y, Kolor 'Uwaga! U nas X oznacza oś poziom ą, a Y pionow ą. kolory zapisane w formacie &Brrrgggbb (taki wybraliś my w ustawieniach) Line(50, 50) -(131, 50), &B11111000 'Wyś wietlamy pomarańczową linię podają c współrzę dne punktów począ tkowych i końc owych, oraz kolor 'skł adnia Line(Xp, Yp) -(Xk, Yk), Kolor Box(55, 55) -(131, 131), &B00011100 'Wyś wietlamy zielony prostokąt 'skł adnia Box(Xp, Yp) -(Xk, Yk), Kolor Circle(25, 75), 20, &B11100011 'wyś wietlamy fioletowy okrąg 'skł adnia Circle(X, Y), Promień, Kolor End 4
Tekst na wyświetlaczu graficznym Na wyświetlaczu graficznym, oprócz obrazków, na pewno zechcemy wyświetlić także tekst. Należy zwrócić tu uwagę na to, iż obsługa tego wyświetlacza wymaga dołączenia opisu każdego znaku piksel po pikselu. Stwarza to konieczność dołączenia takich plików do pamięci naszego programu, ale z drugiej strony daje nam możliwość stworzenia własnych czcionek o różnych rozmiarach. Podstawowa obsługa czcionek Na początku wykorzystamy dołączone do pakietu BASCOM przykładowe zestawy czcionek graficznych. $regfile = "m644pdef.dat" '$regfile = "m32def.dat" '$regfile = "m16def.dat" $baud = 9600 $crystal = 16000000 $lib "lcd-pcf8833.lbx" Dim A As Byte Dim S As String * 15 Const Blue = &B00000011 Const Yellow = &B11111100 Const Red = &B11100000 Const Green = &B00011100 Const Black = &B00000000 Const White = &B11111111 Const Brightgreen = &B00111110 Const Lightgreen = &B01111100 Const Darkgreen = &B00010100 Const Darkred = &B10100000 Const Darkblue = &B00000010 Const Brightblue = &B00011111 Const Orange = &B11111000 'definiujemy kilka stał ych z kodami kolorów Const Mirror_x = 7 Const Mirror_y = 6 Const Ram_direction = 5 Const Line_order = 4 Const Color_mode = 3 Dim Cfg As Byte Cfg.color_mode = 1 Cfg.line_order = 0 Cfg.ram_direction = 0 Cfg.mirror_y = 0 Cfg.mirror_x = 1 Config Graphlcd = Color, Controlport = Portc, Cs = 7, Rs = 4, Scl = 6, Sda = 5 Glcdcmd &H25 5
Glcddata 50 Glcdcmd &H36 Glcddata Cfg Glcdcmd &H21 'Glcdcmd &H20 Glcdcmd &H29 'dispaly on Cls Setfont Color16x16 'wybieramy dużą czcionkę 'UWAGA! podana nazwa to nie nazwa pliku z czcionk ą, ale nazwa czcionki zapisana w tym pliku Lcdat 1, 1, "Test 16", Black, White 'podajemy współrzę dne począ tku tekstu (lewy górny róg) 'nastę pnie tekst do wyś wietlenia, a potem kolor tekstu i kolor tła Lcdat 18, 1, "Test 16", Yellow, Red 'ten tekst bę dzie koloru żół tego na czerwonym tle Setfont Color8x8 'zmieniamy czcionkę na mniejszą Lcdat 36, 1, "Czcionka 8x8", Black, Lightgreen A = 123 S = "Liczba:" S = S + Str(a) Lcdat 45, 1, S, Black, White 'aby wyświetlić liczby musimy rę cznie przekonwertować je na tekst End $include "color16x16.font" $include "color8x8.font" 'na samym koń cu programu dołą czamy pliki czcionek 6
Edycja własnych czcionek Do pakietu BASCOM dołączono program pozwalający na edycję czcionek dla wyświetlaczy graficznych, podobnie jak to robiliśmy w przypadku definiowania własnych znaków dla wyświetlaczy tekstowych. Najpierw musimy aktywować edytor. Aby to zrobić klikamy kolejno Tools > Plugin Manager. W oknie, które się pokaże, zaznaczamy pole przy napisie fonteditor.bpl. Następnie klikamy OK, potem kolejno na Tools > Plugins > Font Editor. Pokazuje się nam okno edytora czcionki. 7
Do wyboru w menu File mamy następujące opcje: a) New tworzymy nową czcionkę, w wyświetlonym oknie podajemy kolejno nazwę czcionki (bez spacji i znaków specjalnych), wysokość i szerokość jednego znaku w pikselach, ilość znaków (maksymalny kod ASCII, na końcu kursu została załączona tablica kodów ASCII, która może okazać się pomocna podczas tworzenia własnych czcionek). Dla naszego wyświetlacza koniecznie zaznaczamy opcję Color. b) Open otwieramy istniejącą czcionkę do edycji, w tym trybie możemy edytować znaki istniejącej czcionki. Niestety nie możemy dodawać kolejnych znaków, ale za to możemy zastąpić istniejące, a nieużywane symbole np. polskimi znakami diakrytycznymi. c) Save zapisujemy wyedytowaną czcionkę d) Exit wyjście z programu Poza tym mamy do wyboru następujące opcje: a) Clear all wyczyść wszystkie piksele b) Set all zaznacz wszystkie piksele c) Clipboard kopiowanie do schowka (nie funkcjonuje poprawnie) d) Suggest zasugeruj wygląd znaku (nie zawsze działa poprawnie) 8
Dodatkowo za pomocą strzałek możemy przesuwać cały znak w polu czcionki. Aby wybrać dany znak do edycji należy kliknąć na niego w kolumnie po lewej stronie. Dodatkowo obok widzimy numer kodu ASCII. Poniżej zamieszczam przykładowy zrzut z edycji znaku ś, a później program wykorzystujący tak przygotowaną czcionkę. $regfile = "m644pdef.dat" '$regfile = "m32def.dat" '$regfile = "m16def.dat" $baud = 9600 $crystal = 16000000 $lib "lcd-pcf8833.lbx" Dim A As Byte Dim S As String * 15 Const Blue = &B00000011 Const Yellow = &B11111100 Const Red = &B11100000 Const Green = &B00011100 Const Black = &B00000000 9
Const White = &B11111111 Const Brightgreen = &B00111110 Const Lightgreen = &B01111100 Const Darkgreen = &B00010100 Const Darkred = &B10100000 Const Darkblue = &B00000010 Const Brightblue = &B00011111 Const Orange = &B11111000 'definiujemy kilka stał ych z kodami kolorów Const Mirror_x = 7 Const Mirror_y = 6 Const Ram_direction = 5 Const Line_order = 4 Const Color_mode = 3 Dim Cfg As Byte Cfg.color_mode = 1 Cfg.line_order = 0 Cfg.ram_direction = 0 Cfg.mirror_y = 0 Cfg.mirror_x = 1 Config Graphlcd = Color, Controlport = Portc, Cs = 7, Rs = 4, Scl = 6, Sda = 5 Glcdcmd &H25 Glcddata 50 Glcdcmd &H36 Glcddata Cfg Glcdcmd &H21 'Glcdcmd &H20 Glcdcmd &H29 'dispaly on Cls Setfont Color8x8 S = "Cze" + Chr(125) S = S + Chr(126) 'dodajemy wcześ nie zastą pione znaki, tak aby uzyskać tekst Cześć Lcdat 2, 2, S, Black, White End $include "color8x8v2.font" 'dołą czamy zmienioną czcionkę ze znakimi: ś - pozycja 125 i ć 126 10
Obrazki na wyświetlaczu graficznym Umiemy już rysować na naszym wyświetlaczu proste rysunki i wyświetlać na nim tekst. Jednak rysowanie bardziej skomplikowanego obrazu, czy wyświetlenie zdjęcia wymagałoby nie lada wysiłku i rysowania wszystkiego za pomocą pojedynczych punktów. Na szczęście do pakietu BASCOM dołączony jest program LCDConvert 3, który pozwala na rysowanie rysunków na komputerze (bardzo podobnie do programu PAINT) i konwersję plików *.bmp 4, *.ico lub *.gif do formatu obsługiwanego przez BASCOM. Aby narysować obrazek w menu Edit wpisujemy jego rozmiary i następnie rysujemy rysunek. Aby skonwertować obraz musimy wcześniej zmienić jego rozmiar na maksymalnie 132x132, a następnie otworzyć go klikając File > Open. Aby zapisać obrazek w obu przypadkach wybieramy File > Convert, potem File > Save -> Save Binary i wskazujemy miejsce do zapisania danych. Sposób wyświetlania zdjęć w programie przedstawia następujący program. $regfile = "m644pdef.dat" '$regfile = "m32def.dat" '$regfile = "m16def.dat" $baud = 9600 $crystal = 16000000 $lib "lcd-pcf8833.lbx" Dim A As Byte Dim S As String * 15 Const Blue = &B00000011 Const Yellow = &B11111100 Const Red = &B11100000 Const Green = &B00011100 Const Black = &B00000000 Const White = &B11111111 Const Brightgreen = &B00111110 Const Lightgreen = &B01111100 Const Darkgreen = &B00010100 Const Darkred = &B10100000 Const Darkblue = &B00000010 Const Brightblue = &B00011111 Const Orange = &B11111000 'definiujemy kilka stał ych z kodami kolorów Const Mirror_x = 7 Const Mirror_y = 6 Const Ram_direction = 5 Const Line_order = 4 Const Color_mode = 3 Dim Cfg As Byte 3 program znajdziemy w katalogu głównym programu BASCOM, możemy pobrać go także ze strony firmy MCS Electronics 4 pliki *.bmp importują się najlepiej. Podczas zapisywania pliku *.bmp (np. w programie Photoshop) koniecznie zaznaczmy opcje: tryb 8 bitów, kompresja RLE. Inaczej plik nie będzie mógł być konwertowany. 11
Cfg.color_mode = 1 Cfg.line_order = 0 Cfg.ram_direction = 0 Cfg.mirror_y = 0 Cfg.mirror_x = 1 Config Graphlcd = Color, Controlport = Portc, Cs = 7, Rs = 4, Scl = 6, Sda = 5 Glcdcmd &H25 Glcddata 50 Glcdcmd &H36 Glcddata Cfg Glcdcmd &H21 'Glcdcmd &H20 Glcdcmd &H29 'dispaly on Cls Do Showpic 0, 0, Obr2 'Wyś wietlamy obrazek 'Podajemy współrzę dne w których ma znaleźć się lewy górny róg obrazka, a nastę pnie etykietę wskazującą na plik ze zdjęciem Wait 2 Showpic 30, 30, Obr1 Wait 2 Showpic 0, 0, Obr3 Wait 2 Loop End Obr1: $bgf "test.bgc" 'po etykiecie dołą czamy plik ze zdjęciem Obr2: $bgf "foto.bgc" Obr3: $bgf "napis.bgc" 12
Obsługa joysticka Teraz przyszła pora na obsługę joysticka znajdującego się na płytce naszego wyświetlacza. Joystick ten jest połączony za pomocom drabinki rezystancyjnej. Dzięki temu mierząc napięcie na końcowym pinie możemy zidentyfikować w jaki sposób został on wciśnięty. Do odpowiednich pomiarów wykorzystamy oczywiście przetwornik analogowo-cyfrowy. A więc do dzieła. Na początek po prostu wyświetlimy wartość jaką przyjmuje przetwornik przy poszczególnych funkcjach. Podłączamy pin UP z wyświetlacza do ADC0 (PA0) naszego procesora. $regfile = "m644pdef.dat" '$regfile = "m32def.dat" '$regfile = "m16def.dat" $baud = 9600 $crystal = 16000000 $lib "lcd-pcf8833.lbx" Dim W As Word Dim S As String * 15 Const Mirror_x = 7 Const Mirror_y = 6 Const Ram_direction = 5 Const Line_order = 4 Const Color_mode = 3 Dim Cfg As Byte Cfg.color_mode = 1 Cfg.line_order = 0 Cfg.ram_direction = 0 Cfg.mirror_y = 0 Cfg.mirror_x = 1 Config Graphlcd = Color, Controlport = Portc, Cs = 7, Rs = 4, Scl = 6, Sda = 5 Glcdcmd &H25 Glcddata 50 Glcdcmd &H36 Glcddata Cfg Glcdcmd &H21 'Glcdcmd &H20 Glcdcmd &H29 'dispaly on Cls Config Adc = Single, Prescaler = Auto, Reference = Avcc 13
Start Adc 'konfigurujemy przetwornik Setfont Color8x8 Do W = Getadc(0) S = "ADC = " + Str(w) S = S + " " Lcdat 2, 2, S, Black, White Loop End $include "color8x8.font" W moim przypadku wartości wynoszą odpowiednio: 1023 Nic nie wciśnięte 0730 Przyciśnięcie joysticka 0501 W prawo 0325 W dół 0142 W lewo 0000 W górę Teraz możemy odpowiednio dobrać zakresy, dla których będziemy pewni, że dany klawisz został wciśnięty. Nie możemy polegać na konkretnych wartościach, gdyż (jak zapewne sami zauważycie) nieco wahają się one. $regfile = "m644pdef.dat" '$regfile = "m32def.dat" '$regfile = "m16def.dat" $baud = 9600 $crystal = 16000000 $lib "lcd-pcf8833.lbx" Dim W As Word Dim S As String * 15 Const Mirror_x = 7 Const Mirror_y = 6 Const Ram_direction = 5 Const Line_order = 4 Const Color_mode = 3 Dim Cfg As Byte Cfg.color_mode = 1 Cfg.line_order = 0 14
Cfg.ram_direction = 0 Cfg.mirror_y = 0 Cfg.mirror_x = 1 Config Graphlcd = Color, Controlport = Portc, Cs = 7, Rs = 4, Scl = 6, Sda = 5 Glcdcmd &H25 Glcddata 50 Glcdcmd &H36 Glcddata Cfg Glcdcmd &H21 'Glcdcmd &H20 Glcdcmd &H29 'dispaly on Cls Config Adc = Single, Prescaler = Auto, Reference = Avcc Start Adc 'konfigurujemy przetwornik Setfont Color8x8 Do W = Getadc(0) Select Case W Case 900 To 1023 : Lcdat 2, 2, "None ", 0, 255 Case 600 To 899 : Lcdat 2, 2, "Press", 0, 255 Case 400 To 599 : Lcdat 2, 2, "Right", 0, 255 Case 200 To 399 : Lcdat 2, 2, "Down ", 0, 255 Case 100 To 199 : Lcdat 2, 2, "Left ", 0, 255 Case 0 To 99 : Lcdat 2, 2, "Up ", 0, 255 End Select Loop End $include "color8x8.font" Całość oczywiście możemy ująć w odpowiednią funkcję, a dodatkowo dodając kilka stałych możemy sami określać jakie wartości mają być zwracane przy poszczególnych funkcjach. $regfile = "m644pdef.dat" '$regfile = "m32def.dat" '$regfile = "m16def.dat" $baud = 9600 $crystal = 16000000 $lib "lcd-pcf8833.lbx" 15
Dim A As Byte Dim S As String * 15 Const Mirror_x = 7 Const Mirror_y = 6 Const Ram_direction = 5 Const Line_order = 4 Const Color_mode = 3 Dim Cfg As Byte Cfg.color_mode = 1 Cfg.line_order = 0 Cfg.ram_direction = 0 Cfg.mirror_y = 0 Cfg.mirror_x = 1 Const J_channel = 0 'kanał ADC, do którego podpię to Joystick Const J_none = 1 Const J_up = 2 Const J_down = 3 Const J_right = 4 Const J_left = 5 Const J_press = 6 'wartoś ci zwracane przy poszczególnych funkcjach Declare Function Joystick()as Byte Dim Names(6) As String * 5 Names(1) = "None " Names(2) = "Up " Names(3) = "Down " Names(4) = "Right" Names(5) = "Left " Names(6) = "Press" 'zapisujemy teksty w tablicach Config Graphlcd = Color, Controlport = Portc, Cs = 7, Rs = 4, Scl = 6, Sda = 5 Glcdcmd &H25 Glcddata 50 Glcdcmd &H36 Glcddata Cfg Glcdcmd &H21 'Glcdcmd &H20 Glcdcmd &H29 'dispaly on Cls Config Adc = Single, Prescaler = Auto, Reference = Avcc Start Adc 'konfigurujemy przetwornik 16
Setfont Color8x8 Do A = Joystick() Lcdat 2, 2, Names(a), 0, 255 Loop End Function Joystick() As Byte Local Ad As Word Ad = Getadc(j_channel) Select Case Ad Case 900 To 1023 : Joystick = J_none Case 600 To 899 : Joystick = J_press Case 400 To 599 : Joystick = J_right Case 200 To 399 : Joystick = J_down Case 100 To 199 : Joystick = J_left Case 0 To 99 : Joystick = J_up End Select End Function $include "color8x8.font" Podsumowanie Teraz wykorzystaną wiedzę możemy wykorzystać w dowolny sposób. Załączam przykładowy kod zegarka analogowego wykorzystującego naszą płytkę i wyświetlacz. 17