Menu w Case i jeden przycisk


Witam ,

postanowiłem sobie napisać menu padło na instrukcję case , mój problem to jak zagnieździć i obsłużyć case tzn.napisałem taki kod ale dziwnie obsługuje przycisk i nie wiem jak to mam poprawić

Do
Menu = Encoder(pinb.0 , Pinb.3 , Links , Rechts , 1)
Waitms 10
Loop
End
Links:
Incr Menu
 
If Menu >= 4 Then
   Menu = 0
   End If:
 
   Select Case Menu
   Case 0 : Waitms 100
   Locate 1 , 1 : Lcd "Scan     " :
       If Pinb.5 = 0 Then
                     Incr Scan
                     If Scan >= 3 Then
                     Scan = 0 : End If
 
                     Select Case Scan
                     Case 0:
                     Locate 2 , 2 : Lcd "Sped"
                           If Pinb.5 = 0 Then
 
                          Incr Sped : If Sped >= 2 Then : Sped = 0 : End If : End If :
 
                         Select Case Sped
                          Case 0:
                          Locate 2 , 8 : Lcd "Fast"
                          Case 1:
                          Locate 2 , 8 : Lcd "Slow"
                          End Select :
 
                     Case 1:
                     Locate 2 , 2 : Lcd "Freq"
                          If Pinb.5 = 0 Then 
                          Incr Of : If Of >= 2 Then : Of = 0 : End If : End If
                          Select Case Of
                          Case 0:
                          Locate 2 , 7 : Lcd "ON    "
                          Case 1:
                          Locate 2 , 7 : Lcd "OFF   "
                          End Select :
                     Case 2:
                     Locate 2 , 2 : Lcd "Memory"
                     End Select
                      End If
   Case 1 : Waitms 100
   Locate 1 , 5 : Lcd "Display"
 
   Case 2 : Waitms 100
   Locate 1 , 5 : Lcd "Beep      "
 
   Case 3 : Waitms 100
   Locate 1 , 5 : Lcd "AGC       "
End Select
Return
Rechts:
 Decr Menu
Return
np.wybieram Sped tutaj kilkając chcę mieć do wyboru Fast lub Slow a w rzeczywistości przeskakuje mi do podmenu Freq OFF i kolejno do podmenu Memory




Portret użytkownika matrix

Re: Menu w Case i jeden przycisk

Masz to w ogóle źle napisane jak to napisał jeden kolega na innym forum.
Musisz wszystko utrzymać w pętlach do...loop i dopiero po zatwierdzeniu wychodzisz z pętli i przechodzisz dalej.
Spójrz na takie menu które ja sobie napisałem a zapewniam Cię że działa bo testowane było na "żywym organizmie".:

Dim Czy_foto1 As Byte
Dim Fototest1 As Byte
 
 
Deflcdchar 0 , 32 , 4 , 2 , 31 , 2 , 4 , 32 , 32            'strzałka w prawo - 0
Deflcdchar 1 , 2 , 4 , 14 , 17 , 17 , 17 , 14 , 32          'litera ó - 1
Deflcdchar 2 , 32 , 8 , 10 , 12 , 8 , 25 , 6 , 32           'literka ł - 2
Deflcdchar 3 , 2 , 4 , 14 , 16 , 16 , 17 , 14 , 32          'literka ć - 3
Deflcdchar 4 , 32 , 2 , 4 , 14 , 16 , 14 , 1 , 30           'literka ś - 4
Deflcdchar 5 , 32 , 2 , 4 , 15 , 2 , 4 , 15 , 32            'literka ź - 5
Deflcdchar 6 , 32 , 2 , 4 , 22 , 25 , 17 , 17 , 32          'literka ń - 6
Deflcdchar 7 , 32 , 14 , 1 , 15 , 17 , 15 , 4 , 2           'literka ą - 7
 
Cursor Off Noblink
Cls
 
 
pozycja_menu = 1
 
