Image35 (9)

Image35 (9)




Programowanie


Funkcje niskiego poziomu

Za definicją zmiennych umieścimy definicje funkcji niskiego poziomu. Są one bardzo podobne do tego, co już znamy 2 poprzedniej płytki. Jedyna różnica 10 obsługa wyświetlacza w trybie ośmiobitowym oraz wykorzystanie możliwości czytania danych z wyświetlacza w celu sprawdzania jego zajętości. Dodatkowo, tym razem, wykorzystamy funkcje delayms oraz _delay_us zamiast tworzonych samodzielnie pętli opóźnień. Informacje o tych bardzo wygodnych funkcjach znajdziesz w ramce „Propozycja opóźnienia”. Wszystkie funkcje niskiego poziomu przedstawia listing 75.


Funkcja lcd_put

Zaraz za funkcjami niskiego poziomu możemy zdefiniować naszą funkcję odpowiedzialną za przyjmowanie danych ze strumienia. Przedstawia ją listing 76. Funkcja ta ma za zadanie wpisanie podanego znaku do bufora oraz przesunięcie wewnętrznego kursora. Dodatkowo w funkcji pojawia się zabezpieczenie przed „przewinięciem” kursora poza obszar bufora. Pisanie poza obszarem bufora jest bardzo niebezpieczne - tak naprawdę nie wiemy, gdzie takie dane trafią, i może spowodować to zawieszenie całego programu.


Idea rozwiązania

Przydzielanie znaków specjalnych

Sterownik HD44780 nie ma zakodowanych polskich „ogonkow”. istnieje za to możliwość definiowan a znaków użytkownika. Własnych znaków możemy jednocześnie wyświetlić co najwyżej 8. W języku polskim mamy natomiast 9 liter nie wy stępujących w standardowym generatorze znaków: ąćęłńóśiż. Jeśli weźmiemy pod uwagę, że mogą przydać się nam także* duże litery... potrzebna liczba znaczków gwałtownie rośnie do 18. Może chciałbyś lakże wyświetlić czasem jeszcze jakiś inny znak?

W najprostszym rozwiązaniu problemu wykorzystuje się fakt, że li:era „ź’’ jest bardzo podobna do litery ,.ż” oraz żc można obejść się bez dużych polskich znaków. Na starcie programu wpisuje się do pamięci znaków specjalnych dane małych polskich liter za wyjątkiem ,.ź” i ze znaków tych korzysta się w programie.

Podejdziemy jednak do problemu zupełnie inaczej. Skorzystamy ze stosunkowo dużej mocy obliczeniowej AVR-ów. W pamięci procesora zawrzemy wszystkie znaki, jakie mogą nam się przydać. Będziemy analizować tekst, który ma być wyświetlony i tuż przed jego wyświet


© Ustawienie wewnętrznego kursora. Nie na » wpływu na puiyuję kursora na wyśwteUaczu Ustawienie statusu kursora I wyświe-Jacza (nie ma wpływu na rzeczywisty stan wyświetlacza ai do otttwteżerta)


Indeksy znaków specjalnych do załadowania do wyświetlacza


© Zapisanie dan/ch da bufora funkcjami 2 biblioteki stdio. Wewnętrzny kjrsar przesuwany po Każdym zapłato-_

[o fi

0310

jjI

li]

[oj

|e]

10

li

1?

u

H

a.

Jl5jl7

/j

/4;

20

i/b

k

w

■n

.H.

Frn

] Kursor który wskazuje miejsce gazie aktualnie będziemy zapisywać dana do bufora


Interfejs

Począwszy od tego momentu zaczniemy pisanie fUnkcji, które nazwiemy funkcjami interfejsu. Funkcje te będą widoczne na zewnątrz modułu LCD i będą służyć do komunikacji z resztą programu. Pierwszą z nich będzie funkcja inicjująca wyświetlacz, widoczna na listingu 77. Zauważ wykorzystanie w tym miejscy kompilacji warunkowej - wybieramy tryb dwuli-niowy dla wyświetlacza mającego fizycznie więcej niż jeden wiersz.

Z poziomu funkcji Icd lnit wywoływana jest widoczna na listingu 78 funkcja lcd_Cis - jej zadaniem jest wypełnienie bufora wyświetlacza spacjami oraz ustawienie kursora obszaru. Mimo tego, że definicja tej funkcji pojawia się po użyciu, w pliku lcd.c nie dodajemy jej deklaracji - deklaracja pojawi się w pliku lcd.h. Wykorzystujemy tutaj standardową funkcję memset, której deklaracja znajduje się w pliku <string.h>.

Na listingu 79 przedstawiam funkcje obsługujące status wyświetlacza -działania chyba nie trzeba wyjaśniać.

Listing 80 grupuje funkcje


informacje o włączaniu:

Wyświc-Jocza Kursora Migania kursora

© Wyszukanie znaków specjalnych w buforze Zapis indeksów znalezionych znaków w iablcy. Jeśli w tablicy dary znak Jut się znajduje - nie dodajemy go

® No poditowio przygotowanej tablicy

7«pk danych do oamłęci znaków użytkownika w wyświetlaczu._

Q> Wyłączenie kursora, brak zmiany slan.i whicrarla samego wyświetlacza

® Ustawienie kursora na pozycję zgodną z kursorem wewnętrznym.

Przywrtcenie stanu kursora

