mam ted problem ze pokud dam OK a dostanu se do case jednotlivych polozek tak pak v Submenu nemuzu pouzivat sipky hodi me to zpet do Menu coz je logicke z toho programu jak funguje menu. pravdepodobne mam chybu ve viuziti voidu ze bych mel pouzit nejakou jinou vec ale nemuzu prijit na to jakou
zatim jsem se stim nesetkal nevedel by nekdo z vas jak na to ? jinak to snimani tlacitek uz mam udelane jinak tohle byl jen nejaky zaklad z netu.
[code] #include “template.h” // Code-Tamplate I use in my Projects
#include “lcd.h” // LCD HEADER FILE
#define UP PB0
#define DOWN PB1
#define OK PB2
void submenu1()
{
if((PIND & (1 << PD0)) == 0)
{
PORTD |= (1 << PD6); // rozsvieť LED
lcd_clrscr();
lcd_puts(“Menu1”);
lcd_gotoxy(0,1); // chod na poziciu x=4, y=0
lcd_puts(“Zapnuto”); // vypis text
}
if((PIND & (1 << PD1)) == 0)
{
PORTD &= ~(1 << PD6); // zhasni LED
lcd_clrscr();
lcd_puts(“Menu1”);
lcd_gotoxy(0,1); // chod na poziciu x=4, y=0
lcd_puts(“Vypnuto”); // vypis text
}
}
#define MAX_OPTIONS 6
// MENU Options
char menu_opt[MAX_OPTIONS][16] = { “MENU 1”, //jednotlive polozky v menu
“MENU 2”,
“MENU 3”,
“MENU 4”,
“MENU 5”,
“MENU 6”,
};
unsigned char item = 0, item_old=0;
void disp_opt(unsigned char);
void chk_btns(void);
int main(void){
DDRD = 0b11111000; // PD 0, 1, 2 jako vstupní
PORTD |= (1 << PD0)|(1 << PD1)|(1 << PD2); //zapnutí Pull-up na PD0, 1, 2
// LCD
lcd_init(LCD_DISP_ON);
lcd_clrscr();
// i/o Setup D.0-2 [PULLED UP]
//PREV NEXT SELECT BACK
IN(D,0); IN(D,1); IN(D,2); IN(D,3);
SET(D,0); SET(D,1); SET(D,2); SET(D,3);
// Initial LCD Text
lcd_putc('>');
lcd_putc(' ');
lcd_puts(&menu_opt[item][0]);
lcd_gotoxy(2,1);
lcd_puts(&menu_opt[item+1][0]);
while(1){
chk_btns(); // Poll Buttons
}
return(0);
}
// Display Options / Update LCD Display
void disp_opt(unsigned char item){
if(item>item_old){
lcd_clrscr();
lcd_gotoxy(2,0);
lcd_puts(&menu_opt[item-1][0]);
lcd_gotoxy(0,1);
lcd_putc(’>’);
lcd_putc(’ ‘);
lcd_puts(&menu_opt[item][0]);
}
else if(item<item_old) {
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_putc(’>’);
lcd_putc(’ ');
lcd_puts(&menu_opt[item][0]);
lcd_gotoxy(2,1);
lcd_puts(&menu_opt[item+1][0]);
}
}
// Check Buttons
void chk_btns(void){
// PRIMITIVE BUTTON POLLING
// Will detect the FIRST ACTIVE BUTTON
// One Active Signal on a single press
// Will Ignore Buttons which are checked LATER if any previously checked Button is ACTIVE
if(READ(D,0)==LOW){ // Prev Option
delay(BTBOUNCE);
while(READ(D,0)==LOW){};
item_old = item;
item -= item<1 ? 0 : 1;
disp_opt(item);
delay(BTBOUNCE);
}
if(READ(D,1)==LOW){ // Next Option
delay(BTBOUNCE);
while(READ(D,1)==LOW){};
item_old = item;
item += item>(MAX_OPTIONS-2) ? 0 : 1;
disp_opt(item);
delay(BTBOUNCE);
}
if(READ(D,2)==LOW){ // OK Button
delay(BTBOUNCE);
while(READ(D,2)==LOW){};
delay(BTBOUNCE);
switch(item)
{
case 0:
submenu1(); // vlozeny Void
break;
case 1:
break;
case 2:
break;
}
}
}
[/code]