Do
 
 '*** jeśli menu główne będzie miało tylko dwie pozycje to
 '*** zamiast poniższych dwóch warunków z instrukcjami INCR oraz DECR
 '*** można zastąpić jedną instrukcją
 '*** if w_gore = 0 or w_dol = 0 then toggle pozycja_menu
 
 if w_gore = 0 then                          'przycsik w górę (down)
   incr pozycja_menu
   waitms 100
 end if
 
 if w_dol = 0 then                           'przycisk w dół (up)
    decr pozycja_menu
    waitms 100
 end if
 
 if pozycja_menu > 2 then pozycja_menu = 2
 if pozycja_menu < 1 then pozycja_menu = 1
 
 select case pozycja_menu
       case 1:
          home
          lcd"Menu 1          "
          gosub menu_1
       case 2:
          home
          lcd"Menu 2          "
          gosub menu_2
 end select
loop
end
 
 
menu_1:
    'coś do robienia
return
 
menu_2:
  Gosub Wyswietl_tak_nie                          'skocz do podprogramu wyświetlania w dolnej linii napisu NIE     TAK
    Do
        If W_gore = 0 Or W_dol = 0 Then          'jeśli nacisnę w górę lub w dół to
            Toggle Czy_foto1                      'zmień wartość zmiennej na przeciwną czyli 0<=>255
            Waitms 200
        End If
 
        If Czy_foto1 = 0 Then                      'jeśli zmienna wyboru wł/wył foto1 = 0 czyli foto 1 wyłączone
           Gosub Wyswietl_strzalke_nie              'wyświetl strzałkę na pozycji 2,1 a na pozycji 2,10 puste pole
          Else
           Gosub Wyswietl_strzalke_tak              'w przeciwnym razie na pozycji 2,1 puste pole a na 2,10 strzałkę
        End If
 
        If Wykonaj = 0 And Czy_foto1 = 0 Then          'jeśli foto1 wyłączone i nacisnę przycisk OK to
           Locate 2 , 1                                 'znajduje pozycję 2,1
           Lcd "Foto 1 wy" ; Chr(2) ; ".     "         'wyświetla napis Foto 1 wył
           Fototest1 = 0                              'wyłącza fototest dla foto 1
           Exit Do                                     'i wychodzi każe opuścić pętlę
        End If
        If Wykonaj = 0 And Czy_foto1 = 255 Then            'jeśli nacisnąłem OK i fototest włączony
           Locate 2 , 1                                     'znajduję pozycję 2,1
           Lcd "Foto 1 w" ; Chr(2) ; ".     "               'wyświetlam Foto 1 wł.
           Exit Do                                          'każę wyjść z pętli
        End If
    Loop
    Gosub Czekacz                                           'podprogram zawiera waitms 800
    Gosub Czyszczenie_drugiej_linii                         'podprogram wpisuje 16 pustych znaków w drugiej linii
 
    If Czy_foto1 = 255 Then                                 'jeśli wcześniej włączone zostało foto 1 to
       Home
       Lcd "Fototest foto 1 "                               'wyświetl w pierwszej linii napis Fotottest foto 1
       Gosub Wyswietl_tak_nie                               'podprogram wyświetla w drugiej linii wyrazy NIE oraz TAK
         Do
           If W_gore = 0 Or W_dol = 0 Then                  'jeśli nacisnąłem przycisk UP lub DOWN to
              Toggle Fototest1                              'zmień wartość zmiennej fototest na przeciwny
              Waitms 200                                    'czekaj 200 ms
           End If
           If Fototest1 = 0 Then                            'jeśli wartość zmiennej fototest1 = 0 czyli fototest wyłączony
               Gosub Wyswietl_strzalke_nie                  'podprogram wywietla strzałkę na pozycji 2,1
              Else
               Gosub Wyswietl_strzalke_tak                  'w przeciwnym razie na pozycji 2,10
           End If
           If Wykonaj = 0 And Fototest1 = 0 Then            'jeśli nacisnięto OK i wybrano wyłączony fototest 1 to
              Locate 2 , 1
              Lcd "  Fototest wy" ; Chr(2) ; "  "           'wyświetl w dolnej linii że fototest 1 wyłączony
              Exit Do                                       'wyjdź z pętli
           End If
           If Wykonaj = 0 And Fototest1 = 255 Then          'jeśli naciśnięto OK i fototest włączony to
              Locate 2 , 1
              Lcd "  Fototest w" ; Chr(2) ; "   "           'wyświetl napis że włączony
              Exit Do                                       'wyjdż z pętli
           End If
         Loop
    End If
    Gosub Czekacz                                           'podprogram zawiera waitms 800
    Gosub Czyszczenie_drugiej_linii                         'podprogram wpisuje w drugiej linii 16 pustych znaków
