Flernivå menysystem till µc

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Flernivå menysystem till µc

Inlägg av EagleSpirit »

Har hittat en massa trådar om hur man får igång LCDer både i mjukvara och hårdvara, men jag har inte hittat någon tråd om hur man gör en meny till en LCD med en µC.

De två varianter jag har funderat på är switch/case och en array med data. Switch/case-varianten fungerar så att man helt enkelt kollar vilket mode man är i och utför det som står i den delen. Om man vill flytta upp eller ner i menyn så flyttas "pekaren" till nästa plats i menyn. Denna metod funkar ju och man har ganska bra översikt vad som händer, men det känns onödigt att skriva samma if-sats om och om igen.

Att använda en array av data borde i teorin vara lite kortare.Vad jag har förstått så använder samma rutiner för knapparna och flytta pekaren, sen flyttar man bara runt i en array som bestämmer vad som ska göras. Denna variant är ännu överskådligare eftersom man lägger hela menyn som endast innehåller menydata på ett ställe och funktionerna på en annan och ingen överflödig kod som ser precis likadan ut på 20 ställen.

Problemet för mig är att jag inte riktigt får dom att göra som jag vill, så fort jag vill göra lite extra i dom så strular det till sig.

Det finns säkert fler sätt att göra detta på och det är dom jag vill ha reda på. Hur gör ni när ni gör ett menysystem? Kom gärna med så många förslag som möjligt och lägg gärna upp kod. Jag programmerar för tillfället i Hitech C till PIC18 men det spelar ingen roll om det är i andra språk eller till andra kretsar.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag använder menysystem mycket, du kan kolla på en Janfire NH pelletsbrännare (om du råkar ha en sån) samt en del av Safe Traffic's system.

Generellt gör jag såhär:
Har oftast 4 knappar ('+', '-', 'OK', 'Meny') där man väljer punkt med 'Meny', ändrar värden med '+'/'-' och sparar ändringen med 'OK'.
Jag brukar ha en variabel som kallas 'Menu-Index', initialiseras till 0.

Kod: Markera allt

char Got_Key;
Got_Key = Get_Key();
if(Got_Key) // Any key recieved?
  {
  if(Got_Key == Key_Menu) if(++Menu_Index > MAX_MENU) Menu_Index = 0;
  switch(Menu_Index)
    {
    case 0:
      switch(Got_Key)
        {
        case key_Plus: // Increase some value
        break;
        case key_Minus: // Decrease some value
        break;
        }
      Print_LCD("Whatever needed at this point");
    break;
    case 1:
      switch(Got_Key)
        {
        case key_Plus: // Increase some value
        break;
        case key_Minus: // Decrease some value
        break;
        }
      Print_LCD("Whatever needed at that point");
    break;
    default: Menu_Index = 0; // Just to catch a lot of trouble
    }
  }
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg av EagleSpirit »

Man tackar, det där är ju varianten med switch/case som jag skrev om. Det blir nog den varianten som jag använder ändå. Hmm, det där med switch på knapparna var ju också smidigt, om man tänker ur optimeringssynvinkel, är det bättre med switch än if-satser?
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Switch och if-satser blir ung. det samma när man kollar på asm-koden som bildas, det är bara enklare att överskåda i C.
Skriv svar