[WinAVR] LCD Jednoduché menu

tady máš takové jednoduché menu pro počet položek, který si zvolíš
každá položka má svou hodnotu a můžeš zadat minimum maximum při zadávání hodnoty

budeš potřebovat čtyři tlačítka - ENT,ESC, +,-

funguje to tak:
tlačítkem ent vstoupíš do menu - zobrazí se ti první položka s hodnotou
tlačítky +a- listuješ v položkách
tlačítkem esc vystoupíš z menu
tlačítkem ent umožníš změnu hodnoty(indikace na displeji)

když zvolíš změnu:
tlačítky +a- nastavuješ hodnotu
tlačítkem esc vystoupíš z nastavování zpět do menu bez uložení hodnoty
tlačítkem ent vystoupíš z nastavování zpět do menu s uložením hodnoty

musíš si ale dosadit svoje funkce pro obsluhu LCD
text položek a pozice na displeji samozřejmě taky dle tvých potřeb

[code]/nadefinuj si vstupy pro tlacitka tl_ent, tl_esc, tl_pus a tl_minus/

#define POCET_POLOZEK 5
typedef struct
{
int value;
int min=0;
int max=100;
}hodnotaStr;

hodnotaStr hodnota[POCET_POLOZEK];
char LcdBuffer[33];

void Main()
{
while(1)
{
if(!tl_ent) Menu();
/*
nejaky dalsi kod



*/
}
}

void Menu()
{
signed char i;
i=0;
MenuText(i);
while(!tl_ent);
while(1)
{
if(!tl_ent)
{
ZmenaHodnoty(i);
}
if(!tl_plus)
{
if(++i==POCET_POLOZEK)i=0;
MenuText(i);
while(!tl_plus);
}
if(!tl_minus)
{
if(–i<0)i=POCET_POLOZEK-1;
MenuText(i);
while(!tl_minus);
}
if(!tl_esc)break;
}
}

void MenuText(char index)
{

switch(index)
{
case 0: sprintf(LcdBuffer,“hodnota 1 %u”,hodnota[index].value);break;
case 1: sprintf(LcdBuffer,“hodnota 2 %u”,hodnota[index].value);break;
case 2: sprintf(LcdBuffer,“hodnota 3 %u”,hodnota[index].value);break;
case 3: sprintf(LcdBuffer,“hodnota 4 %u”,hodnota[index].value);break;
case 4: sprintf(LcdBuffer,“hodnota 5 %u”,hodnota[index].value);break;
}
//tady nastav lcd na 1.radek, 1.znak
Zobraz(LcdBuffer);
}

void ZmenaHodnoty(char index)
{
int tmp;
tmp=hodnota[index].value;
sprintf(LcdBuffer,“nastaveni”);
//tady nastav lcd na 2.radek, 1.znak
Zobraz(LcdBuffer);
while(!tl_ent);
while(1)
{
if(!tl_ent)
{
hodnota[index].value=tmp;
break;
}
if(!tl_plus)
{
if(tmp<hodnota[index].max)++tmp;
sprintf(LcdBuffer,"%u",tmp);
//tady nastav lcd na 1.radek, 12.znak
Zobraz(LcdBuffer);
while(!tl_plus);
}
if(!tl_minus)
{
if(tmp>hodnota[index].min)–tmp;
sprintf(LcdBuffer,"%u",tmp);
//tady nastav lcd na 1.radek, 12.znak
Zobraz(LcdBuffer);
while(!tl_minus);
}
if(!tl_esc)break;
}

}[/code]