Return
 
Wyswietl_tak_nie:
   Locate 2 , 1
   Lcd "  Nie      Tak  "
Return
 
Czyszczenie_drugiej_linii:
  'Waitms 800
  Locate 2 , 1
  Lcd "                "
Return
 
Wyswietl_strzalke_nie:
  Locate 2 , 1
  Lcd Chr(0)
  Locate 2 , 10
  Lcd " "
Return
 
Wyswietl_strzalke_tak:
  Locate 2 , 1
  Lcd " "
  Locate 2 , 10
  Lcd Chr(0)
Return
 
Czekacz:
  Waitms 800
Return

Portret użytkownika gosc

Menu będę miał dość duże w

Menu będę miał dość duże w sumie coś takiego MENU 1
Menu1.1
Menu1.1.1 - warunek do wyboru
Menu1.1.2 - warunek do wyboru
MENU 2

i tak dalej i jak to zrobić za pomocą time0 , time1 ?

Portret użytkownika matrix

Re Menu na case

Ale timer wcale nie jest Ci do tego potrzebny. Przestudiuj ten przykład co Ci podałem a uwierz mi że powie Ci dużo odnośnie pisania menu. Zasada tworzenia takiego menu polega na wchodzeniu w poszczególne pętle i wychodzeniu z nich dopiero po spełnieniu określonego warunku.

Portret użytkownika glecki

menu w pętlach warunkowych co o ty sądzicie

Co sądzicie o takim menu.
Pętla główna plus cztery pętle warunkowe do ustawiania parametrów.Cztery przyciski:menu,podmenu (oznaczone w listingu jako escape),plus i minus.Trzy DS18B20 na jednym pinie.Zależało mi na tym aby po wciśnięciu przycisku menu zwiększało się o jeden i przy dalszym naciskaniu nie zwiększało się dalej.Zrobiłem to za pomocą flagi pomoc.Po wejściu w menu naciskamy przycisk podmenu (oznaczony escape)i strzałka przechodzi do poszczególnych parametrów ustawianych.Tutaj zastosowałem polecenie waitms aby w przypadku trzymania przycisków plus lub minus parametr płynnie się zmieniał.Po wyjściu z każdego z menu jest czyszczony LCD.
Oczywiście jest to projekt który sukcesywnie rozwijam.Listing przedstawiony poniżej zaprogramowałem i działa bez zarzutu.
Mam zrobiony zegar na układzie PCF8583 z podtrzymaniem i zastanawiam się czy zmnienne ustawiane zapisywać do eeprom czy zastosować zasilanie awaryjne do procka.

$regfile = "m162def.dat"
$crystal = 16000000
 
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config 1wire = Pind.7
 
 
 
Config Pinc.2 = Input                                       'plus                       'porty jako wejściowe
Config Pinc.3 = Input                                       'minus                      'porty jako wejściowe
Config Pinb.0 = Input                                       'menu                       'porty jako wejściowe
Config Pinb.1 = Input                                       'wyjscie z menu             'porty jako wejściowe
 
 
 
Dim Dsid1(8) As Byte                                        '***
Dim Dsid2(8) As Byte                                        '*** tablica do numerów czyjników DS
Dim Dsid3(8) As Byte                                        '***
 
Dim Ss As String * 6 , Ss1 As String * 6 , Ss2 As String * 6
Dim I1 As Integer , I2 As Integer , I3 As Integer           ' zmienne do temperatury
Dim Temp As Integer , Temp1 As Integer , Temp2 As Integer
Dim Tempu As Integer , Tempu1 As Integer , Tempu2 As Integer
Dim Pozpodmenu As Byte
 
 
Deflcdchar 0 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32        ' znak stopnia Celsjusza
Deflcdchar 1 , 8 , 4 , 30 , 31 , 30 , 4 , 8 , 32            ' strzałka do podmenu
 
