Witam Was.
Szczerze mówiąc, to przypuszczam, że odpowiedź na moje pytanie gdzieś na forum jest, tylko że ja nie wiem jak to pytanie dobrze zadać. Zaczynam z językiem C, uczę się programować na Atmedze i nie umiem jeszcze nazwać niektórych rzeczy "po imieniu".
Mam taki mały kod, ale ugrzęzłem na takim czymś:
Chciałbym w main.c użyć funkcji np. led_on(x); gdzie (x) ma oczywiście oznaczać nr diody (ale nie nr pinu!). W tej chwili mam to zrobione tak, że funkcja sprawdza to na zasadzie:
#define LED1 (1<<PD6)
#define LED2 (1<<PD5)
#define LED3 (1<<PD4)
#define LED1_ON PORTD |= LED1
#define LED1_OFF PORTD &= ~LED1
#define LED1_TOG PORTD ^= LED1
#define LED2_ON PORTD |= LED2
#define LED2_OFF PORTD &= ~LED2
#define LED2_TOG PORTD ^= LED2
#define LED3_ON PORTD |= LED3
#define LED3_OFF PORTD &= ~LED3
#define LED3_TOG PORTD ^= LED3
void led_on (uint8_t x){
if(x==1) LED1_ON;
else if(x==2)LED2_ON;
else if(x==3)LED3_ON;
}
void led_off (uint8_t x){
if(x==1) LED1_OFF;
else if(x==2)LED2_OFF;
else if(x==3)LED3_OFF;
}
void led_tog (uint8_t x){
if(x==1) LED1_TOG;
else if(x==2)LED2_TOG;
else if(x==3)LED3_TOG;
}
To na pewno da się zrobić jakoś mądrzej, żeby w przypadku konieczności użycia np. czwartej diody nie musieć dopisywać do każdej funkcji kolejnego "else if", dyrektyw preprocesora (wiem, że one akurat nie są konieczne) itd.
Kombinowałem z jakimiś składniami typu: zamiast LED1 to LED(x), próbowałem użyć tych makr dostępu do portów, kombinowałem jak użyć tablic... nie umiem nic mądrego wymyślić...
Naprowadzi mnie ktoś na jakiś azymut?
Tylko bardzo proszę, jak najprostszym, lub chociaż w miarę prostym językiem... Dziękuję za wyrozumiałość...
Bartek.