Už delší dobu doma mám svůj vlastní vývojový KIT s ATmegou8. Vše šlape. Podařilo se mi rozblikat diodu i zobrazit text na LCD,..... a stále pokračuji dál.
Nyní řeším problém, jak si jednoduše udělat MENU.
Ale nějak se nedaří.
Takt ATmegy8 je 16MHz. Jako ovládací prvek je použit rotační enkodér.
Pomocí internetu, bádání,.... jsem napsal rutinu pro ovládání menu. Ale nefunguje.
zde jsou deklarace potrebne k chodu.
Kód: Vybrať všetko
#define MAX_OPTIONS 6
char menu_buf[MAX_OPTIONS][16] = {
"1.MENU ",
"2.MENU ",
"3.MENU ",
"4.MENU ",
"5.MENU ",
"6.MENU "
};
unsigned char item = 0, item_old=0;
Kód: Vybrať všetko
void disp_menu(unsigned char item){
if(item>item_old){
lcd_gotoxy(2,0);
lcd_puts(&menu_buf[item-1][0]);
lcd_gotoxy(0,1);
lcd_putc('>');
lcd_putc(' ');
lcd_puts(&menu_buf[item][0]);
}
else if(item<item_old) {
lcd_gotoxy(0,0);
lcd_putc('>');
lcd_putc(' ');
lcd_puts(&menu_buf[item][0]);
lcd_gotoxy(2,1);
lcd_puts(&menu_buf[item+1][0]);
}
}
void chk_encoder(void){
if (encoder > 6) {encoder = 0;}
if (encoder < 0) {encoder = 6;}
item = encoder;
item -= item<1 ? 0 : 1; //podmínka
disp_menu(item);
}
V nekonečné smyčce stále dokola volám:
Kód: Vybrať všetko
chk_encoder()
Třeba, když chci po "1. MENU" poslední "6.MENU", tak se mi pod sebou zobrazi 2x "6.MENU". Obdobně i když jedu naopak. Když po "6.MENU" chci "1.MENU".
Hodnota
Kód: Vybrať všetko
encoder
Proto bych se chtěl zeptat, jestli někdo neporadí.
Díky moc za vaši pomoc.