Lisiłng 103 - plik main.c
jtfinclude <avr/io.h> tfinclude <stdio.h>
#inc1ude <util/celdy.h>
ftnclude „harddef.h"
#inc1ude ,.makra.h” linclude „lcd.h”
#inclLde „langsys h'1
static inline uimK t sw_wait(void)
{
for(;;)
{
// Oczekiwanie na naciśnięcie przycisku if(!CPIN(SW_PORT) & l«SWO)
{
delay_ms(30);
tf(l(PIN(SW_PORT) & 1«SW1)) return 1;
}
if(!(PIN(SW PORT) & 1«SW2))
1
delay_ms(30);
lf(l(P:N(SW_PORT) & 1«SW2)) return 2;
>
1
)
■int main(V0id)
{
// inicjacja wyprowadzeń
L)DR(LCD CTRLPORT) - (1«LCD E | 1«LCD_RW I 1«LCD RS | 1«LCD LED);
PORT (LCD_CTRLPORT) = ~0«LCD E | 1«LCD_LED);
PORT(SW_ PORT) = U<SWI | 1«SW2;
// inicjacja wyświetlacza lcd_Init();
IcdSctStatus (LCDSTATUSD1SP) \
// wyświetlenie zapytania o język tputs_P(PSTR(„Sl - „), IcdGctFileO); fputs P(langs>s_GetLangNamc(0), lcd_GetFileO); lcd_GoTo(0, 1);
fputs_P(PSTR(„S2 - IcdGctFileO) I
fputs P(langsys_GetLangNamc (1) , Icd GetFilc () ) ;
IcćUpdate O »
// oczekiwanie na przycisk i wybranie języka langsysSelect (sw_wait () -1);
// Wyświetlenie przywitania cd_ClsO;
fputs_PClangsys_GetTextClOS_Start)ł IcdGctFileO) ; icd_Update() ;
return 0;
>
R E < l A M A
w następnych numerach EdW
Sterownik zegarowy i nie tylko... - Urządzenie, oprócz wbudowanego zegara, posiada wiele cekawych i pożyleczrych funkcji. Oto niektóre z nici:
* kanały ste'o\vane czasowo (godzna włączenia, godzina wyłączenia^.
3 kanały sterowane ręcznie przez użytkownika, 1 kanał sterowany termicznie (temperatura górna maksymalna, dolna minimelna z zakresu od -55 do +150°C), cyfrowy czujnik temperatury i In.
Kompukser - W popularnych kartach cźwiękcwych mamy do dyspozycji jecno gniazdo wejściowe Linę In typu miniJack.
Czasem jecnak zachoczi potrzeba, aby podłączyć do komputera więcej sygnałów audio. Opisany w artykule układ rozwiązuje ten problem.
Ponadto umożliwia łatwą rozoudowę o kolejne kanały.
Listing 105 - Wykorzystam? wyiic~enia do obliczania rozmiaru tablicy
const próg char* langsys $trTable[2] flDS_END] PROGMF.M = (...)
umieszczona bezpośrednio tutaj - plik ten jest plikiem „chwilowym”, służącym nam tylko do testowania, W przyszłości przyciski będą obsługiwanie inaczej.
Zauważ sposób dostępu do napisów, gdy język został już wybrany. Niezależnie od dokonanego wyboru przywitanie wyświetlane jest w taki sam sposób. W tym prostym programie nie widać jeszcze siły tkwiącej w rozwiązaniu - napisów jest za mało, mamy jednak pewność, że nowy moduł działa.
Przy okazji listingu 97 obiecałem, że zajmiemy się problemem ustawiania rozmiaru tablicy wskaźników na napisy. O ile przy dwóch różnych tekstach nie ma problemu z ręcznym podaniem ich ilości, to przy rozwoju programu może to stać się dość uciążliwe. Kompilator nie obliczy dla nas rozmiaru innego niż najwyższy wymiar tablicy. Możemy jednak wykorzystać fakt. że wyliczamy indeksy kolejnych wpisanych wartości. Niezbędny rozmiar tablicy to ostatni indeks + 1. Wpro
,/Z,
wadźmy dodatkowy identyfikator do wyliczenia zgodnie / listingiem 104. Umówmy się teraz, żc wszelkie nowe identyfikatory wprowadzimy przed IDS FND Identyfikator ten jest równy wartości ostatniego identyfikatora łańcucha + 1. Możemy teraz wykorzystać go do ustawienia rozmiaru naszej tablicy, tak jak zostało to pokazane na listingu 105.
Listing lO-i — ubliżenie ilości napisów
enum
{
IDS_LANGNAME,
IDSStart,
// KONIEC IDS_END
U
Aktualnym ograniczeniem ilości napisów jest wartość 256. Wynika to z przyjętego typu
parametru funkcji langsys_GetTekst. Jest mało prawdopodobne, aby pojawiła się potrzeba wykorzystania większej ilości tekstów. Jeśli jednak taka potrzeba zaistnieje, zawsze można zmienić typ parametru na wartość szesnastobitową zostanie to prawidłowo obsłużone. Większe wartości nie mają sensu - przy wykorzystaniu całego dostępnego zakresu możemy całkowicie zapełnić pamięć procesora Atmegal28 samą tylko tablicą wskaźników dla jednego języka
Dziś utworzyliśmy kolejny element kojarzony z zaawansowaną obsługą LUD. Ważne jest jednak to, że moduł ten jest bardzo uniwersalny -podaje nam ledyme łańcuch zawierający napis w- danym języku. Może on równie dobrze współdziałać z wyświetlaczem alfanumerycznym, graficznym czy nawet służyć do wyboru języka komunikacji poprzez port RS232.
Poznajemy jednocześnie coraz bardziej zaawansowane elementy' języka C. Tablice wielowymiarowe czy możliwość wykorzystania funkcji jak zmiennei jest czymś co nie pojawiało się w' BASCOM-ie. Jeśli teraz sprawia Ci to kłopot, pamiętaj, że C nie zmusza Cię do korzystania z tych opcji. Jeśli chcesz, możesz korzystać ze zmiennych pomocniczych, a w pewnym momencie sam odkryjesz, jak wygodnie jest zapisać algorytm bez nich.
W kolejnej części korzystając z dotychczasowego dzieła, stworzymy moduł umożliwiający proste tworzenie przcwijalncgo menu z zagnieżdżaniem opcji. Na systemie menu skończymy zaawansowaną obsługę LCD alfanumerycznego.
Radosław Koppcl
Czerwiec 2006