Zasadniczym błędem jaki robisz to porównywanie wyniku działania makra bit_is_clear albo bit_is_set do wartości stałej (skąd wpadłeś na taki pomysł?).
if(i==1 && bit_is_clear(klawiszI ,sw1)==0)
W tym momencie warunek będzie spełniony (ten drugi), gdy przycisk będzie puszczony, a nie wciśnięty. A tutaj to już wogóle nie wiadomo kiedy warunek będzie prawdziwy:
if(bit_is_set(klawiszI, sw1)==1)
makro zwróci wartość różną od zera, gdy puścisz przycisk. Skąd wiesz że będzie to wartość 1? W języku C wystarczy, że wartość będzie różna od zera, żeby była prawdziwa, np. takie zapisy:
if (4)
while (1)
if (123)
powodują, że powyższe instrukcje zawsze sie wykonają. Nie wykonałyby się, gdyby tam było 0.
Dioda nie gaśnie z racji tego, że w ostatnim warunku robisz to co wyżej opisałem.
Może lepiej dla zrozumienia napisać program obsługujący jedną diodę. Jedno naciśnięcie zapala, drugie naciśnięcie - dioda gaśnie.
Poniżej zamieszczam program, który robi tak dla jednej diody. Wykorzystywana jest tylko jedna zmienna, bo więcej nie potrzeba.
Podpowiem, że jak chcesz po kolei załączać diody to musisz utworzyć nową zmienną, która będzie przechowywać informacje o tym która dioda się świeci. W tym programie masz tylko pojedyncze instrukcje zapalające lub gaszące diodę, zamiast nich wstaw instrukcję która, będzie zmieniać wartość zmiennej przechowującej dane o zapalonych diodach (tą dodatkową którą utworzysz) np. inkrementując jej wartość. Następnie musisz utworzyć dodatkową instrukcje której jedynym zadaniem będzie sprawdzanie wartości tej zmiennej i odpowiednio zapalać i gasić diody.