Faktycznie kody na pierwszy rzut oka mogą wydawać się trudne, ale sama idea ich działania jest dość prosta. W pierwszym z nich pomocnicza zmienna k jest flagą informującą o kierunku przesuwu wartości rejestru PORTC. Dla k różnego od zera "dioda" przesuwana jest w prawo, a w przeciwnym wypadku w lewo. W związku z tym, że na początku k = 0 to przesuwanie będzę następowało w prawo, ale jeszcze wcześniej na czas 'a' ms będzie świecić dioda podpięta do pinu PC0 (PORTC na początku zainicjalizowane wartością 1). Przesunięcie tej jedynki w prawo spowoduje wyzerowanie rejestru, gdyż był to jego najmłodszy bit (można powiedzieć że ta jedynka "wypadła" z prawej strony bajtu): 00000001 -> 00000000.
Następnie natrafiamy na warunek który sprawdza czy PORTC = 0, w tym obiegu pętli jest on prawdziwy (potwierdza to poprzednie zdanie). W takim wypadku wykonujemy dość dziwną operację arytmetyczną, mianowicie dzięki mnożeniu przez składnik k możemy odrzucać liczbę 0x3E (dziesiętnie 62), jeśli tylko k = 0, ponieważ mnożenie jakiejkolwiek wartości przez 0 daje w wyniku 0. Jednak to nie wszystko, bo niezależnie od k dodajemy do otrzymanego wyniku 2. Otrzymujemy w ten sposób możliwość przypisania do rejestru PORTC jednej z dwóch liczb: dla k = 1 będzie to 62 * 1 + 2 = 64, natomiast jeżeli k = 0 wtedy 62 * 0 + 2 = 2. W związku z tym, że na chwilę obecną k = 0 to zapalona zostanie dioda PC1, ponieważ PORTC = 2.
Teraz wystarczy zanegować logicznie k (z 1 na 0 i z 0 na 1), co oznacza zmianę sposobu przesuwania wartości (moje drugie zdanie to wyjaśnia) zawsze w przypadku osiągnięcia "krawędzi" linijki diodowej ("wypadnięcia" jedynki z lewej lub prawej strony). Analizując dalej ten algorytm przechodzimy do drugiej iteracji pętli w której dalej oczekujemy pewien czas, następnie wykonujemy odpowiednie przesunięcie wartości (tym razem w lewo, gdyż k zostało zanegowane). Kolejny warunek się nie wykona, ponieważ PORTC jest już równy 4 (PC2) itd., aż do momentu osiągnięcia wartości 128 (PC7), po którym nasza jedynka "wypadnie" tym razem z lewej strony: 10000000 -> 00000000. W tym momencie ponownie zostanie wykonany warunek, który do PORT przypisze wartość 64 (pamiętamy, że w dalszym ciągu k = 1), która reprezentuje zapalanie diody PC6. Ponownie negujemy k i tym razem przesunięcia będą następowały w prawo.
Drugi kod jest moim zdaniem nieco prostszy i opiera się o pewną "sztuczkę" arytmetyczną. Chodzi tutaj o to, że wartość zmiennej b jest ograniczona z góry liczbą 7 natomiast z dołu zerem. Jeżeli zostaną osiągnięte te skrajne wartości wtedy następuje negowanie, ale tym razem arytmetyczne (zmiana znaku liczby na przeciwny). Ponieważ na początku k = 1 to po negacji arytmetycznej będzie miała wartość -1, później 1 itd.. Taki nasz znacznik kierunku dodajemy do pomocniczej zmiennej b, która jest drugim operandem operatora bitowego przesunięcia w lewo (informuje o pozycji/numerze zapalonej diody). Oczywiście dodając 1 dokonujemy niejako inkrementacji, natomiast dodając -1 dekrementacji tej zmiennej.
Efekt jest taki, że b zmienia się od 0-7, później 7-0 itd., natomiast PORTC zapala kolejne diody "odbijając je od krawędzi".
Dość długie to moje tłumaczenie, ale chciałem w miarę szczegółowo przedstawić ideę działania tych algorytmów
W sprawie zliczania ilości naciśnięć klawisza, rozwiązaniem może być inkrementowanie zmiennej przy każdej reakcji na zbocze opadające. Pewnie nawet sam sobie nie zdajesz sprawy, ale w pewien sposób zrealizowałeś automat skończony (zmienna flaga jest zmienną stanu), który również może zrealizować wszystkie Twoje "zachcianki" sterowania przyciskiem (nawet odstępy czasowe)
. Nie chcę na razie przedstawiać dodatkowych propozycji kodów, ponieważ znowu niepotrzebnie utrudniłbym zrozumienie tematu