Obsługa kolorowego wyświetlacza LCD-TFT 320×240 za pomocą mikrokontrolera STM32
Teraz można napisać właściwe procedury emulacji magistrali. Będziemy potrzebowali funkcji zapisu komendy WrCmd, zapisu danej WrData – listing 5.
List. 5. Procedury zapisu komendy i danej
//zapisz komende void WrCmd(unsigned char cmd){ ClrP(CS); SetP(RD); ClrP(A0); //RS=0 BusWrite(cmd); ClrP(WR); SetP(WR); SetP(CS); } //zapisz dana void WrData(unsigned char data){ ClrP(CS); SetP(RD); SetP(A0); //RS=1 BusWrite(data); ClrP(WR); SetP(WR); SetP(CS); }
Procedura zapisu pozycji na ekranie (adresu piksela) została pokazana na listingu 7. Argumentami są współrzędne x i z zakresu 0…319 (liczba 16-bitowa) oraz y – z zakresu 0…239 (liczba 8-bitowa).
List. 6. Ustalenie pozycji na ekranie
void WrAddr(unsigned int x, unsigned char y) { unsigned char xh, xl; xh=x>>8; xl=x; WrCmd(xh); WrCmd(xl); WrCmd(y); }
Nie ma tu zabezpieczeń przed przekroczeniem zakresu i użytkownik sam musi zadbać o poprawność określenia pozycji piksela. Dana określająca kolor piksela ma format pokazany na rysunku 2.
Rys. 2. Format danej określającej kolor piksela
Kolor czerwony i zielony jest zakodowany na 3 bitach, a kolor niebieski na 2 bitach. Mając do dyspozycji funkcje zapisu danych i ustalenia pozycji na ekranie zapisywanej danej można napisać funkcje zapisującą bitmapę do wyświetlacza. Na listingu 7 pokazano procedurę wyświetlającą bitmapę o wymiarach 240×320 pikseli zapisanej w tablicy bmp[].Wynik działania tej procedury pokazano na fotografii 3.
Fot. 3. Efekt działania procedury z listingu 7
List. 7. Procedura wyświetlająca pełnowymiarową bitmapę
void SendFullBmp(void) { unsigned short x, y; for(y=0;y<240;y++) { WrAddr(0,y); for(x=0;x<320;x++) WrData(bmp[(y*320)+x]); } }
Pełnowymiarowe bitmapy są używane rzadko. Dużo częściej trzeba wyświetlać mniejsze obiekty graficzne. Dlatego potrzebujemy procedur wyświetlających bitmapy o dowolnym rozmiarze i w dowolnym miejscu wyświetlacza. Oczywiście ta dowolność jest ograniczona rozmiarami matrycy. Procedura z listingu 8 wyświetla bitmapę od pozycji określonej w argumentach x i y i o wymiarach określonych w argumentach dx i dy. Ponieważ na ekranie można umieścić kilka bitmap, to argument bmp przekazuje wskaźnik tablicę z wyświetlaną bitmapą.
List. 8. Procedura wyświetlenia dowolnej bitmapy
void SendBmp(const unsigned char *bmp, short x, short y, short dx, short dy) { unsigned short i, j; for(i=y;i<y+dy;i++) //wyświetlanie wierszy { WrAddr(x,i); for(j=x;j<x+dx;j++)//wyświetlanie pikseli w wierszu WrData(bmp[((i-y)*dx)+j-x]); } }
Fot. 4. Przykład wyświetlenia dowolnej bitmapy