Go Down

Topic: LCD 6-Zeilen Menü (Read 977 times) previous topic - next topic

Scape

Hallo,

mein Problem besteht zur Zeit in einem 6-zeiligen LCD Menü. Leider habe ich nirgendwo eine Library gefunden, wo dies möglich ist.
Ich habe jetzt versuch eine bestehende etwas abzuwandeln, nur ich sitze jetzt seit 1 1/2 Tagen da dran, und es ist nur Kopfzirkus.

Code: [Select]
typedef struct MenuStructure
{
  char text [25];
  unsigned char num_menupoints;
  unsigned char up;
  unsigned char down;
  unsigned char enter;
  unsigned char func;
}MenuEntry;

MenuEntry menu [] =
{
   {" [Hauptmenue]  ",  3,  0,  0,  0,  0},       //0
   {" Luefter       ",  3,  1,  2,  4,  0},        //1
   {" Licht         ",  3,  1,  2, 20,  0},           //2

   {" [Luefter]     ",  4,  0,  0,  0,  0},          //3
   {" Automatik     ",  4,  4,  5,  8,  0},        //4......

So weit der Menüaufbau.
Nun zum Aufruf:
Code: [Select]
void show_menu (void)
{
 
   unsigned char line_cnt = 0;
   unsigned char from = 0;
   unsigned char till = 0;
   unsigned char temp = 0;
    unsigned char upper_space = 2;
   unsigned char lower_space = 3;
   unsigned char rows = 6;
   char message[20];
   test = 1;
while (till <= selected)    //sucht die letzte Stelle im Menü
{till +=   menu[till].num_menupoints; 
}
from = till - menu[selected].num_menupoints;
till--;              // minus einen weil array bei 0 anfängt
temp = from;

if ((selected >= (from + upper_space)) && (selected <= (till -lower_space)))
{  from = selected - upper_space ;
   
   
    if(menu[from].num_menupoints < 6)
     {
       test= 7 - menu[from].num_menupoints;
     }
     till = from + (rows -test);   
    for (from; from<=till; from++)
    {
      lcd.LCD_write_string(0, line_cnt,(char*) menu[from].text, MENU_NORMAL);
     line_cnt++;
    }
   
    lcd.LCD_write_string(0,rows-(test+lower_space),"-",1);  //!!!!!
    delay(50);
}
else
{
   if (selected < (from+ upper_space)) //im menü oben
   {
     
     if(menu[from].num_menupoints < 6)
     {
       test= 7 - menu[from].num_menupoints;
     }
      till = from + (rows - test);
   
       
    for (from; from<=till; from++)
      {
        lcd.LCD_write_string(0, line_cnt,(char*) menu[from].text, MENU_NORMAL);
       line_cnt++;
      }
   lcd.LCD_write_string(0,selected - temp,"-", 1); //!!!
   delay(50);
   }
   if (selected == till)    //im menü unten
   {
   
   
    if(menu[from].num_menupoints < 6)   
     {
       test= 7 - menu[from].num_menupoints;
     }
     from = till - (rows -test);
   
    for (from; from<=till; from++)
        {
          lcd.LCD_write_string(0, line_cnt,(char*) menu[from].text, MENU_NORMAL);
           line_cnt++;
        }
   
    lcd.LCD_write_string(0,from+test,"=",1); ///!!!!
     }
   
}
 
}

Also.. ich habe es soweit, dass das Menü auf 6 Zeilen richtig angezeigt wird. Was mir leider absolutes Kopfzerbrechen bereitet ist die Markierung in welcher Zeile ich mich befinde.
Muss auch nicht durch vorgesetzten Zeichen markiert werden kann von mir aus auch "gehighlightet" werden.
Will hier auch gar keinen Code schnorren oder sonst was, nur vllt. ist hier der ein oder andere dem das System sofort ins Auge fällt.
Mir würden auch Tipps reichen oder sonst was, hauptsache ich komme hier nach einen Wochenende Menü- umbasteln mal weiter.

Von daher wäre ich für alle Ideen / Tipps / Vorschläge sehr dankbar.

Gruß Kevin

Jomelo

Hi, les dir mal bitte dieses Thema durch.

http://arduino.cc/forum/index.php/topic,73816.0.html

Ich habe schon eine Lib geschrieben die deine Aufgabenstellung erfüllt. Wenn dazu noch fragen sind, kannst du diese gerne hier stellen oder mir eine PM schreiben.

Scape

Super, dankeschön! Mit der Vererbung habe ich dann auch das Theater nicht mehr mit dem Array... lässt sich ja wesentlich angenehmer bearbeiten.

Werde heute abend mal schauen in wie weit ich das anpassen muss.


Go Up