Nie wiem dlaczego tak w stronę makr ciągniecie. Od makr należy uciekać jak najdalej. Wiadomo, że nieraz ułatwią wiele, ale mają jedną podstawową wadę - nie są sprawdzane przez kompilator (np. zgodność typu). Zamiast makr należy stosować funkcje - po to one są.
Fragment:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
można zastąpić:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a funkcje obsługi LEDów robisz osobno, np.:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Zaletą jest, że można dowolnie podłączyć LED (port, pin, sposób sterowania itp.), kompilator sprawdza poprawność, w funkcji wywal_blad() możemy zdefiniować co ma się dziać w programie, gdy w jakimś nieprzewidzianym przypadku zmienna
i wyjdzie poza dopuszczalny zakres. Łatwo też będzie zmienić, gdy zamiast zapalania diody będziemy chcieli jeszcze coś obsłużyć (np. dodać efekt dżwiękowy) - wystarczy zmodyfikować zapal_led(). Oczywiście lepiej nazwę wtedy zmienić, np. na: reakcja_temp_za_wysoka() - taka nazwa pozwala też łatwo rozczytać się w kodzie i znaleźć błąd w złym przypisaniu funkcji w danej sytuacji.
Aha, być może ciało funkcji zapal_led gasi, a nie zapala, ale to już sam wiesz. Wiem, że użyłem makr, ale tylko tych, które definiują porty, piny itp. Tego się raczej nie przeskoczy, jeśli chce się zachować czytelność kodu.

Zresztą zaleca się używanie definicji zastępujących wartości liczbowe, np. zamiast 3.14 lepiej użyć
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
gdyż, jeśli będzie potrzeba zwiększyć jej dokładność to wystarczy zrobić to w definicji a nie w wielu miejscach programu, gdzie jej użyliśmy. Podobnie jeśli przyjdzie zmienić typ można zapisać:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.