No i przekonałeś się, że brak flagi key_..._zablokowany psuje działanie klawiszy, bo zmienne zmieniają się zbyt szybko. Z kolei zwiększenie czasu spowodowałoby, że klawisz musiałby być trzymany dłużej.
Ostatni kod wygląda już spoko. Nie potrzebnie wyrzuciłeś procedurę obsługi przerwania ISR( INT0_vect ) to w niczym nie przeszkadzało, a teraz musisz to dodać. Nie wiem też po co wprowadziłeś sobie nowe zmienne, które określasz jako "zmienne, które będą ustawiane" to przecież mogą być te same zmienne które odczytałeś z zegara (te po konwersji). Dlatego odczyt zegara jest blokowany, aby odczyt nie kłócił się z ustawianiem. Zastanów się, przecież jak ustawia się zegar to chce się zmienić czas, który jest w tym momencie i dlatego nowe zmienne nie są potrzebne i tylko skomplikują sprawę.
Ad. 1. Podałem gotowe rozwiązanie. Masz takie zmienne widac_..., które w tej części kodu zmieniają swój stan na przeciwny jak zmienna ustaw ma odpowiednią wartość np. dla godzin ustaw = 1. Teraz wyświetlasz godziny zawsze, a należy to zrobić tylko jak zmienna widac_godziny ma wartość 1, a w innym razie dwie spacje, aby godziny zniknęły i to wszystko.
Ad. 2. To jest troszkę inaczej. Tam, gdzie teraz masz sprawdzanie w warunku zmiennej int0_flag dodaj to co było wcześniej tylko bez używania funkcji lcd_..., bo wyświetlanie jest w dalszej części (TWI_read_buf itd.) Zmienna int0_flag ustawiana jest w przerwaniu co sekundę, bo układ zegara co sekundę zmienia stan wyjścia INT.
Ad. 3. Tą funkcję w zasadzie też masz gotową. Należy część kodu, która na starcie zapisywała bufor do zegara (TWI_write_buf i to co powyżej). Flagę int0_flag zostaw w spokoju.
A odnośnie pytania skąd warunek w kodzie
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to przedstawia się to następująco dla zmiennej ustaw:
0 - odczyt zegara - normalna praca
1 - ustawianie godzin / miganie godzin
2 - ustawianie minut / miganie minut
3 - ustawianie sekund / miganie sekund
4 - ustawianie pełnego roku / miganie pełnego roku
5 - ustawianie miesiąca / miganie miesiąca
6 - ustawianie dnia / miganie dnia
7 - ustawianie dnia tygodnia / miganie dnia tygodnia
Dużo tego, ale w zasadzie jest całkiem podobnie. Na pocieszenie dodam, że to nie koniec, bo należałoby zadbać o to, żeby dni miesiąca miały inną inną wartość maksymalną podczas ustawiania w zależności od miesiąca i roku.