Hallo Leute,
ich versuche grade auf dem AVR Butterfly ein Menü zu erstellen. Mein
bisheriger Code:
menu.h
1 | /*
|
2 | Menütexte erstellen
|
3 | */
|
4 | static const char menu_string0[] PROGMEM = "Anfang";
|
5 | static const char menu_string1[] PROGMEM = "Test1";
|
6 | static const char menu_string2[] PROGMEM = "Ende";
|
7 |
|
8 |
|
9 | /*
|
10 | */
|
11 | typedef struct MENU{
|
12 | const char *text;
|
13 |
|
14 | unsigned char next;
|
15 | unsigned char prev;
|
16 |
|
17 | } MENU_ENTRY;
|
18 |
|
19 | const MENU_ENTRY menue[] PROGMEM = {
|
20 |
|
21 | {menu_string0, 1, 2},
|
22 | {menu_string1, 2, 0},
|
23 | {menu_string2, 0, 2},
|
24 |
|
25 | };
|
Meine main.c
1 | int main(void)
|
2 | {
|
3 | unsigned char MENU_COUNT=0; //menu entry
|
4 | char key; //pressed key
|
5 | char run=TRUE; //Hilfsvariable updatet das LCD-Display
|
6 |
|
7 |
|
8 | Initialization();
|
9 | sei();
|
10 |
|
11 | for (;;) // Main loop
|
12 | {
|
13 | if (run)
|
14 | {
|
15 | LCD_puts_f((char *)pgm_read_word (&menue[MENU_COUNT].text), 1); //get current menu entry
|
16 | LCD_Colon(0);
|
17 | run = NULL; //only update lcd when key is up-to-date
|
18 | }
|
19 |
|
20 | key = getkey();
|
21 |
|
22 | if (key==KEY_PLUS)
|
23 | {
|
24 | MENU_COUNT=GetPost(MENU_COUNT, TRUE); //get next menu entry
|
25 | run = TRUE; //update lcd
|
26 | }
|
27 |
|
28 | if (key==KEY_MINUS)
|
29 | {
|
30 | MENU_COUNT=GetPost(MENU_COUNT, FALSE); //get previous menu entry
|
31 | run = TRUE;
|
32 | }
|
33 |
|
34 |
|
35 |
|
36 | } //End Main loop
|
37 |
|
38 | return 0;
|
39 | }
|
40 |
|
41 | /*********************************************************
|
42 | *
|
43 | * Function name : GetPost
|
44 | *
|
45 | * Returns : POST
|
46 | *
|
47 | * Parameters : CURRENT, MODE
|
48 | *
|
49 | * Purpose: Get Next/Previous menu entry
|
50 | *
|
51 | **********************************************************/
|
52 |
|
53 | unsigned char GetPost (unsigned char CURRENT, BOOL MODE)
|
54 | {
|
55 | unsigned char POST;
|
56 |
|
57 | if (MODE==TRUE) //get next entry
|
58 | {
|
59 | POST = menue[CURRENT].next;
|
60 | }
|
61 |
|
62 | else //get previous entry
|
63 | {
|
64 | POST = menue[CURRENT].prev;
|
65 | }
|
66 |
|
67 | return POST;
|
68 | }
|
GCC kompiliert das ganze ohne Probleme, nur leider wird nur der erste
String ('Anfang') auf dem LCD angezeigt. Bei Drücken des Joysticks ist
nichts mehr auf dem Display zu sehen.
Hat jemand von euch ne Idee?