Listing 167 Wczy tywanie obrazka z pamięci FLASH
vo1d led Loari(proq_uint8 L* pData, uint8_t x, uintŚ c y, uint8_t sx, uintB t sy)
{
uint8 t xsnt;
for(;Syl-0;sy-)
l
// ustawienie adresu lcd_GoTo(x, y);
// Od razj zwiększam y na przyszłość
■H-y!
// Przesyłam linię
for(xcnt*sx; :<cntl«0; xrnt-)
ł
led Sena(pgm_read_byt.e(pData-H-));
I
ł
Lis tirfj 168 Wywołanie funkcji icd_Load
icd_Luad((prog_uinL8_t*)iir>3, o, 0, KŁBMS(img[0]), ELEMS(img));
Idea rozwiązania Pisanie tekstu
laczu powinny pojawić się dość fantazyjne wzory. Jeśli na ekranie nic się nie pojawiło skontroluj część sprzętową.
Uwaga: Jeśli w poprzedniej części pisałeś program bootloadera, to aktualnie masz dwie możliwości wpisania programu do procesora:
1. Przez bootloadcr - w takim przypadku, jeśli bootloader został prawidłowo skonfigurowany, możesz pracować na nim bez zmian.
2. Przez programator szeregowy w takim przypadku pamiętaj o wyzerowaniu bitu konfiguracyjnego BOOTRST.
Gdy tylko udało nam się uruchomić wyświetlacz, wszystkie jego możliwości stoją przed nami otworem. Zacznijmy od prostego rysowania obrazka z pamięci FLASH na ekranie. Dane z obrazka będą odwzorowywać w bezpośredni sposób dane, które mają być przesłane do wyświetlacza. Naszym zadaniem jest jedynie odpowiednie ustawianie adresów oraz przesyłanie danych pobranych z pamięci. Tak zdefiniowany obrazek w zasadzie nie nadaje się do ręcznej edycji. Aby ułatwić sobie i czytelnikom zadanie, napisałem specjalną aplikację realizującą zamianę bitmapy na dane inicjujące odpowiednią tablicę dwuwymiarową. Prugiam len będzie dostępny na stronie Elportalu razem z kodem źródłowym.
Funkcję wyświetlającą tak spreparowane obrazki przedstawia listing 167. Aby była ona kompilowana prawidłowo, w pliku lcd33J0Ji dołącz nagłówek <ayr/pgmspace h> Funkcja ta została zbudowana w tak i sposób, że umoż-liwia wyświetlenie w dowolnym miejscu ekranu obrazka o dowolnym rozmiarze. Należy zdawać sobie sprawę, że w tak prostym rozwiązaniu „dowolność” w pionie jest ograniczona przez sposób działania wyświetlacza. Adres y jest podawany w bajtach, a nie bezpośrednio w liniach. Funkcja nie pilnuje tego, czy obrazek nie wystaje poza obszar ekranu. Jeśli tak się stanie, obrazek będzie „zawinięty” na drugą stronę wyświetlacza.
Wywołanie funkcji lcd_Load może wyglą dać tak jak na listingu 168. W przykładzie img to dwuwymiarowa tablica utworzona przez wspomniany program realizujący konwersję. Makro ELEMS nie powinno Ci być już obce. W tym przypadku umożliwia ono odzyskanie informacji o wymiarach kopiowanego obrazka na podstawie wymiarów tablicy.
Rysowanie obrazków daje bardzo ciekawe efekty. Zmieniając obrazki kilka, kilkanaście razy na sekundę uzyskamy wrażenie animacji. Można sobie nawet wyobrazić program, któremu taka możliwość wystarczy'. Często jednak cenna okazuje się możliwość napisania dowolnego tekstu. Jak już wspominałem, nasz wyświetlacz nie posiada wbudowanego generatora znaków. Oznacza to, że każdą literkę będziemy rysować w pedobny sposób, jak rysowaliśmy dowolny obrazek. Po szczegóły odsyłam do odpowiedniej ramki. Listing 169 pokazuje funkcję realizującą wyświetlenie jed nego znaku. Stąd do wypisania całego tekstu już prosta droga, co udowadnia listing 170.
Bardziej dociekliwi Czytelnicy zauważą, że drukujemy napis z pamięci RAM. Zwykle
Najprostszy chyba sposób pisania tekstu na wyświetlaczu z telefonu NOKIA33IO opiera siq na założeniu, że każdy znak ma ściśle określony wymiar. W naszym przypadku bedzie to 8x5 piksel:. Wszystkie znak zebrane są w tym przypadku w sporą tablicę, składającą się z elementów w postaci pięciu ośinioaitowych liczb.
Przyznam szczerze, że nie tworzyłem tablicy znaków samodzielnie. W sieci jest wystarczająco dużo kodów zawierających gotowe tablice. Zawsze istnieje możliwość dopisania znaków, które będą nam potrzebne, a jest to dużo łatwiejsze niz tworzenie tablicy znaków od podstaw.
tworzyliśmy też bliźniacza funkcję drukującą napisy bezpośrednio z pamięci FLASH. Tym razem utworzenie odpowiedniej funkcji pozostawiam chętnym. Jest to bardzo proste zadanie.
Wspomniałem o tym, żc do końca naszej tablicy możemy dodać polskie znaki. Raczej nie ma sensu umieszczać polskich znaków, tak aby były dostępne bezpośrednio w łańcuchach. Lepiej będzie posłużyć się w łańcuchu podaniem odpowiedniego kodu. Polskie znaki co prawda znajdują się w tabeli ASCII, ale są one rozsiane po końcowych kodach. Ostatnia litera ,o’ ma kod 0xF3. Oryginalnie nasza tablica kończy się znakiem ,z c kodzie 0x7A
Na pewno jednak w dobry nastrój powinno wprowadzić nas to. żc własnych znaków możemy zdefiniować w zasadzie dowolną ilość i nie będzie konieczności stosowania sztuczek, rodzaju dynamicznego ich przydzielania.
Spróbuj samodzielnie rozszerzyć tablice o własne znaki. Propozycja rozwiązania, pojawi się na stronie Elportalu. Aktualna tablica znaków nic będzie rozwijana w ramach kursu - następnym razem będziemy pisać w' nieco inny sposób.
Do tej pory nie wykorzystaliśmy tego. że procesor zestawu AVT3505 posiada sprzętowy interfejs SPI, który może być wykorzystany do komunikacji z wyświetlaczem. W celach eksperymentalnych proponuję napisać teraz program w taki sposób, aby umożliwiał przełączanie się między opcją ze sprzętowym i programowym interfejsem szeregowym. Umożliwi to porównanie wydajności obu rozwiązań. Zmiany w funkcji lcd_Scnd przedstawia listing 171. Listing 172 przedstawia natomiast część kodu odpowiedzialną za inicjację sprzętowego interfejsu SPI. W ustawionym trybie pracy, przy taktowaniu procesora zegarem 8MHz, dane będą wysyłane interfejsem szeregowym z zegarem 4MIIz. Jest to maksymalna szybkość, jaką przyjmuje PCD8544.
Za każdym razem, gdy trzeba wypisać znak na ekranie, przeprowadzana jest analiza drukowanego symbolu. Definicja znaków w tablicy zaczyna się ud spacji, k-.óra ma kod 32. Brak definicji niższych znaków jest związany z tym, że w standardzie ANSI są to znaki niedrukowąlne.
7. drugiej strony, zakres możliwych do wypisaniu znaków jest ograniczony rozmiarem tablicy. Jeśli znak który' ma być wydrukowany, wykracza poza którąkolwiek z tych granic, jest zamieniany na symbol hash ('#’).
Gdy do wyświetlacza zostaną przesłane już wszystkie dane znaku, dodawany jot jeszcze jeden bajt pusty, realizujący odstęp między znakami. Brzmi to prosto? Listingi 169 oraz 170 udowadniają, żc to jest proste
44 Listopad 2006 EleKtronika dla Wszystkich