Skocz do zawartości

Menu obsługiwane za pomocą przycisków.


dragolice

Pomocna odpowiedź

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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. 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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)

Link do komentarza
Share on other sites

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!

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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)

Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.