cz5 3

cz5 3



Programowanie

Listing 22 LCD: komendy sterujące

U Komendy sterujące wyświetlaczem #define lcdc_cls    0x01

#defi ne LCDC_HOME    0x02

#def i ne LCDC_MODE    0x04

#defi ne lcdc_moder    0x02

#defi ne LCDC_MODEL    0

#defi ne LCDC_MODEMOVE    0x01

#define LCDC_ON    0x08

#define LCDC_ONOISPLAY    0x04

#defi ne LCDC_ONĆURSOR    0x02

#define LCDC_ONBLINK    0x01

#define lcdc_shift    0x10

#define LCDC_SHIFTDISP    0x08

#define LCDC_SHIFTR    0x04

#defi ne LCDC_SHIFTL    0

#define lcdc_func    0x20

#define LCDC_FUNC8b    0x10

#define LCDC_FUNC4b    0

#define lcdc_func2l    0x08

#defi ne LCDC_FUNC1L    0

#define LCDC_FUNC5xl0    0x4

#define lcdc_func5x7    0

#def i ne LCDC_CGA    0x40

#define LCDC_0DA    0x80


U


d delaylOOus

whiłe(t>0)


Tabela 3 Zależności czasowe przy generowaniu sygnału E.

1 Czas od ustawienia sygnałów RS i RW do uaktywnienia sygnału E

min. 140ns

2 Czas trwania impulsu E

min. 450ns

3 Czas podtrzymania sygnałów RS i RW po opadającym zboczu sygnału E

min. 20ns

Listing 23 LCD: część odpowiedzią


■ delayus8(t)\ nt vo1atiłe( \

"delayus8_loop%=: \n\t"\

“nop \n\t”\

“dec %[ti cks] \n\t”\

"brnę delayus8_1oop%= \n\t”\

[ticks]”r”(t) );}

DEC - lcykl, BRNĘ 2cykłe, +lxnop. zegar


Listing 24 LCD: funkcje niskiego pozie


#define lcd_epulseO \

£ PORT(LCD_EP0RT ) |= 1«LCD_E; \ de1ay250ns()'; \

PORT(LCD_EPORT) &= ~(1«LCD_E) ;}


Parametry takie nie będą miały wpływu na wynik sumy, co oznacza, że można by ich po prostu nie używać. Jedynym celem ich wprowadzenia jest z jednej strony zwiększenie czytelności kodu, z drugiej uproszczenie sterowania. Dzięki temu dokładnie widzimy, jakie możliwości daje każda z komend. Nie trzeba zastanawiać się przykładowo, czy usunięcie danego parametru wywoła działanie odwrotne, czy brak jakiegokolwiek działania.

Funkcje opóźnień

Do prawidłowego wysterowania wyświetlacza potrzebne są nam procedury umożliwiające generowanie opóźnień od pojedynczych cykli maszynowych do kilkunastu milisekund. Do tej pory pokazałem Ci dwa sposoby podejścia do problemu funkcji opóźnień. Jedną z możliwości jest wykorzystanie funkcji udostępnianych przez nagłówek <avr\delay.h>, drugą wykorzystanie systemu przerwań. Teraz podejdziemy do sprawy jeszcze inaczej: napiszemy własne procedury opóźnienia za pomocą asemblera. Jest to chyba jedyna opcja, która umożliwia stworzenie opóźnienia rzędu jednego cyklu.

Potrzebne nam funkcje opóźnień pokazuje listing 23. Moją zasadą przy tworzeniu nazw takich funkcji jest podanie jednostkowego opóźnienia oraz, gdy czas opóźnienia można wybrać za pomocą podania odpowiedniego parametru — podaję ilość bitów, jaką ma wspomniany parametr. Tak więc funkcję dełayl00us8 należy czytać jako umożliwiającą generowanie opóźnienia równego t*100ps, gdzie t jest wartością ośmiobitową. Tak więc maksymalne generowane opóźnienie to 25,6ms (dla t = 0).

