Skocz do zawartości

Menu obsługiwane za pomocą przycisków.


Pomocna odpowiedź

Tak tylko pojawia się problem z przyciskiem return, nie wiem czy mój schemat został w ogóle przeczytamy. Każdy poziom powinien pozwolić na wejscie poziom wyżej, a nie jak w przypadku switch case dojście do pewnego momentu i loop od nowa od samej góry. 

(edytowany)

http://www.embeddeddev.pl/menu-na-lcd-wprowadzenie/ zapoznaj się z tym artykułem. W ogóle przy tak rozwiniętym menu nie bawiłbym się w switche bo się w nich zaplączesz a utrzymanie takiego kodu będzie koszmarem. Moim zdaniem lepszym rozwiązaniem jest utworzenie struktur odwołujących się do siebie i tablic z opisami poszczególnych pozycji. Mnóstwo pisania z ręki ale kod jest czytelny. 

Podobne rozwiązanie menu było zaprezentowane w książce Tomasza Francuza "Język C dla mikrokontrolerów AVR" 

Edytowano przez _LM_
poprawiłem link
(edytowany)
3 godziny temu, dragolice napisał:

Tak tylko pojawia się problem z przyciskiem return, nie wiem czy mój schemat został w ogóle przeczytamy. Każdy poziom powinien pozwolić na wejscie poziom wyżej, a nie jak w przypadku switch case dojście do pewnego momentu i loop od nowa od samej góry. 

Mylisz się, instrukcja switch tak nie działa, z dowolnego case możesz przejść do dowolnego innego case.

Innymi słowy w case: 8 możesz wpisać by np. po spełnieniu jakiegoś warunku(przycisk?) następny był wykonywany case: 2.

Poczytaj więcej o tej instrukcji, bo jie wiem czy ten temat został w ogóle(!piszemy osobno) przez Ciebie przeczytany;)

Edytowano przez SOYER

Instrukcja switch to nie magia co robi jakieś zaklecia, tylko taki bardziej fajny if.

A wejście od nowa w loop to normalny sposób programowania mikrokontrolerów (mi już się znudziło przypominanie wszystkim o maszynie stanów)

switch(PRZYCISK)
{
     case 1:
       Zrób to tak;
       
       switch(PRZYCISK)
       {
         case 1:
           Zrób w ten sposób;
           
         case 2:
           Ato w ten;
       }

     case 2:
       chce do case 1 w switchu w case 1 tego switcha;
}

Czyli tak da radę? Maszyna stanów dobre podejście, polecasz jakiś przykład? Link oczywiście przestudiuję, dzięki!

Oczywiście, że cały czas leci pętla, ale to nie tak jak kolega napisał, że kiedy już pętla dotrze do switch to zawsze na początek wchodzi case1, potem 2 itd. To nie tak. Maszyna stanów to bardzo dobry temat, również omawiany na tym forum. @dragolice nawet ładnie ją rozrysował sobie, teraz musi w końcu przeczytać jak działa instrukcja switch i ruszy z kopyta.

Chyba, że kolega @_LM_ podpowie cos więcej, sam się chętnie nauczę, jak za pomocą struktur zrobić fajne menu.

Przykład bez sensu.

Jeśli w momencie wywolania switcha PRZYCISK ma wartość N, to jest mała szansa, aby w switchu w gałęzi odpowiadającej wartości N mial wartośc M (gdzie M != N)

(edytowany)

@dragolice źle...

Źle, za bardzo kombinujesz.

switch(PRZYCISK) {

case 1: Zrób to tak;  

break

case 2: Ato w ten;

break

case 3:

jak( coś){

   to wtedy przycisk=2}

break

}

EDIT: Powinno być:

to wtedy PRZYCISK=2

 

Edytowano przez SOYER
PRZYCISK = POBIERZ_PRZYCISK();

switch(PRZYCISK)
{
     case 1:
       Zrób to tak;
       PRZYCISK = POBIERZ_PRZYCISK();
    
       switch(PRZYCISK)
       {
         case 1:
           Zrób w ten sposób;
           
         case 2:
           Ato w ten;
       }

     case 2:
       chce do case 1 w switchu w case 1 tego switcha;
}

int POBIERZ_PRZYCISK(void)
{
  int PRZYCISK = BRAK;

  while (PRZYCISK != PRZYCISK1 && PRZYCISK != PRZYCISK2 && PRZYCISK != PRZYCISK3 && PRZYCISK != PRZYCISK4)
  {
    if (digitalRead(2) == LOW)
    {
      PRZYCISK = PRZYCISK1;
    }

    if (digitalRead(3) == LOW)
    {
      PRZYCISK = PRZYCISK2;
    }

    if (digitalRead(4) == LOW)
    {
      PRZYCISK = PRZYCISK3;
    }

    if (digitalRead(5) == LOW)
    {
      PRZYCISK = PRZYCISK4;
    }
  }
  while (digitalRead(2) == LOW || digitalRead(3) == LOW || digitalRead(4) == LOW || digitalRead(5) == LOW);
  return PRZYCISK;
}

Tak nie przejdzie?

Jeszcze wyjaśnij co to jest PRZYCISK, żebyśmy sie na pewno dobrze rozumieli i co on ma wspólnego z case. Będziemy też wiedzieć czy cos przeczytałeś o tej instrukcji.

2 minuty temu, dragolice napisał:
PRZYCISK = POBIERZ_PRZYCISK();

switch(PRZYCISK)
{
     case 1:
       Zrób to tak;
       PRZYCISK = POBIERZ_PRZYCISK();
    
       switch(PRZYCISK)
       {
         case 1:
           Zrób w ten sposób;
           
         case 2:
           Ato w ten;
       }

     case 2:
       chce do case 1 w switchu w case 1 tego switcha;
}

int POBIERZ_PRZYCISK(void)
{
  int PRZYCISK = BRAK;

  while (PRZYCISK != PRZYCISK1 && PRZYCISK != PRZYCISK2 && PRZYCISK != PRZYCISK3 && PRZYCISK != PRZYCISK4)
  {
    if (digitalRead(2) == LOW)
    {
      PRZYCISK = PRZYCISK1;
    }

    if (digitalRead(3) == LOW)
    {
      PRZYCISK = PRZYCISK2;
    }

    if (digitalRead(4) == LOW)
    {
      PRZYCISK = PRZYCISK3;
    }

    if (digitalRead(5) == LOW)
    {
      PRZYCISK = PRZYCISK4;
    }
  }
  while (digitalRead(2) == LOW || digitalRead(3) == LOW || digitalRead(4) == LOW || digitalRead(5) == LOW);
  return PRZYCISK;
}

Tak nie przejdzie?

Nie.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...