Hi,
so wie es sich anhört möchtest du ein Menü erstellen. Hier: http://www.mikrocontroller.net/topic/11266 wurde ein Menü für ein LCD erstellt. Dabei legt man als erstes einen typedef an z.B. den hier:
Danach kann man ein Array mit den Menüpunkten erstellen:Code:typedef struct MENU { unsigned char *text; uint8_t previous; uint8_t next; uint8_t stage; void ( *fp )( void ); } MENU_ENTRY;
Das ist dann die Menüstruktur, die Zahlen stimmen nich ganz aber ansonsten kann das so aussehen. Ich hatte damals ein 2zeiliges LCD und einen Drehencoder, und dann sah das main Programm so aus.Code:MENU_ENTRY menue[] = { { "Menue1", 33, 12, 1, fkt1}, { "Untermenue1", 11, 6, 2, fkt2}, { "Untermenue2", 5, 4, 2, fkt2}, { "Untermenue2", 2, 4, 3, fkt2}, { "Untermenue2", 2, 5, 0, fkt2}, { "Untermenue2" 4, 2, 5, fkt2}, { "Untermenue1", 1, 7, 2, fkt2 }, { "Untermenue1", 6, 8, 2, fkt2 }, { "Untermenue1", 7, 9, 2, fkt2}, { "Untermenue1", 8, 10, 2, fkt2}, { "Untermenue1", 9, 11, 0, fkt2 }, { "Untermenue1", 10, 1, 11, fkt2}, };
Wenn also der Encoder betätigt wird, dann wird eine neue Zeile geladen und wenn der "Enter-Knopf" gedrückt wird dann wird gegebenen falls ein String aus dem Untermenü geladen und die entsprechende Funktion ausgeführt.Code:void fkt1 (void){ } void fkt2 (void){ } int main (void){ init(); uint8_t menue_counter=0; uint8_t draw = 0; while(1){ if(enc_delta>0){ menue_counter=menue[menue_counter].next; draw=1; enc_delta=0; } else if (enc_delta<0){ menue_counter=menue[menue_counter].previous; draw=1; enc_delta=0; } if(!(PIND & (1<<PD4))){ _delay_ms(200); menue[menue_counter].fp(); menue_counter=menue[menue_counter].stage; draw=1; } if(draw){ lcd_string((char *)menue[menue_counter].text); set_cursor(1,2); lcd_string((char *) menue[menue[menue_counter].next].text); set_cursor(1,1); draw = 0; } } return 0; }
KR-500
Lesezeichen