Plus Alias Pinc.2
Minus Alias Pinc.3
Menu Alias Pinb.0
Escape Alias Pinb.1
 
 
Set Portc.2                                                 ' ustawia na stan wysoki
Set Portc.3                                                 ' ustawia na stan wysoki
Set Portb.0                                                 ' ustawia na stan wysoki
Set Portb.1                                                 ' ustawia na stan wysoki
 
Dim Pozmenu As Byte , Pomoc As Bit
 
 
Pomoc = 0
Pozpodmenu = 0
 
 
 Dsid1(1) = 1wsearchfirst()
 Dsid2(1) = 1wsearchnext()                                  'odczyt numerów seryjnych czujników ds18b20
 Dsid3(1) = 1wsearchnext()
 
 
 
Cursor Off Noblink
 
Cls
 
'**************** petla głowna *************************************************
Do
 
 If Pozmenu = 5 Then
Pozmenu = 0
End If                                                      'pozycja menu od 0-5
 
 
 
 
 
 
 
'************************** temperatura ****************************************
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)                                        'czujnik 1
   1wwrite &HBE
   I1 = 1wread(2)
   '---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)                                        'czujnik 2
   1wwrite &HBE
   I2 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid3(1)                                        'czujnik 3
   1wwrite &HBE
   I3 = 1wread(2)
 
'----------------------------------
   1wreset
   1wwrite &HCC
   1wwrite &H44
 
' Wait 1
   I1 = I1 * 10
   I1 = I1 / 16
   'If I1 > 0 Then Cls                                      'obliczenia czujnik 1
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 1
   Lcd "Temp: " ; Ss ; Chr(0) ; "C" ; "  "
'---------------------------------------------------------
   I2 = I2 * 10
   I2 = I2 / 16
   'If I2 > 0 Then Cls
   Ss1 = Str(i2)                                            'obliczenia czujnik 2
   Ss1 = Format(ss1 , " 0.0")
   Locate 2 , 1
   Lcd "Temp: " ; Ss1 ; Chr(0) ; "C" ; "  "
'---------------------------------------------------------
  I3 = I3 * 10
   I3 = I3 / 16
   'If I2 > 0 Then Cls
   Ss2 = Str(i3)                                            'obliczenia czujnik 3
   Ss2 = Format(ss2 , " 0.0")
   Locate 3 , 1
   Lcd "Temp: " ; Ss2 ; Chr(0) ; "C" ; "  "
'---------------------------------------------------------
 
  '----------------------------------kombinacje z zaleznościami----------------
 '-------------------------------------w pętli głównej------------------------
 
 Temp = I1 / 10
 Temp1 = I2 / 10
 Temp2 = I3 / 10
 
 
 
 
'------------------------------------------------------------------------------
 
If Pomoc = 0 Then
If Menu = 0 Then
Cls
Pozmenu = Pozmenu + 1
  End If
    End If
If Menu = 0 Then                                            'zwiekaszanie menu
Pomoc = 1
Else
If Menu = 1 Then
Pomoc = 0
  End If
End If
 
 
 
'-----------------------------------------------  petla warunkowa menu 1
 
While Pozmenu = 1
 Locate 1 , 1
 Lcd "Menu 1"
 
  If Pomoc = 0 Then
If Menu = 0 Then
Pozmenu = Pozmenu + 1
  End If
    End If
If Menu = 0 Then                                            'menu 1
Pomoc = 1                                                   'procedura wejścia i wyjścia z menu
Else
If Menu = 1 Then
Pomoc = 0
  End If
