PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD Menü Struktur



DerSchatten
07.02.2010, 20:02
Ich möchte mir gerne ein simples LCD-Menü erstellen.
In den meisten Infos die ich gesammelt habe wird erwähnt das man das am besten mittels Pointer realisiert.

Diesbezüglich habe ich mir mal folgendes zusammengestellt:



// LCD-Menüeinträge definieren
// ===========================
const char menu_000[] PROGMEM = " Multifunktions "; // 0
const char menu_001[] PROGMEM = "ArcadeController"; // 1
const char menu_002[] PROGMEM = "** HAUPTMENUE **"; // 2
const char menu_100[] PROGMEM = "Tastenzuordnung>"; // 3
const char menu_101[] PROGMEM = "[X ] 1"; // 4
const char menu_102[] PROGMEM = "[XX ] 2"; // 5
const char menu_103[] PROGMEM = "[XXX ] 3"; // 6
const char menu_104[] PROGMEM = "[XXXX ] 4"; // 7
const char menu_105[] PROGMEM = "[XXXXX ] 5"; // 8
const char menu_106[] PROGMEM = "[XXXXXX ] 6"; // 9
const char menu_107[] PROGMEM = "[XXXXXXX ] 7"; // 10
const char menu_108[] PROGMEM = "[XXXXXXXX ] 8"; // 11
const char menu_109[] PROGMEM = "[XXXXXXXXX] 9"; // 12
const char menu_200[] PROGMEM = "<Dauerfeuer >"; // 13
const char menu_201[] PROGMEM = "[ ] 0"; // 14
const char menu_202[] PROGMEM = "[X ] 1"; // 15
const char menu_203[] PROGMEM = "[XX ] 2"; // 16
const char menu_204[] PROGMEM = "[XXX ] 3"; // 17
const char menu_205[] PROGMEM = "[XXXX ] 4"; // 18
const char menu_206[] PROGMEM = "[XXXXX ] 5"; // 19
const char menu_207[] PROGMEM = "[XXXXXX ] 6"; // 20
const char menu_208[] PROGMEM = "[XXXXXXX ] 7"; // 21
const char menu_209[] PROGMEM = "[XXXXXXXX ] 8"; // 22
const char menu_210[] PROGMEM = "[XXXXXXXXX] 9"; // 23
const char menu_300[] PROGMEM = "<System >"; // 24
const char menu_301[] PROGMEM = "LCD >"; // 25
const char menu_302[] PROGMEM = "<LED-Test "; // 26
const char menu_400[] PROGMEM = "<Speichern >"; // 27
const char menu_500[] PROGMEM = "<Beenden "; // 28


typedef struct def_menustruktur
{
const unsigned char *text;
struct def_menustruktur* next;
struct def_menustruktur* previous;
struct def_menustruktur* sub;
struct def_menustruktur* up;
void (*funktion)(void);
}menustruktur;

void tastenzuordnung(void);
void dauerfeuer(void);
void lcd(void);
void led(void);
void speichern(void);
void beenden(void);

// Tabelle von Zeigern auf die Texte erstellen
// ===========================================
menustruktur menu[] PROGMEM =
{
{menu_100, 13, 3, 4, 3, },
{menu_101, 5, 4, 3, 3, tastenzuordnung},
{menu_102, 6, 4, 3, 3, tastenzuordnung},
{menu_103, 7, 5, 3, 3, tastenzuordnung},
{menu_104, 8, 6, 3, 3, tastenzuordnung},
{menu_105, 9, 7, 3, 3, tastenzuordnung},
{menu_106, 10, 8, 3, 3, tastenzuordnung},
{menu_107, 11, 9, 3, 3, tastenzuordnung},
{menu_108, 12, 10, 3, 3, tastenzuordnung},
{menu_109, 12, 11, 3, 3, tastenzuordnung},
{menu_200, 24, 13, 14, 13, },
{menu_201, 15, 14, 13, 13, dauerfeuer},
{menu_202, 16, 14, 13, 13, dauerfeuer},
{menu_203, 17, 15, 13, 13, dauerfeuer},
{menu_204, 18, 16, 13, 13, dauerfeuer},
{menu_205, 19, 17, 13, 13, dauerfeuer},
{menu_206, 20, 18, 13, 13, dauerfeuer},
{menu_207, 21, 19, 13, 13, dauerfeuer},
{menu_208, 22, 20, 13, 13, dauerfeuer},
{menu_209, 23, 21, 13, 13, dauerfeuer},
{menu_210, 23, 22, 13, 13, dauerfeuer},
{menu_300, 27, 24, 25, 24,},
{menu_301, 26, 25, 24, 24, lcd},
{menu_302, 26, 25, 24, 24, led},
{menu_400, 28, 27, 27, 27, speichern},
{menu_500, 28, 27, 28, 28, beenden}
};


So ganz funktioniert das leider noch nicht.
Kann mir da jemand weiterhelfen?

sternst
07.02.2010, 20:37
menustruktur enthält Zeiger, die Initialisierungswerte sehen aber nach Indizes aus. Du musst dich schon entscheiden, mit was von beidem du nun eigentlich arbeiten willst.

DerSchatten
07.02.2010, 21:18
menustruktur enthält Zeiger, die Initialisierungswerte sehen aber nach Indizes aus. Du musst dich schon entscheiden, mit was von beidem du nun eigentlich arbeiten willst.

Danke für den Hinweis.
Habs jetzt so definiert:



typedef struct def_menustruktur
{
char * text;
unsigned char next;
unsigned char previous;
unsigned char sub;
unsigned char up;
void (*funktion)(void);
}menustruktur;


Jetzt meckert er jedoch bei der Menüstrucktur.

../main.c:137: warning: initialization discards qualifiers from pointer target type

Was ist da wieder faul?

sternst
07.02.2010, 21:48
char *text;
->
const char *text;

DerSchatten
08.02.2010, 08:35
Danke.

Programm läuft nun soweit.
Warum bekomm ich bei



lcd_puts_p(pgm_read_word(&menu[menu_index].text));



../main.c:308: warning: passing argument 1 of 'lcd_puts_p' makes pointer from integer without a cast


Und dann würde ich gerne noch wissen wie man in der Struktur:



typedef struct def_menustruktur
{
const char *text;
unsigned char next;
unsigned char previous;
unsigned char sub;
unsigned char up;
void (*funktion)(void);
}menustruktur;


die Funktion anspricht.

Oder wird die automatisch aufgerufen wenn der entsprechende Menüpunkt angewählt wird?

chientech
08.02.2010, 20:03
Hi,

die Struktur enthält keine Funktion sondern einen Funktionspointer.


Aufruf geht ungefähr so...

menustruktur.funktion();

gruß

BurningWave
08.02.2010, 21:54
Aufruf geht ungefähr so...
Code:menustruktur.funktion();

Wobei du dem Zeiger erst mal eine Funktion zuweisen musst:


void eineFunktion(void)
{
//...
}
//...
void main()
{
//...
menustruktur.funktion = eineFunktion; //Zuweisung
menustruktur.funktion(); //ruft jetzt eineFunktion auf
//...
}


mfg