Hallo Ich bin dabei eine Haussteuerung zu entwickeln! Das ganze soll über ein Menü zu Bedienen sein. Die erste Menülage habe ich bereits programmiert! Allerdings habe ich Probleme mit den Untermenüs. Ich bekomme das einfach nicht hin! kann mir jemand helfen? // (c) Jan Hermann //-------------------------------------------------------------------- #include "main.h" long t; unsigned int TestInt = 0; #define ARRAYGROESSE 10 unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; void Menu(unsigned char key) { static unsigned int arr = 0; static unsigned char MaxMenue = 19,MenuePunkt=0; unsigned char text[19]; if(key & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LCD_Clear; } if(key & KEY2) { MenuePunkt++; LCD_Clear; } if((key & KEY1) && (key & KEY2)) MenuePunkt = 0; sprintf(text,"[%i]",MenuePunkt); LCD_Writexy(16,0,text); switch(MenuePunkt) { case 0: LCD_Writexy(0,0,"Haussteuerung"); LCD_Writexy(0,1,"(C) Jan Hermann"); LCD_Writexy(0,2,"1.2008"); break; case 1: LCD_Writexy(0,0,"System-Uhr"); sprintf(text,"%3i:%002i:",Minute,Sekunde); LCD_Writexy(0,1,text); sprintf(text,"%002i:%2i:",Sekunde,Minute); LCD_Writexy(1,2,text); if(key & KEY3) if(Minute) Minute--; if(key & KEY4) Minute++; if(key & KEY5) Sekunde = 0; break; case 2: LCD_Writexy(0,0,"Einstellungen"); LCD_Writexy(0,1,"Grundstruktur"); if(key & KEY5) { } break; case 3: LCD_Writexy(0,0,"Deckenlichter"); Ein Auszug aus dem Quelltext. Der ganze Code steht im Anhang! mfg Jan Hermann
Schaue Dir mal die Quellem zum AVR Butterfly an, die Statusmaschine von dort kannst Du gut gebrauchen... Gruß, Holm
Ich kann die Statusmaschiene nicht finden! Gibt es auch noch andere Möglichkeiten?
Eine Skizze der verschiedenen Zustände und der Übergänge zwischen den Zuständen kann weiterhelfen. Dadurch, dass man die skizze unabhängig vom Codieren macht, bekommt man selbst mehr Überblick, ob alle Zustände angefahren werden können und wie sie miteinander wechselwirken. Und man kann damit anderen seine Idee einfach und anschaulich verklickern, ohne dass diese sich durch einen nichtfunktionierenden Code beissen müssen, um herauszufinden wie du es mit dem Menü gemeint haben könntest.
Diese Zeile verstehe ich nicht:
> default: MaxMenue = MenuePunkt - 2;
Da du mit unsigned Variablen arbeitest gelangst du hier gerne in eine
Überlaufsituation.
Ansonsten ist das
1 | if(key & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LCD_Clear; } |
2 | if(key & KEY2) { MenuePunkt++; LCD_Clear; } |
3 | if((key & KEY1) && (key & KEY2)) MenuePunkt = 0; |
kritisch. Besser ist es die Fälle mit else abzugrenzen und zwar zuerst auf Doppelbetätigung achten und wenn Doppelbetätigung nicht stattfindet die Einzelbetätigung abzufragen.
1 | #define TASTE_MENUE_ERNIEDRIGEN (key & KEY1)
|
2 | #define TASTE_MENUE_ERHOEHEN (key & KEY2)
|
3 | |
4 | if(TASTE_MENUE_ERHOEHEN && TASTE_MENUE_ERNIEDRIGEN) |
5 | {
|
6 | MenuePunkt = 0; |
7 | // hier nicht LCD_Clear; !?
|
8 | }
|
9 | else if(TASTE_MENUE_ERHOEHEN) |
10 | {
|
11 | MenuePunkt += 1; |
12 | if(MenuePunkt > MaxMenue) |
13 | MenuePunkt = 0; // Wraparound |
14 | LCD_Clear; |
15 | }
|
16 | else if(TASTE_MENUE_ERNIEDRIGEN) |
17 | {
|
18 | if(MenuePunkt) |
19 | MenuePunkt -= 1; |
20 | else
|
21 | MenuePunkt = MaxMenue; // Wraparound |
22 | LCD_Clear; |
23 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.