Listing 74 |
Definicja |
sprzętowa wyświe/luczu. | |
#define |
LCD_SX 16 |
#define |
LCD_SV 2 |
#define |
lcd_l:nei o |
tfdefine |
ICD_LINE2 64 |
// Podłączenie | |
tfdefinc |
LCD DATAPORT B |
tfdefine |
_CD_CTRLPORT d |
#define |
wCD_E 4 |
#define |
LCD.RW 3 |
#define |
LCD_RS Ł |
tfdefine |
LCD.LEDPORT D |
tfdefine |
LCD.LED 5 |
V°>l Linia 1_
umieszczaniu znaczka &. Jest to nie tylko wygodne, ale ułatwia ewen:ualne przenoszenie kodu. Moglibyśmy także stworzyć dodatkową zmienną będącą wskaźnikiem na strukturę, jednak niepotrzebnie zajmowałaby ona pamięć KAM.
Dolej w pliku tworzymy resztę potrzebnych nam zmiennych zgodnie z rysunkiem 46. Rozmiar bufora danych zależny będzie od rozmiarów wyświetlacza. Pojawia się w tym miejscu element, który należy dodać do pliku harddef h -rozmiar wyświetlacza można śmiało zaliczyć do części konfiguracji sprzętu. Od razu dodajmy resztę informacji konfigurujących wyświetlacz. Będą to dodatkowo adresy początków każdej linii oraz opis przyporządkowania wyprowadzeń procesora do wyprowadzeń wy-ś wi etl acza Dane z listingu 74 należy wpi sać w pliku harddef h w wolnym miejscu widocznym na listingu 72.
Przypominam, że umieszczenie słowa kluczowego stulić przed zmienną globalną lub przed funkcją ma inne znaczenie niż umieszczenie tego samego słowa przed zmienną lokalną. Wykorzystując słowo kluczowe static w naszych kodach, oznaczamy że dana funkcja / zmienna może być wywołana / obsługiwani* jedynie z poziomu aktualnego pliku nie może być udostępniona na zewnątrz.
Przykłady: listing: 75 i 76. Patrz tei ramku o deklaracji typu extern.
Szczegóły techniczne
Aby zrozumieć dalsze kody. przyjrzyjmy się tabeli 8. Jest to tabela najczęściej spotykanych znaków umieszczonych w sterowniki HD44780.
W zakresie 0x20 co l)x7f kody znaków są w dużej mierze zgadnę z tablicą ASCII - właśnie dzięki tema możemy wysłać do wyświetlacza łańcuchy znaków praktycznie bez żadnego przekodowywania.
Kody 0x00 do 0x0f powodują wyświetlanie znaków użytkownika. Mimo iż kodów jest 16, znaków mamy tylko 8. Do każdego znaku możemy dostać się poprzez dwa różne kody.
Obszary 0x 10-Gx 1 f oraz 0x80-0x91 są niezdefiniowane. 0xa0-0xdf to głównie znaki japońskie. Ciekawe
4Ffc<79)
67k(10J)
13k(19)
53b(*3)
27fc(l9>
67fc(103)
Rys. 46 adrosy dla poszczególnych linii wyświetlacza
ABC... C
Nowe sposoby otwierania
W poprzedniej części staraliśmy się uruchomić funkcje biblioteki stdio bez wykorzystania funkcji fdevo-pcn. Przypomnę, że funkcja ta alokuje dynamicznie pamięć na strukturę FILE. co w naszym przypadku jest zupełnie zbędne.
W wersji 1.4 avr-libc problem został rozwiązany Po pierwsze, struktura ULE jest teraz zdefiniowana całkowicie jawnie w piiku stdio.h. Jednak autorzy namaw iają nas. aby nie korzystać z tego faktu bezpośrednio - oznacza to. ze nie powinniśmy raczej dostawać się samodzielnie do poszczególnych pól.
Dzięki temu, żc struktura FILE jest zdefiniowana jawnie, możemy utworzyć zmienną typu FILE do tej pory mogliśmy się posługiwać jedynie wskaźnikiem na taką zmienną. Co bardzo ważne: dostajemy do ręki także specjalne makra umożliwiające inicjację naszego ..pliku” bez konieczności alokowania pamięci dynamiczniej. Pierwsze z nich. pisane rr.ałymi literami: fcie\)_setup_slream(strenm. pul get. Jlags) ustawia odpowiednie pola struktury FILE. Jako parametry podajemy:
stream - wskaźnik na naszą strukturę (struktura rr.usi być stw orzona jako normalna zmienna);
symbole znajdują się pod adresami OxeO-Cxff: Są to znaki które mogą być wyświetlane w rozdzielczości 5x'.() zamiast 5x7 Problem jest jedynie taki. że wyświetlacz musi mieć możliwość czysto fizycznego wyświetlenia takiej rozdzielczości. W swojej praktyce nie spotkałem się z takim elementem. W tabeli tej szarym kolorem oznaczyłem punkty, które nic zostaną wyświetlone w trybie 5x7.
Linie
Poszczególne linie wyświetlacza zostały ustawione w taki sposób, żc linie tc nic są ułożone kolejno (jedna za drugąi. Kilka przykładowych konfiguracji pokazuje rysunek 46. Widzimy, że w przypadku trybu dwuliniowego występuje pewna przerwa między pierwszą a drugą linią. Prawdziwe zamieszanie zaczyna się w przypadku wyświetlacza mającego cztery linie. Aby wszystkie linie były wyświetlane, należy włączyć tryb dwudniowy (wiem, żc to mylące, ale tak właśnie jest). Linia 3 jest Kontynuacją linii I. Linia 4 kontynuuje linię 2. Tak więc adresy początków linii 3 oraz 4 megą być inne dla wyświetlacza 4x16 riż 4x20. Aby było jeszcze zabawniej istnieją wyświetlacze 4x16, w których adresy linii 3 oraz 4 zaczynają się tak, jakby były tn wyświetlacze 4x20.
Uwaga na wyświetlacz 4x40
Sterownik HD44780 nie ma możliwości obsłużenia wyświetlacza o większej liczbie znaków niż 80. Wyświetlacze o większej liczbie znaków
pul - funkcja wysyłająca daną do naszego strumienia; get - funkcja odczytująca daną z naszego strumienia; Jlags - flagi oznaczające, z jakim strumieniem będziemy mieli do czynienia. Aktualnie możliwe są wartości: _FDEV SETUP RE AD, FDE Y SETUP_WKJ TE albo _FDEV_SETUP _RW. oznaczające kolejno: strumień tylko do odczytu, strumień tylko do zapisu, strumień do zapisu i do odcz.ytu. To. krórc flagi powinniśmy wybrać, zależy od tego, czy nasz strumień ma tylko funkcję get lub pul, czy też tworzymy strumień wyposażony w obie wymienione funkcje.
Oprócz wspomnianego makra mamy także makio o identycznej nazwie, jednak pisane w całości dużymi literami: FDEYJETUP STREAMfput, get. Jlags) Makro to tworzy dane inicjujące nowo tworzoną zmienną. Możemy wykorzystać je w bardzo podobny sposób jak makra, które zostały stworzone u poprzedniej części i :ak naprawdę makro to działa na tej samej zasadzie:
FILE ny_f =
?cev_srtijf_stream(
put ,
_FDEV SETUP_WRITE);
Przykład: listing 73
w rzeczywistości mają dwa kontrolery z oddzielnie wyprowadzonymi wejściami Enablc. Każdy z kontrolerów odpowiada za połowę linii wyświet.acza. Nie będziemy się tutaj takimi wyświetlaczami zajmować. Wymaga to nieco odmiennego podejścia do problemu.
Tabela 8 Zawartość typowej tablicy znaków HD44780
Elektronika dla Wszystkich Maj2006 39