Vytvoření menu v C pro ATmega16

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
raptor1811
Příspěvky: 56
Registrován: 12 bře 2010, 00:00

Vytvoření menu v C pro ATmega16

#1 Příspěvek od raptor1811 »

Zdravím, potřeboval bych vytvořit jednoduché menu v Céčku se zobrazením na LCD. Hlavní menu by mělo tak přibližně 4 položky a u některých položek by bylo submenu s dalšími řekněme dva až třemi položkami. Po vybrání určité položky by se zavolala určená funkce, která by vykonala určené operace. U tlačítek pro rolování v menu můžu použít i přerušení (při stisknutí libovolného tlačítka se vyvolá přerušení a můžu číst klávesy). Už se mi to i povedlo nějak naprogramovat, ale je to strašně neefektivní a nepřehledné, jelikož neumím moc používat ukazatele. Poradí někdo jak to naprogramovat co možná nejefektivněji?
Uživatelský avatar
Bernard
Příspěvky: 3654
Registrován: 27 kvě 2005, 00:00

#2 Příspěvek od Bernard »

Snad přes stavový automat. Možné stavy menu se očíslují (třeba 0..11 pro 4x3 položky). Po resetu se stav inicializuje, a při přerušení od tlačítka se zavolá funkce
switch (stav) {
case 0: ..........; break;
case 1: ..........; break;
case 2: ..........; break;
case 3: ..........; break;
..............
}

Pro každý "case" se podle stlačeného tlačítka změní dosavadni stav na nový, a případně se vykoná nějaká akce.

Asi to nebude nejefektivnější, ale přehledné.
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#3 Příspěvek od Atlan »

no ukazem ti ako sa to nema robit :D

switch (mode)
{
case 254: {if (!ok) {menu1();}
if (!c) {off251();}
if (!up) {tplus249();}
if (!down){tminus248();}
break;}

case 253: {if (!ok) {hodn247();}
if (!c) {menu254();}
if (!up) {prog246();}
if (!down){prog246();}
break;}
.................

case 247:{if (!ok) {nden243();}
if (!c) {time253();}
if (!up) {minp244();}
if (!down){hodp245();}
break;}
...............................

void off251 (void)
{mode=254;
if(!nzv).............


void tplus249 (void)
{
if (nzv)
{mode=254;............................

void hodn247 (void)
{mode=247;
ncasden();
return;
}
Uživatelský avatar
MrMarian
Příspěvky: 48
Registrován: 14 říj 2010, 00:00

#5 Příspěvek od MrMarian »

Zdravim,

Zrovna robim aj ja menu, a robim to cez switch a case ... Mam tam tri urovne menu

MENU1 - hlavne menu
MENU2 - vyber parametrov
MENU3 - nastavene parametrov / premnennej (cas, max. / min. teplota, limity, ON / OFF)

To Atlan: Ako je to spravne? Mozes sem dat kusok kodu?

Dakujem a prajem pekny den.

M.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#6 Příspěvek od mtajovsky »

Pokud to budete resit jako stavovy automat tak radeji pres distribucni tabulku s pointry na funkce. Zapis pres case a if je neprehledny a spatne se modifikuje.

http://www.elektroworld.h51.eu/modules. ... highlight=
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#7 Příspěvek od ZdenekHQ »

MENU 2 a 3 jde sloučit - obslužnýmu podprogramu předáš jen ukazatel na tabulku s pojmenováním parametrů a nějaký registr naplníš patřičnými proměnnými (většinou jen aktuální hodnota, lze i definovat max a min hodnotu, popř. výpis on/off či numericky). Po návratu data z registru zase načteš zpět do proměnných, popř. uložíš do eeprom.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“