Widzisz więc czemu ważne jest wyodrębnienie bloków funkcyjnych (partii kodu, które odpowiadają za jedną rzecz) i powyrzucanie ich do funkcji? Teraz według mnie znacznie lepiej widać co robi cały program (funkcja main).
No to teraz skoro widać, co ten program ma robić, zajmijmy się jego ożywieniem + kosmetyką:
1. Obsługa zegarka - nie ma sensu tworzyć flagi od zmiany czasu, taki prosty warunek można sobie sprawdzać za każdym razem. Wyrzucamy więc zmienną Timer2_flag i przerabiamy linie 155-175 do takiej postaci:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Mamy 8 linii, możemy to sobie wyrzucić do procedurki.
2. Problemy z czasami losowo pojawiającymi się przyciskami - ADCka masz w trybie ciągłym, a każdy jego pomiar (trwający kilka us) bierzesz za pewnik. To są już elementy analogowe - przycisk będzie miał gorszą chwilę, na ścieżkach coś Ci się zaindukuje, przetwornik w uP też idealny nie jest. Rozdzielczość masz 10 bitową, tworzysz więc zmienną 16bitową, która Ci uśredni 64 pomiary (2^(16-10)) . I w ten sposób przerwanie ADCka zmieniamy do postaci:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Przesuniecie bitowe o 6 w prawo jest równoważne z częścią całkowitą z dzielenia przez 64. Niestety przerwanie ADCka wydłużyło się - jeżeli program będzie działał losowo to zwiększ mu prescaler - pomiary będą dokonywać się wolniej, na przerwanie będzie więcej czasu, ale i tak będą się wykonywać i tak za szybko jak na nasze potrzeby.
Zauważ że nie posługuję się "uint16_t", a "u16" - są to moje sztandarowe typy, wpisuje je zawsze za includami bibiliotek, zaraz po zaczęciu nowego projektu.
3. Skoro mamy już w miarę prawdziwe pomiary napięcia, teraz możemy zająć się ich interpretacją.
Poprzednie linie 148 - 151 miały działać w oparciu o flagę końca pomiaru ADCka - szkoda, że były w złym miejscu

. Użyjemy ich jednak w procedurze "rozpisz_klawisze".
Mamy 6 zmiennych odpowiadających za czekanie na puszczenie klawisza - to aż się prosi o macierz.
Czyszczenie ekranu jest zbędne - i tak za każdym przebiegiem funkcji main od nowa wszystko podajesz.
Kilka zmiennych, które odpowiadają za podanie do funkcji main, które przyciski są wciśnięte mogą być przydatne, ale chwilowo załóżmy, że tylko jeden przycisk może być wciśnięty. Dzięki typowi wyliczeniowemu będzie można sobie potem czytelnie sprawdzać, który przycisk jest wciśnięty i na jego podstawie coś robić.
Funkcja rozpisz_klawisze przybiera więc postać:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak widać funkcja zaczęła nam w sposób jawny zwracać wynik - dlatego musimy do niej przypisać wartość.
4. Linie 17-18 w starym kodzie zawierają deklaracje do jakichś nieistniejących funkcji - wyrzucamy.
I ostatecznie program przyjmuje taką postać:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Program przy kompilacji naturalnie "pluje" błędami - jest to spowodowane tym, że wyrzuciłem ileś niepotrzebnych zmiennych. Obecnie masz jeszcze bardziej odchudzony main oraz procedurę, która ładnie zwraca który klawisz jest wciśnięty. Logikę od obsługi działań względem tego klawisza zrobisz już sobie sam. Oczywiście nie wykluczam jakichś błędów - ja nie mam twojego boardu i piszę na "sucho".