slavcio2012 napisał: wiem , że tak można tylko nie wiem jak mam napisać ten kawałek kodu

Możesz to zrobic na wiele różnych sposobów zależnie od taktowania processora i od możliwości wolnego timera.
Załóżmy że masz dostepny timer1 (metoda najprostsza i najłatwiejsza). F(takt) = 1 MHz
Konfigurujesz Timer1 w trybie normal z prescalerem =256 ; co da pełny zakres max 16.7 sec
Dla 5 sec. timer potrzebuje 19531 ticks (TCNT1)
albo
Konfigurujesz Timer1 w trybie normal z prescalerem =1024 ; co da pełny zakres max 67.1 sec
Do odmierzenia 5 sec. timer potrzebuje 4882 ticks (TCNT1)
**************
Zakładam że „MENU” masz ujęte w oddzielnej subrutynie.
Wchodząc do menu stawiasz flagę;
Każdy naciśnięty tam przycisk (operacja w menu) - zeruje zawartośc timera1;
Na pewno masz tam pętle ‘Do.... Loop’, w której oprócz zasadniczego programu sprawdzasz czy timer1 osiągnął zadaną wartośc i jezeli ten warunek oraz flaga =1 jest spełniony, wtedy resetujesz flagę i dajesz Return (opuszczasz subrutynę ‘Menu’)
Jeżeli chcesz opuścic ‘menu’ na własne żądanie (odpwiedni przycisk) wtedy też reserujesz flagę przed Return.
Możesz próbowac pominąc tę flagę (zwykle ją stawiam z przyzwyczajenia).
Przu krótkich timingach mogą wystąpic błedy.
Jeżeli zechcesz użyc ('krótki') timer0 wtedy sytuacja może byc bardziej skomplikowana i wymagałaby wprowadzenia dodatkowej zmiennej zliczającej odpowiednio skonfigurowane przedziały czasowe (w oddzielnej subrutynie), a wtedy zamiast sprawdzac zawartośc timera w 'Do... Loop', sprawdzasz zawartośc tej zmiennej (w podobnym stylu jak sugerował kol. Kuniarz dwa posty wyżej).
Zmieniając taktowanie na inne niż wyżej wymaga dobrania innych parametrów;
prescalera i wartości TCNT1 odpowiadającej upływowi czasu 5 sec. lub innnej dowolnie wybranej./
e marcus