@sandrak24
Niestety, dalej nie wyjaśniłeś, co chcesz osiągnąć i trzeba się domyślać. Z Twojego programu paru rzeczy nie rozumiem bez tych wyjaśnień.
1. Znak jest zdefiniowany przez 16*5 = 80 bitów? To znaczy, że jeden znak zajmuje dwie matryce?
2. W programie obsługujesz trzy układy MBI. Masz ich więcej i planujesz obsłużyć wszystkie? Dobrze rozumiem?
3. Zwróć uwagę, że bit może przyjmować tylko wartości 0 i 1 (o ile nie stosujesz logiki rozmytej

). Jak już sprawdzisz, że bit nie jest jedynką, to znaczy, że jest zerem i nie ma sensu tego dodatkowo sprawdzać (aczkolwiek kompilator i tak powinien usunąć to sprawdzenie).
4. Jeżeli bity masz rozproszone faktycznie po wielu portach, to if-y wcale nie są takie złe. Możesz ewentualnie nieco uprościć zapis:
Zaloguj się, aby zobaczyć kod
Niestety, makro ma tutaj swoje wady - jest sprytne, ale nie widać, że pierwszy argument nie może być zmienną i nie można użyć pętli for. Dlatego lepiej unikać takich sztuczek z konkatenacją, zdefiniować stałe na numer portu i bitu dla każdej linii i takie argumenty przekazywać do makra.
5. W mikrokonrolerach pisanie "generycznego" kodu przeważnie jest kosztowne. Najlepsze efekty uzyskuje się dopasowując do siebie sprzęt i oprogramowanie. Biorąc to pod uwagę, jeżeli np. masz układy MBI na dwóch portach i kolejnych bitach, można zapis podzielić na dwie części, w każdej składając kawałek bajtu z zawartości tablicy znaków i następnie wysyłać go na port:
Zaloguj się, aby zobaczyć kod
Nie jestem przekonany, czy byłoby to lepsze rozwiązanie w tym przypadku.