Listing 90- Elementy dodane do pliku lcd.h. tfinrludp <stdio.h>
(...)
// Definicje funkcji interfejsu vo1d Lcd_init(vo1d); vo1d led CLs(void);
VOid lcd_SetStdLus(uin38_t status); #define LCD STATUS_BLINK 0x01
tdefine LCn_STATiis_niRśOR 0x02
fdefine lcd_status_dis? 0x04 inline void icd_upcate5tatuj(void); Inline void led goTuAJł(uinc8_t adr); #define lcd_GoTo(x, y) \ lcd_G0T0Adr(yt,LCD_bx+x); void Lcd UpdateCurFos(void); ulnt8_t lcd_PrepareSpec(void); void lrd_tjpdateCfiR»M(void);
VOid icd_UpdatoToxt(void); void icd Update(void);
inline file* Lccł_GetFiie(void);
prog_char str_Hel1n[] = „Cze\x86\x8l“; -
prcg_char str_all[] =
„\x80\x81\x82\x83\x84\xS5\x8€\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91“;
lcd_SetStatus(
LCDrSTA?US_DIS?|LCD_STATUS_CUF.SOR) // wypisanie przywitania fp'jtc_P(str_HeLlo , lcd_GetFile ()) ; lcd_Update()| delay_10ms8(200);
// Przewijanie uint8 t start*0; for(;;) ł
cA_C. l s ();
fpjts_P(str_alL+start, lcd_CctFilc());
lccł_Update() |
Listing 93— Odznaczenie nowych napisów w pliku local. h.
extern prog_char str_Hellc[]; extern prog_char 5tr_ali[];
Poznany dziś sposób pozwala nam na obsługę 32 znaków specjalnych z czego 8 może być wyświetlanych jednocześnie. Gdybyś potrzebował większej liczby możliwych do obsłużenia znaków, możesz zawsze wykorzystać dodatkowo obszar kodów od 0x01 do 0x 1albo zdecydować, że wszystkie zna<i japońskie nie są Ci potrzebne (uważaj, na znak 0xff-jest on wykorzystany dla oznaczenia końca danych). Jednak pamiętaj, że im więcej znaków specjalnych, tym większe prawdopodobieństwo, że poją wi się konieczność stosowania znaków alternatywnych.
Jeśli chodzi o sam algorytm wyooru znaków alternatywnych, można go bar dziej skomplikować: na przykład wykorzystać fakt, że litery kż’ oraz ‘ź’ są do siebie bardzo podobne. Jednak praktyka wykazuje, że przy stosowanie polskich „ogonków" ze świadomością, że więcej niż 8 nie będzie widocznych, nic wymaga wiele trudu. W praktyce, duże polskie znaki, nieczęsto są w użyciu. Tak więc przedstawione rozwiązanie sprawuje sie zwykle znakomicie.
Dzisiaj podałem bardzo dużo kodu. Cały program dostępny będzie na Elpor-talu i możesz śmiało z niego korzystać, jeśli nic masz ochoty pisać go samodzielnie. Dzisiejszy kod jest o tyle ważny, że w najbliższym czasie będziemy z niego korzystać, wprowadzając najwyżej niewielkie modyfikacje, już bez wnikania w to. jak on działa.
w rzeczywistym programie zostanie przekształcona w... liczbę. A dokładniej w szes-nastobitowy adres, gdzie w pamięci RAM znajdjjc się struktura IcdjLCDtemp (patrz listing 73).
Cały czas odkładaliśmy deklaracje funkcji w pliku Icd.h. Zróbmy to teraz. Znajdą się tutaj jedynie te funkcje, które chcemy udostępnić na zewnątrz. Wszystkie dodane elementy pokazuje listing 90. Ponieważ w pliku pojawiła się zmienna typu FILE, warto dodać tutaj nagłówek biblioteki <stdio h>. Jeśli tego nie zrobimy, koniecznie trzeba dołączyć ją zawsze przed dołączeniem Icd.h. Oprócz deklaracji funkcji zdefiniowane zostały tutaj stałe dla funkcji IcdSetStatus. Ich znaczenie wydaje się oczywiste. Zwracam jedynie uwagę na fakt, że ich wartości zostały dobrane tak, że bajt statusu może być bezpośrednio wysłany do wyświetlacza
ABC... C
uwaga na Vxhh oraz \ooo
Jeśli w napisie chcemy wprowadzić jakąś liczbę, czy to w kodzie szesnastkowym, czy też w ósemkowym, musimy wiedzieć, że liczba będzie przekształcana tak długo, aż napoikany zostanie znak. który jest nieprawidłowy. Spróbuj zamienić tekst przywitania tak, aby wypisać słowo „flądru". W tym przypisz zmiennej str Hello wartość „tl\x8(]dra” Podczas Kompilacji powinno pojawić się ostrzeżenie o przekroczeniu zakresu. Napis nie zostanie wyświelony prawidłowo. Cały ciąg „\x80d'‘ zostanie przekształcony na liczbę. W naszym przypadku będzie od 0x0d Istnieje chyba tylko jedno rozwiązanie tego problemu. Można rozdzielić napis korzystając z łączności stałych tekstowych:
proq_char str Hello□ ■ wfl\x80“„dra“;
Teraz po wczytaniu zero napotkany zostanie znak nieprawidłowy dla liczby szesnastkowej (cudzysłów) i przekształcanie zostanie zakończone. Napis będzie wyświetlany poprawnie
Listing 92 - Napisy dodam do pliku local.c.
Ciekawym elementem jest makra IcdjGoTo. Daje ono inużliwość przeniesienia kursora na pozycję określoną /a pomocą numeru linii oraz pozycji w linii. Warto zauważyć, że jeśli obie te wartości zostaną podane jako stałe - obliczenia zostaną wykonane na etapie kompilacji. Trzeba pamiętać także, że tam, gdzie korzystamy z makra IcdGoTu, potrzebne jest dołączenie pliku harddefh, ponieważ, w nim znajduje się wartość stałej LCD_SX.
Jeśli jeszcze tego nie zrobiłeś, stwórz teraz plik główny programu (muin.c) i dodaj go do
Listing 91 - Plik main.c.
tfinclude <avr/io.h> tfinclude <inttypes.h> tfinclude <stdio.h> //include <.avr/pgnspace.h> #1nclude cutil/delay.h>
Jinclude ,.makra.h" rtinclude ..harddef.h" Ainclude „Icd.h"
Ainclude „local.h" // Opóźnienie o lOms x t
void će:ay_l0ms8(ulnt3_t t)
{
do
1
// dla 8MHz opóźnienie max 32ms delay ms(10);
} while(t-l-O);
1nt main(void)
{
}/ inicjacja wyprowadzeń ddr(lcd_ctrlport) -
0«T.rn_E | 1«LCD_RW | i«lcd_rs j :«lcd_ied) ; port(lcd_ctrlport) -
~(1«LCD_S I 1«lcd_led);
// Test biblioteki wyświetlacza lcd_irat();
1f(++start >= strIen_F(str_all)) start = U;
delay_10ms6(100);
}
return 0;
projektu oraz zaznacz jego istnienie w p lku makefde. Propozycja kodu do umieszczenia w tym miejscu jest widoczna na listingu 91. Zadaniem programu jest uruchomienie wyświetlacza. wyświetlenie tekstu przywitania oraz pokazanie nap.su składającego się z samych znaków specjalnych i jego przewijanie, tak aby kolejne znaki znikały z wyświetlacza. W założeniu umożliwia to zaobserwowanie, jak kolejne znaki zmieniają się ze znaków alternatywnych na znaki narodowe.
W programie korzystamy z łańcuchów znakowych umieszczonych w pamięci programu, które zostały nazwane str Hello oraz strjill. Napisy te umieszczamy w pliku
_ local.c (listing 92). W pliku listing.h
umieszczamy ich deklarację typu extern (listing 93). W tej chwili program można skompilować i uruchomić. Powinieneś ujrzeć przywitanie, a następnie przewijający się napis składający się z ośmiu polskich ,.ogonków” oraz reszty znaków w formie alternatywnej.
Radosław Koppel
radoslaw.koppelltielporlcilp!
Elektronika dla Wszystkich Maj2006 49