Obsługa kolorowego wyświetlacza TFT z telefonu Samsung GT-S5230 Avila (2)

Obsługa kolorowego wyświetlacza TFT z telefonu Samsung GT-S5230 Avila (2)
Pobierz PDF Download icon

W poprzednim artykule opublikowanym w EP 12/2016 zaprezentowaliśmy podstawowe funkcje służące do inicjalizacji, wyświetlania punktów oraz rysowania podstawowych elementów ? teraz zajmiemy się wyświetlaniem znaków oraz komunikatów.

Przyszedł czas na obsługę ostatniego elementu interfejsów graficznych – czcionek ekranowych. Aby jednak umożliwić wygodną obsługę wielu czcionek ekranowych, konieczne było wprowadzenie nowego typu danych – jego definicję pokazano na listingu 7. Bazując na tak zdefiniowanej strukturze, wprowadzono funkcję, która korzystając ze zmiennej globalnej static fontDescription CurrentFont pozwala na ustawienie bieżącej czcionki ekranowej. Tę funkcję pokazano na listingu 8, natomiast na listingu 9 pokazano funkcję umożliwiającą rysowanie znaków przy użyciu bieżącej czcionki ekranowej. Korzysta ona z argumentu uint8_t Transparency, od którego zależy, czy tło bieżącej czcionki ekranowej będzie określone wartością globalnej zmiennej uint16_t Background (w takim wypadku wartość argumentu Transparency jest równa SOLID_TEXT), czy też tło wyświetlanej czcionki będzie przeźroczyste (wartość argumentu Transparency równa TRANSPARENT_TEXT). Na bazie tej funkcji wprowadzono dwie nowe, umożliwiające wyświetlenie ciągu znaków zapisanego w pamięci RAM lub w pamięci programu (Flash) – pokazano je na listingu 10.

Do wygenerowania plików zawierających wzorce czcionek, oparte na czcionkach systemu Windows, polecam doskonały program PixeLab autorstwa Marcina Popławskiego. Szczegółowy opis programu zamieszczono w Elektronice Praktycznej 6/2015.

W tym miejscu przedstawię jeszcze jedną funkcję, której zadaniem jest wyświetlenie liczby typu uint16_t (tu z zakresu 0…9999) przy użyciu bieżącej czcionki ekranowej. Zadanie tego typu wydaje się być bolączką większości początkujących programistów, którzy w tym celu, zupełnie na siłę, starają się użyć standardowej funkcji printf(). Oczywiście można i tak, lecz płacimy za tę uniwersalność wysoką cenę wzrostem wielkości kodu wynikowego o dobre 1,5 kB. Co gorsze, wiele osób łączy wywołanie tejże funkcji z wyświetlaniem liczb zmiennoprzecinkowych, co jeszcze bardziej „demoluje” kod wynikowy. Ze swojej, ponad 8-letniej praktyki, mogę powiedzieć jedno – poza nielicznymi wyjątkami dotyczącymi zwykle tematyki DSP, nie ma potrzeby używania liczb zmiennoprzecinkowych w aplikacjach wbudowanych, zwłaszcza tych wykorzystujących mikrokontrolery AVR. Po dogłębnej analizie okazuje się zwykle, że wyniki obliczeń jesteśmy w stanie przekazać w formacie całkowitym z odpowiednio przedstawionym przecinkiem. Właśnie do tego celu wykonano funkcję TFTdrawInteger(), którą pokazano na listingu 11. Nie jest to funkcja uniwersalna, bo taka wzorem printf() musiałaby być bardzo rozbudowana, jednak w większości wypadków zupełnie wystarczająca. Funkcja ta przyjmuje następujące argumenty wymagające dodatkowego komentarza:

uint8_t Digits – określa liczbę cyfr, przeznaczonych do wyświetlenia (1…4).

uint8_t Effects – pozwala na specyfikację miejsca położenia przecinka (stałe DOT_POS3…DOT_POS1), przy czym samo wyświetlenie przecinka pozostaje zadaniem po stronie aplikacji użytkownika.

Co więcej, zamieszczenie argumentu Effects pozwala na specyfikację niezbędnego odstępu pomiędzy znakami, które to mają być rozdzielone wspomnianym wcześniej przecinkiem (bity 5…0 tego argumentu). Poniżej przedstawiono przykłady użycia funkcji TFTdrawInteger() z rezultatem jej działania. Zakłada się, że przecinek zostanie wyświetlony na ekranie w wyniku działania aplikacji użytkownika. Sama funkcja zapewnia „wyłącznie” miejsce na wyświetlenie przecinka oraz zajmuje się „logiką” wyświetlania zera umieszczonego przed przecinkiem, jeśli występuje:

TFTdrawInteger(10, 100, 1234, 4, DOT_POS3|5); – „1.234” (odstęp pomiędzy „1” a „2” powiększony o 5 pikseli).
TFTdrawInteger(10, 120, 234, 3, DOT_POS1|3); – „23.4” (odstęp pomiędzy „3” a „4” powiększony o 3 piksele).
TFTdrawInteger(10, 120, 4, 2, DOT_POS1|4); – „0.4” (odstęp pomiędzy „0” a „4” powiększony o 4 piksele).
TFTdrawInteger(10, 140, 4, 2, NO_DOTS); – „ 4”.

W tym miejscu pora na przysłowiową „wisienkę na torcie”. Wcześniej, na listingu 6 pokazano funkcję umożliwiającą wyświetlenie na ekranie wyświetlacza TFT obrazka zapisanego w pamięci Flash mikrokontrolera. Jest to rozwiązanie nieskomplikowane, jednak obarczone pewną wadą. Jak łatwo się domyślić, tak przygotowane obrazki zajmują sporo cennej pamięci programu, przez co jest niemożliwe korzystanie z wielu tego rodzaju elementów w procesorach o ograniczonej wielkości pamięci programu, jak dla przykładu, mikrokontrolery AVR. Jak temu zaradzić? Odpowiedź wydaje się dość prosta – należy zastosować metodę kompresji powtarzających się danych, co pozwoli na ograniczenie rozmiaru tablicy przechowującej treść obrazu. Ideę działania zastosowanego algorytmu kompresji najlepiej jest prześledzić analizując przykładowe ciągi słów 16-bitowych reprezentujących kolory kolejnych pikseli obrazu (założono powtarzanie się pikseli o kolorze 0xAAAA), które to przedstawiono w tabeli 2.

Jak widać, idea działania wspomnianego algorytmu jest niezwykle prosta, a pomimo tego, dla obrazków o dużych obszarach jednolitych kolorów, osiągany stopień kompresji jest całkiem spory, co pozytywnie wpływa na użycie pamięci Flash mikrokontrolera. Wymownym dowodem powyższej tezy jest rysunek 3, na którym przedstawiono obrazek i wynikową tablicę elementów 16-bitowych, reprezentującą jego treść w wypadku stosowania jak i niestosowania wspomnianego algorytmu kompresji obrazu.

Do „pełni szczęścia” brakuje nam dedykowanej aplikacji, za której pomocą dokonamy konwersji pliku BMP do postaci tablicy języka C (o wspomnianej wcześniej organizacji danych) i która to dodatkowo umożliwi nam skompresowanie obrazka wedle powyższego algorytmu. Na szczęście napisanie takiej aplikacji nie jest rzeczą zbyt skomplikowaną. Specjalnie na potrzeby tego projektu napisałem aplikację, która realizuje wymaganą funkcjonalność – pokazano ją na rysunku 4. Myślę, że przedstawione oprogramowanie jest na tyle proste i czytelne, iż nie wymaga dodatkowego słowa komentarza. Jedyne, czego potrzebujemy to funkcja, która umożliwi nam wyświetlenie na ekranie wyświetlacza TFT tak skompresowanego obrazka – pokazano ją na listingu 12.

Płytka ewaluacyjna

To tyle, jeśli chodzi o obsługę naszego, niezmiernie ciekawego wyświetlacza TFT. Na rysunku 5 pokazano schemat ideowy płytki ewaluacyjnej, która umożliwia przetestowanie możliwości wyświetlacza GT-S5230, zanim zastosujemy go w docelowej aplikacji. Przypomnijmy, że płytka jest dostępna w ofercie AVT (numer kitu AVT-5563). Zastosowany typ mikrokontrolera nie jest „krytyczny” i wynika wyłącznie z faktu dysponowania odpowiednią liczbą wyprowadzeń I/O i dużą częstotliwością taktowania przy napięciu zasilania równym 3,3 V. Jako dodatkową funkcjonalność wprowadzono możliwość sterowania jasnością podświetlenia wyświetlacza TFT (tranzystor T1 i wyprowadzenie OC2A mikrokontrolera, na którym sprzętowo możemy generować przebieg PWM) oraz dodatkowy przycisk SW do użycia w aplikacji użytkownika.

Kończąc mam nadzieję, że ten krótki artykuł spowoduje, iż konstruktorzy coraz częściej będą sięgali po wyświetlacz TFT, zamiast stosowania prostych wyświetlaczy alfanumerycznych o znacznie ograniczonej funkcjonalności. Przecież jego cena nie pozostawia złudzeń odnośnie do tego, jakiego rodzaju element powinniśmy wybrać.

Robert Wołgajew, EP

 

W ofercie AVT jest dostępna płytka ewaluacyjna umożliwiająca przyłączenie wyświetlacza opisywanego w artykule. Numer kitu AVT-5563.

 


Artykuł ukazał się w
Elektronika Praktyczna
styczeń 2017
DO POBRANIA
Pobierz PDF Download icon
Materiały dodatkowe
Zobacz też
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik lipiec 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio lipiec 2020

Świat Radio

Magazyn użytkowników eteru

APA - Automatyka Podzespoły Aplikacje lipiec 2020

APA - Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna lipiec 2020

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich lipiec 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów