A jeśli chodzi o podejście od strony programowej, to można by to rozwiązać następująco (w pseudokodzie):
zmiana_cyfry {
wyłącz_obie_anody;
prawa = not prawa; // z każdym wywołaniem tej funkcji negujemy pewną zmienną
jeżeli(prawa) {
zapal_segmenty_dla_prawej_cyfry;
włącz_prawą_anodę;
} w przeciwnym przypadku {
zapal_segmenty_dla_lewej_cyfry;
włącz_lewą_anodę;
}
}
Procedurę zrealizowaną według takiego schematu należy wywoływać stosunkowo często (osobiście preferuję setki kHz, wówczas odbiór jest "komfortowy"), i regularnie. Regularność jest dość istotna, ponieważ jej brak sprawi, że jedna z cyfr może palić się nieco dłużej - sprawiając wrażenie jaśniejszej.
Z wymienionych powyżej powodów, warto wywoływać ją jako procedurę obsługi przerwania jednego z timerów. Przy takim podejściu, proszę pamiętać by zmienne globalne - którymi będzie następowała komunikacja programu głównego z procedurą obsługi przerwania - były zdeklarowane ze słowem kluczowym volatile.
Istotne jest by w takiej procedurze najpierw wygasić wyświetlacz a dopiero następnie zmieniać stany segmentów - dzięki temu na wyświetlaczu nie będzie "przesłuchów" między cyframi.