Ja sa ospravedlnujem, ze nemam cas prehrabavat sa v zdrojaku a nieco testovat, ale ako som pisal, velmi bezpecny sposob je nasledovny. Hlavne treba oddelit cinnost zobrazenia polozky menu od cinnosti pohybu v menu. Dopredu sa ospravedlnujem za rozsiahlost vykladu, ale nie som pedagog a tak to strucnejsie a mozno aj pochopitelnejsie napisat neviem 
Priklad pohybu vo viacrozmernom menu:
Aby som neuvadzal nejake teoreticke priklady, skusim si vymysliet nieco s konkretnymi hodnotami poloziek.
Nech mam hlavne menu s piatimi polozkami
Nech ma kazda polozka prisudene submenu so styrmi polozkami.
Nech ma kazda polozka submenu prisudene subsubmenu s troma polozkami.
celkovo mam
jedno menu s piatimi polozkami
pat submenu so styrmi polozkami
dvadsat subsubmenu s troma polozkami.
Takze spolu je 26 menu usporiadanych v troch vrstvach. Spolu je tam 85 poloziek.
Pre kazde menu sa bude uchovavat informacia o maximalnom pocte poloziek (index_max). V tomto pripade by sa mohlo zdat, ze naco, ked az 20 subsubmenu z prikladu ma rovnaky pocet poloziek, ale tu niet na com setrit, skutocny zivot prinasa pestrost.
Potom nam uz stacia tri premenne (indexy). Tri z nich informuju na ktorej polozke v menu, submenu a subsubmenu sa aktualne system menu nachadza. Hodnota 0 znamena, ze v danej urovni nie som, ale nachadzam sa o uroven vyssie.
Treba spravit rutinu, ktora testuje stav tlacitok. Tlacitka su pre jednoduchost styry sipka hore, sipka dole, enter a escape. Escape moze byt napriklad sucasne stlacenie oboch sipok.
Aby pohyb v menu vplyvom vyhodnotenia klaves neblblo, vrele odporucam nasledovny trik. Treba vyhodnotit nabeznu hranu stlacenia klavesy a nie jej drzanie. Ta mrcha procesor za 50ms moze aj 10x vyhodnotit stlacenie sipky hore a tak sa predsa s menu neda pracovat. Preto za stlacenie tlacitka povazujte iba nabeznu hranu bez ohladu na to ako dlho je tlacitko stlacene. Za urcitych okolnosti je vhodne vyhodnotit hranu dobeznu (pustenie tlacitka pri kombinacii stlacenia klaves) ale tym si teraz nebudeme komplikovat zivot. Skratka ak chce niekto chodit v menu, musi sipku stlacit a potom ju pustit predtym, ako chce prejst na dalsiu polozku. Trochu inak sa vyhodnocuju klavesy pri nastavovani hodnoty. To preto, aby clovek nezblbol, ked chce zmenit hodnotu napr z 20 na hodnotu 30000. O tom sa vsak teraz nebavime.
Po restarte sa index pre menu nastavi na hodnotu 1 a indexy pre nizsie urovne sa nastavia na nulu. Hodnota premennej informujucej na ktorej urovni v menu som (uroven) sa nastavi na hodnotu 1.
zavola sa funkcia, ktora zobrazi text pre danu polozku. Zaroven nech som si isty, ze v ziadnom menu nebudem mat viac ako 99 poloziek.
Potom sa da zobrazovacia funkcia spravit cez case napriklad takto:
fn_zobraz_menu(void)
{
uint32_t hodnota_menu;
hodnota_menu = index_menu * 10000 + index_submenu * 100 + index_subsubmenu;
switch (hodnota_menu) {
case (010000) : {
fn_zobraz_prvu_polozku_z_prveho_menu();
break;
}
case (020000) : {
fn_zobraz_druhu_polozku_z_prveho_menu();
break;
}
// ...
case (020100) : {
fn_zobraz_prvu_polozku_z_druheho_menu_z_1p1m();
break;
}
// ...
case (030302) : {
fn_zobraz_druhu_polozku_z_tretieho_menu_z_3p2m_z_1p1m();
break;
}
// ...
default : {
fn_zobraz_chybu_zbrazenia()
break;
}
}
}
Funkcia pre spracovanie tlacitok.
Stlacenim sipky (vyhodnocuje sa iba nabezna hrana) hore sa odpocita 1 z indexu menu. Ak je index rovny 0, potom sa do premennej nastavi maximalna hodnota z daneho menu.
Stlacenim sipky dole (vyhodnocuje sa iba nabezna hrana) sa pripocita 1 k indexu menu. Ak je hodnota vyssia ako maximalna hodnota, do premennej sa nastavi hodnota 1.
Ak som na niektorej z pozicii a stlaci sa Enter (stale sa vyhodnocuje iba nabezna hrana), premenna uroven sa zvaci o jedna a index pre uroven menu 2 sa nastavi na hodnotu 1. Stlacanim sipiek menim premennu zodpovedajucu polozke na druhej urovni, lebo hodnota v ktorej urovni som sa rovna hodnote 2.
Ak som stlacil Enter na tretej polozke v menu, funkcia fn_zobraz_menu(void) postupne pri stlacani sipky dole zobrazuje obsah poloziek v menu
030100, 030200, 030300, 030400, 030100, 030200, …
Ak na niektorej z poloziek stlacim Enter, premenna uroven sa nastavi na hodnotu 3 a index pre uroven menu 3 sa nastavi na hodnotu 1.
Ak som stlacil Enter na druhej polozke v menu, funkcia fn_zobraz_menu(void) postupne pri stlacani sipky dole zobrazuje obsah poloziek v menu
030201, 030202, 030203, 030201, 030202, 030203, …
Po stlaceni tlacitka Escape sa premenna informujuca o polozke v danej urovni nastavi na nulu a premenna index sa zmeni o 1. Samozrejme, ak u ma hodnotu 1 dalej ju neznizujem. Taku polozku v menu nemam. Alebo ju mat mozem a moze to byt uvodna obrazovka s privitanim a gratulaciami spojenymi s pouzivanim tohto skveleho vyrobku potom ale treba do switch a case doplnit
case (000000) : {
fn_zobraz_uvodne_privitanie();
break;
}
Doteraz som hovoril o niecom tak nepraktickom ako je nejake chodenie v “skoro” nekonecnom menu. To je v praxi malokedy ziaduce. Casto je treba nastavovat alebo nulovat rozne hodnoty, zobrazovat ich v roznych ciselnych sustavach, rozsahoch, pripadne textovych interpretaciach (napriklad ANO/NIE/NECHCE SA MI).
Z tohto dovodu je potrebme kazdu polozku menu doplnit o nasledovne informacie, co sa ma stat, ak sa na polozke stlaci klavesa Enter
-
polozka je needitovatelne cislo, ak sa stlaci enter, nic nerob
-
polozka je editovatelne cislo hocikym
-
polozka je editovatelna, iba ak je niekde zadane aktivacne heslo (napr. laicke, uzivatelske, servisne a vyrobne menu. Tieto styri urovne sa v praxi osvedcili najviac.)
-
polozka je “vstupom” do submenu (to co som vyssie popisoval)
-
polozka je pri danom nastavenom hesle neviditelna a automaticky sa preskakuje na nasledujucu polozku (ak niekto nezadal heslo s pristupovymi pravami pre prezeranie danej polozky)
-
ak polozka predstavuje zobrazenie nejakeho cisla, tak v akom formate.
Osvecuju sa nasledovne: 16b integer bez znamienka, so znamienkom, 8b integer bez znamienka, zo znamienkom, 32b integer, char, binarne zobrazenie 8b/16b z 0 a 1, vhodne pre prezeranie napr nastavenia relatok, vyctovy typ, t.j. kazda hodnota cisla zodpoveda nejakemu textu z pola textov. Napr 0 = mrzne, 1 = je chladno, 2 = je sviezo, 3 = je prijemne, 4 = je horuco.
Ak sa zobrazuje polozka menu na LCD display, tak treba v ramci polozky zvlast zadefinovat pomocne texty ako je nazov polozky a napr. fyzikalna jednotka a zvlast treba definovat priestor na cislo (na kolko miest a na kolko miest za desatinnou bodkou).
- velmi dolezita vec je, ci sa ma cislo zobrazit s desatinnou bodkou a kde ma byt tato v cisle umiestnena. Preco by som mal kvoli tomu, ze potrebujem zisti hodnotu prudu v mA mal aj interne pracovat s mA na tri desatiny. Interne predsa mozem mat prud spracovavany v uA. Staci mi potom na spracovanie 16b premenna a nemusim narabat s matematikou s plavajucou ciarkou. Je jednoduchsie iba spravne formatovat vystupne zobrazenie. K desatinnej ciarke samozrejme patri aj to, na kolko miest sa ma premenna zobrazit za desatinnou ciarkou. Ak je premenna moc vysoka aby sa zmestila do zobrazovacieho priestou, zobrazte tam znaky napr. HH.HH Ak je premenna moc nizka, zobrazte znaky LL.LL alebo tak nejako.
Co je velmi dolezite, VZDY si rozkuskujte sw na samostatne funkcie vykonavajuce jednu logicku a lahko skontrolovatelnu cinnost. Napriklad behanie v ramci menu. To predsa nema vobec nic spolocne so sposobom prezentacie udajov. Tak si to tou castou nekaze. Tento pristup ocenite pri pouzivani menu pre LED alebo pre LCD display. Prezentacia je principialne odlisna, behanie po menu, submenu a subsub… menu rovnaka.
Pekne je doprogramovat ficuru, ze ak sa dlhsie nic nestlaci menu prejde do nejakeho stavu a za kazdy nastaveny cas (napr za tri sekundy) sa presunie na inu polozku. Tak je mozne prezentovat najdolezitejsie udaje v automaticky sa striedajucich sekvenciach. Nie je to ziadna veda. Staci rutine pre pohyb v menu iba “podstrcit” fantomove stlacenie tlacitok.
Zase som sa rozpisal, tak sorry. Niektory tu maju pravdu, ze ked zacnem, neviem kedy skoncit. 
Ak to aspon jednemu na nieco uzitocne bude, tak fajn. Prajem pekny vecer. 