LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

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 WrDatalisting 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

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

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

Fot. 4. Przykład wyświetlenia dowolnej bitmapy

Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC. Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.