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

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