© Wypisanie danycn z Dtfora na wyświetlacz, „eśl napotkam ra znak s^arjalny. sprawdzam czyjeś! w tablicy Jeśli tak - wysyłam hdeks odpowiedniej pozycji. Jeśli nie - wyświetlam /rak


O Wywołanie funkcji Updato (otłSwiuź) która zajmo »ę wszyofcim 00 potrzebno aby na wySwiettaczL pc.jawiły się właściwe dane.    :_


Rysunek 46 - idea dynamicznego przydzielania znaków specjalnych


leniem zapiszemy wybrane znaki do pamięci HD44780. Jeśli jednak zdarzy się sytuacja, że zabraknie w mej miejsca, zamiast znaku specjalnego zostanie wyświetlony znak alternatywny (na przykład a zamiast ą, c zamiast ć).

Oznaczenie znaków specjalnych

Dla oznaczenia znaków specjalnych przeznaczmy zasiał wolny obszar kodów od 0x80 do 0x9:'(tabela 8). Daje nam to możliwość zdefiniowania 32 różnych znaków. Teoretycznie możliwe jest wykorzystanie obszaru od 0x00 do f)xl f. Jednak tkwi tutaj pewna pułapka W podstawowej tabeli ASCII znaki o kodach powyżej 0x7f są nicokrjślo-r.e. Możemy więc / nich w miarę bezpiecznie korzystać. Inaczej sprawa się ma ze znakami o -codach 0x00 do 0\ 1 f. Kod 0x00 w C jest oczywiście zarezerwowany dla oznaczenia końca łańcucha i jako taki nic może być wykorzystany. Dalsze kody to między innymi znak ESC, tabulacja, powrót karetki, znak następnej linii... Jeśli będziemy chcieli z nich korzystać w obsłudze wyświetlacza, nie możemy zająć -.ych kodów.

Pisanie, analizowanie, wyświetlanie

Rysunek 46 pokazuje algorytm, który będziemy dziś tworzyć. Idea działania jest dość prosta, a dodatkowe objaśnienia znaiazły się na obrazku. Pewne zdziwienie może budzić zmienna statusu. Jest ona o tyle istotna, żc na czas odświeżania danych kursor będzie wyłączany. Jego stan będzie odtwarzany po zakończeniu odświeżania Podejście takie stanowczo zmniejsza widoczne zakłócenia obrazu. Jednak nie ma możliwości odczytania z wyświetlacza jego stanu - konieczne jest zapamiętanie tej informacji w dodatkowej zmiennej.

Rysunek 47 przedstawia ideę przechowywania znaków specjalnych. Pojedynczy znak znajdzie się w strukturze LCD I.OCAL. Tablica takich struktur będzie opisywać wszystkie potrzebne nam symbole.

Na rysunku 47 widać jednocześnie propozycje wyglądu znaków specjalnych. Zauważ, że cześć dużych lite: zasiała stworzona w taki sposób, że są przesunięte, zajmując także pozycję kursora. Nie jest to idealne rozwiązanie, ale według mojego wyczucia wygląda lepiej niż litery ściśnięte do wysokości siedmiu punktów. Jeśli znaki takie jednak me przypadną Ci do gustu, nic nie stoi na przeszkodzie, aby samodzielnie zmodyfikować odpo-wicdn.c wzorce


Rysunek 47 - przechowywanie i proponowany wygląd znaków specjalnych


Oddzielenie od sprzętu

Poza napisaniem wygodnej w obsłudze biblioteki uzyskamy jeszcze jedną rzecz: poza naszym modułem LCD żaden eienent p*ogramu nie hędzie miał dostępu bezpośrednio do wyświetlacza. Reszta programu bęczie jedynie odwoływać się do bufom obrazu oraz do zmiennych wewnętrznych oznaczających kursor oraz status. Cała reszta programu w takim przypadku nie musi i nie będzie znała nazw oraz formatu koir.erd wyświetlacza, a Ty jako programista także nic będziesz musiał się już nimi przejmować.

Kolejne linie w naszym przypadku znajdą się jedna pod drugą, a funkcje modułu LCD zajmiąsię ich odpowiednim ułożeniem na wyświetlaczu (patrz ramka „Szczegóły techniczne”).


40 Maj 2006 Elektronika dla Wszystkich


Wyszukiwarka

Podobne podstrony:
Image33 (5) Programowanie ■ Programowanie ■ momencie za pomocą klawisza pauzy na pasku narzędziowym
Image34 (9) Programowanie Listing 74 Definicja sprzętowa wyświe/luczu. #define LCD_SX
Identyfikatory Programy przechowują informacje w postaci stałych i zmiennych. Jeśli chcemy umieścić
Image34 (5) ■ Programowanie Rys. 22 Badanie liczby cykli obsługi przerwania że dokładnie co taki cza
automatyczne eliminowanie zmiennych statystycznie nieistotnych. Program robi to za nas automatyzzi
Image339 mnożenia można zrealizować za pomocą układu służącego do dodawania. Czas wykonywania mnożen
skanuj0217 (4) 230 PHP i MySQL dla każdego w sesji. Zmienne należy usunąć ręcznie za pomocą przeznac
imageO3J Wystąpił- bł-ąd: Za dużo zmiennych i nie ma miejsca w pamięci (>120B).Z1

więcej podobnych podstron