Forum: Mikrocontroller und Digitale Elektronik Menü für R8C/13


von Jan Hermann (Gast)


Angehängte Dateien:

Lesenswert?

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

von holm (Gast)


Lesenswert?

Schaue Dir mal die Quellem zum AVR Butterfly an, die Statusmaschine von 
dort kannst Du gut gebrauchen...

Gruß,

Holm

von Jan HErmann (Gast)


Lesenswert?

Ich kann die Statusmaschiene nicht finden!
Gibt es auch noch andere Möglichkeiten?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

Schau dir dein Programm mal mit dem Debugger an.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.