End If
'***********************************PODMENU w menu 1 ********************************************
  If Pozpodmenu = 0 Then
  If Plus = 0 Then
  Incr Tempu
  Waitms 200
  Else
  If Minus = 0 Then
  Decr Tempu
  Waitms 200                                                'zwiekszanie i zmniejszanie tempu w podmenu 1
    End If
      End If
       End If
 
 
  If Pozpodmenu = 1 Then
  If Plus = 0 Then
  Incr Tempu1
  Waitms 150
  Else
  If Minus = 0 Then
  Decr Tempu1
  Waitms 150                                                'zwiekszanie i zmniejszanie tempu w podmenu 2
    End If
      End If
       End If
 
 
  If Pozpodmenu = 2 Then
  If Plus = 0 Then
  Incr Tempu2
  Waitms 100
  Else
  If Minus = 0 Then
  Decr Tempu2
  Waitms 100                                                'zwiekszanie i zmniejszanie tempu w podmenu 3
    End If
      End If
       End If
 
 
 
 
 
 
 
 
 
 
  Locate 2 , 2
  Lcd "temp pieca:" ; Tempu ; Chr(0) ; "C" ; "    "
  Locate 3 , 2
  Lcd "temp woda:" ; Tempu1 ; Chr(0) ; "C" ; "  "
  Locate 4 , 2
  Lcd "temp dom:" ; Tempu2 ; Chr(0) ; "C" ; "  "
 
 
 
 
 
 
                                   '--------------------------------------------
  If Escape = 0 Then
  Incr Pozpodmenu
  Waitms 200
 
  End If
  If Pozpodmenu = 3 Then
  Pozpodmenu = 0
  End If
 
   If Pozpodmenu = 0 Then
   Locate 2 , 1
   Lcd Chr(1)
   Else
   Locate 2 , 1                                             'pozycja podmenu
   Lcd " "
   End If
   If Pozpodmenu = 1 Then
   Locate 3 , 1
   Lcd Chr(1)
   Else
   Locate 3 , 1
   Lcd " "
   End If
   If Pozpodmenu = 2 Then
   Locate 4 , 1
   Lcd Chr(1)
   Else
   Locate 4 , 1
   Lcd " "
   End If
 
 
                          '-----------------------------------------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 '----------------------------wyjscie z menu 1 -------------------------------
   If Pozmenu <> 1 Then
   Pozpodmenu = 0
   Cls
   Exit While
    End If
 
 
 
Wend
 
'----------------------------------------------- petla warunkowa menu 2
 
 
 
    While Pozmenu = 2
 
 Locate 1 , 1
 Lcd "Menu 2"
 
  If Pomoc = 0 Then
If Menu = 0 Then
Pozmenu = Pozmenu + 1
  End If
    End If
If Menu = 0 Then                                            'menu 2
Pomoc = 1
Else
If Menu = 1 Then
Pomoc = 0
  End If
End If
'*******************************************************************************
 
   If Pozmenu <> 2 Then
   Cls
   Exit While
    End If
 
 
Wend
 
'------------------------------------------------ petla warunkowa menu 3
 
 
 While Pozmenu = 3
 
 Locate 1 , 1
 Lcd "Menu 3"
 
  If Pomoc = 0 Then
If Menu = 0 Then
Pozmenu = Pozmenu + 1
  End If
    End If
If Menu = 0 Then                                            'menu 3
Pomoc = 1
Else
If Menu = 1 Then
Pomoc = 0
  End If
End If
'*******************************************************************************
 
 
 
   If Pozmenu <> 3 Then
   Cls
   Exit While
    End If
 
 
 
Wend
 
'------------------------------------------------ petla warunkowa menu 4
 
 
While Pozmenu = 4
 
 Locate 1 , 1
 Lcd "Menu 4"
 
  If Pomoc = 0 Then
If Menu = 0 Then
Pozmenu = Pozmenu + 1
  End If
    End If
If Menu = 0 Then                                            'menu 4
Pomoc = 1
Else
If Menu = 1 Then
Pomoc = 0
  End If
End If
'*******************************************************************************
 
 
 
   If Pozmenu <> 4 Then
  Cls
   Exit While
    End If
 
Wend
 
'------------------------------------------------------------ koniec menu
 
 
 
 
 
 
 
 
Loop
End

-

Grzegorz