Myślę, że w przedstawionych funkcjach nie ma nic tajemniczego dla osób obeznanych z asemblerem AVR-ów. Dokładniejsze wyjaśnienie tematu wstawek asemblerowych pojawi się pod koniec artykułu. Teraz do pełnego wyjaśnienia tej idei brakuje mi opisu obsługi napisów w C. Tymczasowo napisane makra oraz jedną funkcję potraktujmy jak czarną skrzynkę, która po prostu działa.

Funkcje niskiego poziomu

Nazwą taką określone zostały przeze mnie funkcje działające bezpośrednio na portach wyświetlacza.

Są one tworzone w zasadzie tylko po to, aby kolejne, „wyższe” funkcje obsługi wyświetlacza mogły z nich korzystać. Właściwy program nie powinien się do nich odwoływać.

Przyjrzyj się listingowi 24. Jeśli masz dostęp do dokumentacji wyświetlacza LCD ze sterownikiem HD 44780, możesz zauważyć, że tworząc pierwsze makro oraz kolejne funkcje, po prostu przekładamy na opis w C kolejne informacje z dokumentacji. Najpierw tworzymy makro, które zajmie się generowaniem impulsu strobującego dostęp do wyświetlacza. W tabelce 3 przytaczam najważniejsze zależności na podstawie artykułu z „Elektroniki dla Wszystkich” 12/97.

Zauważ, że 1 i 3 z nich zawsze będzie spełniona, jeśli tylko nie będziemy zmieniać stanu wyprowadzeń sterujących oraz strobującego jednocześnie. Wynika to z szybkości działania naszego procesora, któremu jedna instrukcja zajmuje 250ns. Tylko między załączeniem i wyłączeniem sygnału E konieczne jest niewielkie opóźnienie. Bez tego impuls trwałby tylko 250ns.

Na następnym poziomie pojawia się funkcja LCDsendHalf. Pracując z wyświetlaczem z interfejsem czterobitowym, każdą daną do wyświetlacza wysyłamy podzieloną na dwie części. Zadaniem omawianej funkcji jest wysłanie jednej takiej połowy. Zakłada ona, że odpowiednie dane znajdują się na czterech najniższych bitach zmiennej data. Zauważ, że zmienna data jest wykorzystana tutaj do przechowywania wyniku pośredniego obliczeń. Przypominam, że:

BCuinti

ABC... C

#define i wiele innych linii

Wspominałem o tym w części 3. Przypominam, że komenda tkiefme nie jest instrukcją języka C. Dotyczą jej inne zasady - tutaj format linii ma znaczenie. Definicja kończy się zawsze'znakiem końca Linii. Tam, gdzie pojedyncza linia musiałaby być nieznośnie długa, możemy wprowadzić ukośnik „\” i poniżej kontynuować nasze makro.

Pilnuj, aby bezpośrednio za znakiem ukośnika pojawił się znak nowej linii. Spacja znajdująca się na końcu linii, którą chcemy kontynuować w linii następnej, spowoduje wygenerowanie błędu przez kompilator. Można zauważyć, że w takim przypadku nawet nasz edytor nie będzie odpowiednio kolorował składni.


data “ (data & OxOF) « LCD_D4; ?ORT(LCD_D?ORT) =

(PORT(LCD_D PORT) & ~(OxOF«LCD_D4)3 | c


>

VOld -

ff


send(ui


część (dar.a»4); // Młodsza część LCDsendHalf(data)i delayus8(120);


38 Październik2005 Elektronika dla Wszystkich


Wyszukiwarka

Podobne podstrony:
cz5 6 Programowanie Programowanie listing 29 Pisanie na LCD. LCDstr("W-jtaj!");
cz5 1 Programowaniew (B W dniu dzisiejszym zmierzymy się z wyświetlaczem alfanumerycznym LCD, co jes
78945 Image156 (2) ton www    www.elportal.pl i Listing 162 Definicja komend // H = X
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> (..
Image214 Programowanie Programowanie Listing 29 Pisanie na LCD. LCDstr(“Witaj!");
skanuj0119 (19) 130 PHP i MySQL dla każdego Listing 4.22. Wykorzystanie konstruktora do inicjacji pó

więcej podobnych podstron