Image214

Image214



Programowanie

Programowanie

Listing 29 Pisanie na LCD.

LCDstr(“Witaj!"); LCDcoimiśnd(LCDC_3DA|64); LCDstr("Napis z łańcucha");


Listing 30 Wykorzystanie wskaźnika.

void LCDatr(char* otc)

{

while( 0 1= *str ) LCDdata(*(str++));

}


Listing 31 Optymalizacja funkcji z listingu 30.

VOid LCDstr(Char* str)

{

char znak;

while(C !- (znak = *(str-H-))J

LCDdata(znak);

}


Listing 32 Pisanie na wyświetlaczu bezpośrednio Z pamięci programu.

VOid LCDstr P(prog char* str)

{

char znak; while(0 I* (znak = pgm_read_by te (s z r-ł-f) ) ) LCDdata(znak)\

}


Listing 33 Zmiana n funkcji main.

LCDstr_F(PSTR("Wi taj!"))J LCDcoiaiidiia(LCDC_DDA |64); LCUStr_t(PSTK("LdncUCh L FLASHd’));


Listing 34 Sposób na pozbycie się zbędnych ostrzeżeń.

LCDstr_F((prog_char*)PSTR("Wltaj!”)); LCDcommand(LCDC_DDA|64);

LCDscr_F((prog_char*)PSTRO Łańcuch z FLASHa’));


Ciąg da!sz\> ze strony 40.

Spójrz na listing 28. Przedstawiam na nim prostą funkcją wyświetlającą podany łańcuch. Umieść ja pod koniec funkcji dotyczących wyświetlacza zaraz za funkcją LCDinit. Funkcja nie jest idealna jeśli chodzi o wydajność, jednak jest to bardzo proste rozwiązanie i na pewno działa. Myślą, że po wszystkich informacjach zawartych w ramce o napisach kod nie wymaga już dodatkowych wyjaśnień. Utworzoną właśnie funkcją możemy wywołać w programie jak na listingu 29. K.od ten powinien zastąpić zestaw wywołań funkcji LCDdata pierwotnie umieszczonych w funkcji main Dodatkowo wykorzystana została tutaj komenda wywołująca przejście do nastąpnej linii. Bezpośrednie wybranie adresu nie wygląda może tak ładnie jak podanie oddzielnie linii i kolumny, jednak zajmuje mniej zasobów, a nie wymaga wiele wiącej uwagi ze strony programisty - wystarczy pamiętać, że nasza druga linia zaczyna sią od adresu 64.

Wskaźniki

Sposobem poprawy działania programu jest wykorzystanie większej ilości informacji o wskaźnikach. Jak zwykle w takich momentach odsyłam Cią do stosownej ramki ABC... C. Po jej przeczytaniu listing 30 nie powinien wymagać już tłumaczenia. Program z listingu 30 można jeszcze poprawić. Dziąki temu, że zmienna lokalna będzie przechowywana cały czas w rejestrze, listing 31 wygeneruje odro-b.nę mniejszy i szybszy kod.

ABC... C Wskaźniki

Idea

Do tej pory powoli oswajałem Cię z istnieniem takiegc tworu jak wskaźniki. Może przekonałeś sią już, że nie jest to nic strasznego - po prostu zmienna zawierająca adres innej zmiennej.

Podstawy

Zmienną wskaźnikową tworzymy jak poniżej:

int *pi;

Przykład ten pokazuje utworzenie wskaźnika na zmienną typu int. Można go czytać w mnemotechniczny sposób, że zapis *pi jest traktowany jak zmienna int. Ważne jest to, że aby na wskaźniku można było wykonywać jakiekolwiek operacje, musi on posiadać swój typ. Typ wskaźnika to typ zmiennej, na którą on wskazuie.

Jeśli w programie wykorzystamy teraz zapis: int x;

pi » &x;

rasz wskaźnik pi od tej chwili będzie wskazy-

Wykorzystanie pamięci programu

Domyślasz się zapewne, jaki problem właśnie chcę Ci przedstawić i rozwiązać. Ze sprawą tą radziliśmy sobie już w części 3, gdzie umieszczaliśmy w pamięci danych tablice zawierające dane do sterowania wyświetlaczem.

Jeśli posługujemy się napisami tak jak do tej pory, procesor zawsze przed wywołaniem funkcji stworzy zmienną tymczasową, umieści w niej dane, które musi przecież skopiować z pamięci programu! Marnujemy więc cenne zasoby pamięci RAM, których w typowym procesorze jest niewiele.

wał na zmienną ,v. Wykorzystując operator * możemy teraz zmieniać wartość x poprzez wskaźnik pi:

(*pi) = 12;

Nawias nie jest konieczny.

Wskaźniki a tablice

Należy zaznaczyć, że w języku C wskaźniki oraz tablice to bardzo bliscy znajomi. Praktycznie wszystko, co da się zrobić za pomocą tablic, da się wykonać także za pomocą wskaźników, przy czym to drugie rozwiązanie zwykle generuje bardziej optymalny kod.

Podobieństwo między wskaźnikami oraz tablicą widać najbardziej poprzez fakt, że posługując się nazwą tablicy, posługujemy się wskaźnikiem na jej pierwszy element. Okazuje się, że jeśli w programie stworzymy tablicę i wskaźnik do niej:

uir.tB t tablica[10]; uir.t8__t *wskaznik «= tablica; to do czasu, aż nasz wskaźnik przesianie wskazywać na tablicę, oba poniższe zapisy dadzą identyczny efekt:

W ramce ABC... C „Łańcuchy w pamięci programu” znajdziesz informacje, jak korzystać bezpośrednio z pamięci programu, nie zmniejszając praktycznie wygody pisania kodu. Pod tym względem bardzo wygodne jest, opisane w ramce, makro PSTR.

Przeróbmy teraz funkcję piszącą na wyświetlaczu tak, aby posługiwała się ona napisami umieszczonymi w pamięci programu. Całą, zmienioną już funkcję znajdziesz na listingu 32. Na listingu 33 znajdziesz natomiast konieczną zmianę w funkcji main. Jeśli teraz skompilujesz program, będzie on działał poprawnie, jednak podczas kompilacji zgłoszone zostaną ostrzeżenia: warning: pas-sing arg i of 'LCDstr_P' discards ąualifiers from pointer target type. Ostrzeżenia te w tym przypadku nie mają dla nas znaczenia Aby jednak w gąszczu takich ostrzeżeń bez znaczenia nie zgubić czegoś, co jes. dla nas ważne, możemy pozbyć się ich za pomocą rzutowania jak na listingu 34. Rzutowanie wykracza poza ramy dzisiejszego odcinka. Dziś powiem więc tylko, źc taki zapis, w zasadzie jedyne co robi, to informuje kompilator, że wiemy, iż makro zwraca wskażn.k innego typu, niż wymaga tego funkcja LCDsir P, jednak każemy traktować go tak, jakby był to wskaźnik na prog ehar i nie ostrzegać nas o tym fakcie.

tablica [2] ■■ 1; wskaznik[2] = 1;

Można obsługiwać wskaźnik jak tablicę, można i w drugą stronę - poniższe zapisy są równoważne z poprzednim kodem:

*(tablica+2) - 1;

*(wskaznik+2) = 1;

Jedyną różnicą między naszą tablicą a wskaźnikiem jest tu, żc od strony maszynowej, jeśli posługujemy się tablicą, to w programie pojawia się stała liczba oznaczająca odpo wiednią lokacje, w pamięci. Wskaźnik natomiast jest przechowywaną w pamięci zmienną. Poza różnicą w kućzie u wszy nowym powoduje to więc. że o ile tak zwane przesunięcie wskaźnika jest jak najbardziej prawidłowe: wskaźnik -h= 2;

o tyle nie można zapisać wartości do „wskaźnika tablicowego”:

tablica += 2; //BŁĄD!

Ciąg dalszy w następnej ramce.

Elektronika dla Wszystkich Październik 2005 45


Wyszukiwarka

Podobne podstrony:
cz5 6 Programowanie Programowanie listing 29 Pisanie na LCD. LCDstr("W-jtaj!");
Image243 Programowanieczęść 7 Listing 53 - plik rs.c #incltde <avrio.h> finclude „rs.h1 1nt rs
Image2 Packet-snifTer - jest to program, który jest uruchomiony na jakieś maszynie w sieci i "p
15722 Image221 (3) Programowanie Zauważ, że pojawiają się tutaj dwa nowe napisy IDSjCnt oraz IDS Hul
cz5 3 Programowanie Listing 22 LCD: komendy sterujące U Komendy sterujące wyświetlaczem #define
64758 Image215 Programowanie To właśnie możliwość zmiany pozycji wskaźnika wpływa na możliwość
strona Zadanie 29.    bymaniOOtek Na zamieszczonym fragmencie kodu programu napisane
Image34 (9) Programowanie Listing 74 Definicja sprzętowa wyświe/luczu. #define LCD_SX
Image40 (12) Programowanie Listing 90- Elementy dodane do pliku lcd.h. tfinrludp <stdio.h> (..

więcej podobnych podstron