15088 Image157 (2)

15088 Image157 (2)



■ Programowanie


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.

Rysowanie obrazka

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.

Pisanie tekstu

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.

Sprzętowy SPI

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


Wyszukiwarka

Podobne podstrony:
89756 Image151 Programowanie Listing 1S rozwinięty program obsługi wyświetlacza LED oraz klawiatury
Image187 program należy podzielić na dwie części, zorganizowane w sposób uniemożliwiający jednoczesn
Image1 Program wjęzyku Java
Instukcja odblokowania nieużywanej pamięci RAM Po uruchomieniu programu kliknij jak na kolejnych obr
21586 skanuj0025 Frostig M., David H.: Program rozwijający percepcję wzrokową. Wzory i obrazki. Pols
Poznaj C++ w$ godziny0125 Zaawansowane sterowanie programem Listing 8.6. Pomijanie pętli while 1:
image19 GDZIE MIESZKAJĄ ? •    Nazwij zwierzęta na obrazkach i połączje Unią z odpowi
cz2 Programowanie Listing 7 Poprawa programu (...) COMPORT = LEDPORT = (l«COMl) ; (1«LED_B
cz5 3 Programowanie Listing 22 LCD: komendy sterujące U Komendy sterujące wyświetlaczem #define
cz5 6 Programowanie Programowanie listing 29 Pisanie na LCD. LCDstr("W-jtaj!");
cz7 Programowanie Listing 57— wykorzystanie funkcji printf int main(void) l ■int a - 1234; int b
cz8 Programowanie I Listing 68 ■ fcheat_iPodsumowanie rozwiązania Możesz uznać teraz, że C jest str

więcej podobnych podstron