[1] Bezpłatna biblioteka graficzna Microchip Graphics Library dla mikrokontrolerów PIC24 i PIC32: jak zacząć i pierwsze przykłady
Warstwa Device Driver Layer
Jest to warstwa dostarczająca funkcji odpowiadających za obsługę sterownika wyświetlacza. Sterowniki kolorowych matryc LCD TFT są produkowane przez różne firmy. W ofertach tych firm można spotkać wiele różniących się między sobą sterowników. Różnice wynikają z zastosowanego interfejsu komunikacyjnego, możliwości obsłużenia matryc o innych rozdzielczościach i głębiach koloru, funkcjami obsługi palety koloru itp. Każdy z typów sterownika nawet z obrębie jednej firmy musi mieć napisane własne procedury inicjalizacji i funkcje odpowiadające z podstawowe operacje na pikselach matrycy. Biblioteka standardowo obsługuje zestaw bardziej lub mniej popularnych sterowników, a jeżeli wyświetlacz ma inny sterownik to użytkownik musi sobie samodzielnie napisać oprogramowanie tej warstwy. Microchip dostarcza tez dwa własne programowe sterowniki matryc LCD. Jeden wykorzystujący na mikrokontroler PIC24FJ256DA210, a drugi mikrokontrolery rodziny PIC32MX. Piny mikrokontrolerów sterują bezpośrednio wyprowadzenia RGB wyświetlacza, a funkcje biblioteki graficznej są uruchamiane bezpośrednio na mikrokontrolerze sterownika. W tabeli 1 zestawiono typy sterowników obsługiwanych przez standardowe drivery biblioteki.
Tab. 1. Typy driverów LCD obsługiwanych przez bibliotekę graficzną firmy Microchip
Typ kontrolera |
Producent |
Interfejs |
Driver |
PIC24FJ256DA210 |
Microchip |
RGB |
mchpGfxDrv.c, mchpGfxDrv.h |
PIC32MX |
Microchip |
RGB |
mchpGfxLCC.c, mchpGfxLCC.h |
LGDP4531 |
LG |
8/16 bit PMP |
drvTFT001.c, drvTFT001.h |
R61505U/R61580 |
Renesas |
8/16 bit PMP |
drvTFT001.c, drvTFT001.h |
SPDF5408 |
Orise Technology |
8/16 bit PMP |
drvTFT001.c, drvTFT001.h |
S1D13517 |
Epson |
8/16 bit PMP |
S1D13517.c, S1D13517.h |
S1D13522 |
Epson |
8/16 bit PMP SPI |
S1D13517.c, S1D13517.h |
SSD1926 |
Solomon Systech |
8/16 bit PMP |
SSD1339.c, SSD1339.h |
SSD1289 |
Solomon Systech |
8/16 bit PMP |
SSD1926.c, SSD1926.h |
SSD1339 |
Solomon Systech |
8 bit PMP |
SSD1339.c, SSD1339.h |
SSD1303 |
Solomon Systech |
8 bit PMP |
SH1101A_SSD1303.c, SH1101A_SSD1303 |
SSD1305 |
Solomon Systech |
8 bit PMP |
SSD1305.c, SSD1305.h |
SSD2119 |
Solomon Systech |
8/16 bit PMP |
drvTFT002.c, drvTFT002.h |
SH1101A |
Sino Wealth |
8 bit PMP |
SH1101A_SSD1303.c, SH1101A_SSD1303.h |
ST7529 |
Sitronix |
8 bit PMP |
ST7529.c, ST7529.h |
HIT1270 |
Hitech Electronics |
8 bit PMP |
HIT1270.c, HIT1270.h |
ILI9320 |
Ilitek |
8/16 bit PMP |
drvTFT001.c, drvTFT001.h |
HX8347 |
Himax |
8/16 bit PMP |
HX8347.c, HX8347.h |
UC1610 |
UltraChip |
8 bit PMP |
UC1610.c, UC1610.h |
Na rysunku 3 pokazano strukturę plików wykorzystywanych przez warstwę Device Driver Layer
Rys. 3. struktura plików warstwy Device Driver Layer
Jeżeli w projekcie wykorzystamy sterownik wyświetlacza z listy pokazanej w tabeli 1, to ta warstwa nie zawiera z punktu widzenia programisty niczego interesującego. Przy pisaniu aplikacji trzeba zainicjować sterownik wyświetlacza i wszystko powinno działać pod warunkiem, że sprawny jest sprzęt. Jeżeli mamy wyświetlacz z innym sterownikiem, to trzeba znać dokładnie działanie i programowanie sterownika wyświetlacza i samemu napisać szereg funkcji stanowiących warstwę Device Driver Layer. Najważniejsze z nich to:
- Reset Device() – funkcja inicjalizuje wyświetlacz. Inicjalizacja polega na zapisaniu rejestrów sterownika z niezbędnymi ustawieniami,
- GetMaxX() – zwraca maksymalną współrzędną X wyświetlacza,
- GetMaxY() – zwraca maksymalną współrzędną Y wyświetlacza,
- SetColor() – ustawienie koloru rysowania,
- GetColor() – zwraca aktualnie ustawiony kolor rysowania,
- PutPixel() – ustawia parametry piksela na ekranie,
- GetPixel() – zwraca kolor piksela,
- PutImage() – Przetwarzanie grafiki i jej rysowanie na ekranie – działanie tej funkcji jest zależne od użytego formatu koloru,
- IsDeviceBusy() – sprawdzenie czy można do sterownika wysłać nową komendę,
- SetPalette() – ustawia rejestry palety kolorów.
Wszystkie funkcje są dokładnie opisane w pliku pomocy. Można też obejrzeć pliki źródłowe funkcji warstwy Device Driver dla wspieranych wyświetlaczy i na ich podstawie napisać własne.
Warstwa Graphics Primitive Layer
W tej warstwie są zawarte funkcje rysowania podstawowych elementów graficznych: linii, prostokątów, okręgów, ustawianie kursora, operacji na bitmapach i definiowania gradientu wypełnienia obszaru kolorem. Bardzo ważnym elementem tej warstwy jest wyświetlanie znaków alfanumerycznych (tekstu). W pliku pomocy są opisane wszystkie funkcje warstwy Graphics Primitive Layer (rysunek 4). Trzeba jednak pamiętać, że te funkcje mogą w pewnych okolicznościach nie dawać pełnej programowej kontroli nad rysowanymi elementami.
Rys. 4. Struktura plików warstwy Primitive Layer
Funkcje rysowania linii
Warstwa Graphics Primitive Layer zawiera funkcje do rysowania 3 rodzajów linii:
- ciągłej SOLID_LINE,
- z punktów DOTTED_LINE,
- z odcinków DASHED_LINE.
Do ustawiania typu linii jest zdefiniowane makro SetLineType(lnType). Podstawowa funkcja rysująca linie to Line(x1, y1, x2, y2), gdzie:
- x1, y1 – współrzędne początku linii (odcinka),
- x2, y2 – współrzędne końca odcinka.
Funkcja w trybie Non Blocking zwraca 0, kiedy rysowanie nie jest zakończone i 1 kiedy rysowanie jest zakończone. W trybie Blocking zawsze zwraca 1. Linie mogą być rysowane z dwoma grubościami; 1 piksela (NORMAL_LINE) i 3 pikseli (THICK_LINE), co można ustawić za pomocą makra SetlineThickness(lnThickness).
Na listingu 2 pokazano fragment programu rysującego 3 różne linie w 3 różnych kolorach z ustawionym trybem Blocking.
List. 2. Program rysujący 3 rodzaje linii na ekranie
SetLineType(4);//DASHED LINE SetLineThickness(1); //3 piksele SetColor(RGBConvert(96, 252, 0));//ustawienie koloru – Zielony while(!Line( 29, //x1 //rysuj linię 103, //y1 130, //x2 193 //y2 ) ); SetLineType(0); SOLID LINE SetLineThickness(1);//3 piksele SetColor(RGBConvert(48, 48, 248));//niebieski while(!Line( 151, //x1 //rysuj linię 31, //y1 151, //x2 172 //y2 ) ); SetLineType(1); DOTTED LINE SetLineThickness(1);//3 piksele SetColor(RGBConvert(248, 0, 0));//czerwony while(!Line( 202, //x1 //rysuj linię 70, //y1 251, //x2 70 //y2 ) );
Wynik działania procedur z listingu 2 jest pokazany na fotografii 5.
Rys. 5. Efekt wykonania funkcji rysowania linii z listingu 2