Sterownik CO ,problem z menu i instrukcjami case w bascomi


Witam jestem początkujący i wziołem się za stworzenie softu do sterownika co. Utknołem na poziomie tworzenia menu za pomocą instrukcji select case. Sterownik posiada trzy przyciski plus, minus i ok , działanie jest takie iż program prawidłowo realizuje podprogram wyswietl i prawidłowo wchodzi do menu tylko nie reaguje na przyciski i nie można dokonac zmiany zmiennych Tco i Tcwu.
Jak to poprawić

[$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B11111000 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
 
Cls
Cursor Off Noblink
                                                             ' Wyczyszczenie lcd
Dim Tco As Byte                                             'temperatura co
Dim Tcwu As Byte                                            'temperatura cwu(bojler)
Dim Tzas As Byte                                            'temperatura zasobnika węgla
Dim Podajnikczas As Word                                    'czas pracy podajnika podczas normalnej pracy
Dim Wentczas As Word                                        'czas pracy wentylatora podczas normalnej pracy
Dim Pod_podt As Word                                        'czas pracy podajnika podczas pracy na
                                                             ' podtrzymaniu ognia
Dim Wen_podt As Word                                        ' czas pracy wentylatora podczas
 Declare Sub Menuu                                          ' pracy na podtrzymaniu ognia
 
Dim S As Word
 
Dim Menu As Byte
Dim X As Byte
Dim Y As Word
Dim G As Byte
Dim Z As Byte
Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit
 
Cursor Noblink
Lcd " Sterownik  C.O."
Lowerline
Lcd "  Wersja 1.00"
Wait 1
 
 
    Plus Alias Pind.0
      Ok Alias Pind.1
   Minus Alias Pind.2
 
   Pompa Alias Portd.3
  Wentyl Alias Portd.4
Podajnik Alias Portd.5
 
Deflcdchar [0] , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32         ' replace [x] with number (0-7)
Config Timer0 = Timer , Prescale = 256
 Enable Interrupts :
 Enable Timer0
  On Timer0 Sek
 
 X = 0
 
Cls
Wait 1
 
Do
 If Flaga_4ms = 1 Then
     Flaga_4ms = 0
     X = 0
      If Ok = 0 Then
    Waitms 100
     If Ok = 0 Then
     X = 1
     End If
      If X > 0 And X <= 3 Then
     Call Menuu
    End If
   End If
   End If
  If Flaga_500ms = 1 Then
    Flaga_500ms = 0
     If X = 0 Then
      Gosub Wyswietl
     End If
    End If
Loop
End
Sek:
Timer0 = 6
Set Flaga_4ms
  Incr Y
   If Y = 250 Then
     Y = 0
   Set Flaga_500ms
    Incr Z
      If Z = 2 Then
      Z = 0
      Set Flaga_1s
End If
End If
Return
 
Wyswietl:
 
If Y = 0 Then Incr G
 If G > 20 Then G = 0
   Select Case G
   Case 1 To 10:
   Readeeprom Tco , 1
   Cls
   Lcd "Temp.CO:" ; Tco ; Chr(0) ; "C"
   Lowerline
   Lcd "Nastawiono:" ; Tco ; Chr(0) ; "C"
 
   Case 11 To 20 :
   Readeeprom Tcwu , 2
   Cls
   Lcd "Temp.CWU:" ; Tcwu ; Chr(0) ; "C"
   Lowerline
   Lcd "Nastawiono:" ; Tcwu ; Chr(0) ; "C"
   End Select
Return
 
Sub Menuu:
 
 If Ok = 0 Then
    Waitms 100
     If Ok = 0 Then
      Incr Menu
      X = 1
     If Menu > 3 Then
         Menu = 0
        End If
       End If
      End If
 
 Select Case Menu
Case 1:
  X = 2
  If Plus = 0 Then
   Waitms 100
  If Plus = 0 Then Incr Tco
 If Tco > 75 Then Tco = 40
End If
 
  If Minus = 0 Then
  Waitms 100
   If Minus = 0 Then Decr Tco
    If Tco < 40 Then Tco = 75
   End If
 
  Cls
 Lcd "TEMP. CO:" ; Tco ; Chr(0) ; "C"
  Lowerline
 Lcd "ust.od 40-75 st"
 
Case 2:
  X = 3
  If Plus = 0 Then
   Waitms 100
    If Plus = 0 Then Incr Tcwu
     If Tcwu > 75 Then Tcwu = 40
    End If
 
  If Minus = 0 Then
   Waitms 100
   If Minus = 0 Then Decr Tcwu
    If Tcwu < 40 Then Tcwu = 75
End If
  Cls
 Lcd "temp. CUW:" ; Tcwu ; Chr(0) ; "C"
  Lowerline
 Lcd "ust.od 40-75 st"
Case 3:
X = 0
    Cls
Lcd "Zapis danych do"
Lowerline
Lcd "pamięci EEPROM"
Writeeeprom Tco , 1
Writeeeprom Tcwu , 2
End Select
Wait 1
End Sub
Return/code]




Portret użytkownika kaktus

(-;

Przeanalizuj dokładnie kiedy program wywoła obsługę menu, bo zapewne tam jest konflikt między programistą a ?C ;-)
To znaczy ?C zrobi dokładnie to co ma napisane w instrukcjach, a nie to co programista ma na myśli ;-p
W tym konkretnym przypadku
program wykonuje pętlę główną w której coś robi co 4 ms

Do
 If Flaga_4ms = 1 Then
    Flaga_4ms = 0
    X = 0
    If Ok = 0 Then
       Waitms 100
       If Ok = 0 Then X = 1
       If X > 0 And X <= 3 Then Call Menuu
    End If
  End If
 
  If Flaga_500ms = 1 Then
     Flaga_500ms = 0
     If X = 0 Then Gosub Wyswietl
  End If
Loop
End

a dokładnie jak widać (poprawiłem sobie trochu widoczność) zeruje iksa, po czym testuje przytrzymanie guzika? Ok = 0, w przypadku zajścia takiego zdarzenia wstawia do iksa wartość jeden. Następnie gdy iks ma stosowną wartość wywołuje obsługę menu. Zdaje się coś pisałeś o kilku przyciskach prawda? ;-) Więc byłem twoim ?C i napisałem Ci co robię ....

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika kisoft

problem z select case

Dzięki za odpowiedż
Na skutek wielu modyfikacji błędnie dopisałem x=0 w pętli głównej oczywiście ma go tam nie być ale po zmianie dalej kicha bo program wchodzi w menuu i prawidłowo wyświetla zawartość np. case 1 ale nie reaguje na pozostałe przyciski i nie zmienia zmiennych.

[$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B11111000 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
 
Cls
Cursor Off Noblink
                                                             ' Wyczyszczenie lcd
Dim Tco As Byte                                             'temperatura co
Dim Tcwu As Byte                                            'temperatura cwu(bojler)
Dim Tzas As Byte                                            'temperatura zasobnika węgla
Dim Podajnikczas As Word                                    'czas pracy podajnika podczas normalnej pracy
Dim Wentczas As Word                                        'czas pracy wentylatora podczas normalnej pracy
Dim Pod_podt As Word                                        'czas pracy podajnika podczas pracy na
                                                             ' podtrzymaniu ognia
Dim Wen_podt As Word                                        ' czas pracy wentylatora podczas
 Declare Sub Menuu                                          ' pracy na podtrzymaniu ognia
 
Dim S As Word
 
Dim Menu As Byte
Dim X As Byte
Dim Y As Word
Dim G As Byte
Dim Z As Byte
Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit
 
Cursor Noblink
Lcd " Sterownik  C.O."
Lowerline
Lcd "  Wersja 1.00"
Wait 1
 
 
    Plus Alias Pind.0
      Ok Alias Pind.1
   Minus Alias Pind.2
 
   Pompa Alias Portd.3
  Wentyl Alias Portd.4
Podajnik Alias Portd.5
 
Deflcdchar [0] , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32         ' replace [x] with number (0-7)
Config Timer0 = Timer , Prescale = 256
 Enable Interrupts :
 Enable Timer0
  On Timer0 Sek
 
 X = 0
 
Cls
Wait 1
 
Do
 If Flaga_4ms = 1 Then
     Flaga_4ms = 0
 
      If Ok = 0 Then
    Waitms 100
     If Ok = 0 Then
     X = 1
     End If
      If X > 0 And X <= 3 Then
    Gosub Menuu
    End If
   End If
   End If
  If Flaga_500ms = 1 Then
    Flaga_500ms = 0
     If X = 0 Then
      Gosub Wyswietl
     End If
    End If
Loop
End
Sek:
Timer0 = 6
Set Flaga_4ms
  Incr Y
   If Y = 250 Then
     Y = 0
   Set Flaga_500ms
    Incr Z
      If Z = 2 Then
      Z = 0
      Set Flaga_1s
End If
End If
Return
 
Wyswietl:
 
If Y = 0 Then Incr G
 If G > 20 Then G = 0
   Select Case G
   Case 1 To 10:
   Readeeprom Tco , 1
   Cls
   Lcd "Temp.CO:" ; Tco ; Chr(0) ; "C"
   Lowerline
   Lcd "Nastawiono:" ; Tco ; Chr(0) ; "C"
 
   Case 11 To 20 :
   Readeeprom Tcwu , 2
   Cls
   Lcd "Temp.CWU:" ; Tcwu ; Chr(0) ; "C"
   Lowerline
   Lcd "Nastawiono:" ; Tcwu ; Chr(0) ; "C"
   End Select
Return
 
 
 Menuu:
If Ok = 0 Then
    Waitms 100
     If Ok = 0 Then
      Incr Menu
      X = 1
     If Menu > 3 Then
         Menu = 0
        End If
       End If
      End If
  Waitms 500
 Select Case Menu
 
Case 1:
  X = 2
 
  If Plus = 0 Then
   Waitms 100
  If Plus = 0 Then Incr Tco
 If Tco > 75 Then Tco = 40
End If
 
  If Minus = 0 Then
  Waitms 100
   If Minus = 0 Then Decr Tco
    If Tco < 40 Then Tco = 75
   End If
 
  Cls
 Lcd "TEMP. CO:" ; Tco ; Chr(0) ; "C"
  Lowerline
 Lcd "ust.od 40-75 st"
 
Case 2:
  X = 3
  If Plus = 0 Then
   Waitms 100
    If Plus = 0 Then Incr Tcwu
     If Tcwu > 75 Then Tcwu = 40
    End If
 
  If Minus = 0 Then
   Waitms 100
   If Minus = 0 Then Decr Tcwu
    If Tcwu < 40 Then Tcwu = 75
End If
  Cls
 Lcd "temp. CUW:" ; Tcwu ; Chr(0) ; "C"
  Lowerline
 Lcd "ust.od 40-75 st"
Case 3:
X = 0
    Cls
Lcd "Zapis danych do"
Lowerline
Lcd "pamięci EEPROM"
Writeeeprom Tco , 1
Writeeeprom Tcwu , 2
End Select
Wait 1
 
 
Return

Portret użytkownika kaktus

Będą Twoim "niewolnikiem" -

Będą Twoim "niewolnikiem" - jako ?C mówię że nie podobają mi się te wszystkie

If Ok = 0 Then
    Waitms 100
     If Ok = 0 Then

i podobne tym bardziej że powtarzają się co chwilę ;-p

możesz inaczej?

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika kisoft

cd.

robię np. tak

 Menuu:
If Ok = 0 Then
    Waitms 100
     If Ok = 0 Then
      Incr Menu
      X = 1
     If Menu > 3 Then
         Menu = 0
        End If
       End If
      End If
 
Select Case Menu
 
Case 1:
  X = 2
   If Plus = 0 Then
    Incr Tco
     If Tco > 75 Then
      Tco = 40
      End If
     End If
 
   If Minus = 0 Then
    Decr Tco
     If Tco < 40 Then
      Tco = 75
      End If
    End If
  Cls
 Lcd "TEMP. CO:" ; Tco ; Chr(0) ; "C"
  Lowerline
 Lcd "ust.od 40-75 st"
 
Case 2:
  X = 3
   If Plus = 0 Then
     Incr Tcwu
      If Tcwu > 75 Then
       Tcwu = 40
       End If
       End If
 
    If Minus = 0 Then
     Decr Tcwu
      If Tcwu < 40 Then
       Tcwu = 75
       End If
       End If
 
    Cls
 Lcd "temp. CUW:" ; Tcwu ; Chr(0) ; "C"
  Lowerline
 Lcd "ust.od 40-75 st"
Case 3:
X = 0
    Cls
Lcd "Zapis danych do"
Lowerline
Lcd "pamięci EEPROM"
Writeeeprom Tco , 1
Writeeeprom Tcwu , 2
End Select
Wait 1
 
Return

efekt niestety taki sam , program poprawnie wchodzi i wychodzi z menu ale nie mogę dokonywać żadnych zmian nie reaguje na pozostałe dwa przyciski . Oj utknołem i diabeł dalej karty rozdaje.

Portret użytkownika kisoft

właśnie rozwiązałem problem

Wrzystko działa zgodnie z oczekiwaniem, urzyłem funktora and i inst. select case . Wykorzystałem patent Mirka podaję poprawny kod może ktoś kiedyś skorzystać.

[/
$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B11111000 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
 
Cls
Cursor Off Noblink
                                                             ' Wyczyszczenie lcd
Dim Tco As Byte                                             'temperatura co
Dim Tcwu As Byte                                            'temperatura cwu(bojler)
Dim Tzas As Byte                                            'temperatura zasobnika węgla
Dim Podajnikczas As Word                                    'czas pracy podajnika podczas normalnej pracy
Dim Wentczas As Word                                        'czas pracy wentylatora podczas normalnej pracy
Dim Pod_podt As Word                                        'czas pracy podajnika podczas pracy na
                                                             ' podtrzymaniu ognia
Dim Wen_podt As Word                                        ' czas pracy wentylatora podczas
 Declare Sub Menuu                                          ' pracy na podtrzymaniu ognia
 
Dim S As Word
 
Dim Menu As Byte
Dim X As Byte
Dim Y As Word
Dim G As Byte
Dim Z As Byte
 
Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit
 Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte
 
 Cursor Noblink
Lcd " Sterownik  C.O."
Lowerline
Lcd "K.GRUCA wer.1.00"
Wait 1
 
 Sw_port Alias Pind
    Plus Alias Pind.0
      Ok Alias Pind.1
   Minus Alias Pind.2
 
   Pompa Alias Portd.3
  Wentyl Alias Portd.4
Podajnik Alias Portd.5
 
Deflcdchar [0] , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
Config Timer0 = Timer , Prescale = 256
 Enable Interrupts :
 Enable Timer0
  On Timer0 Sek
 
 X = 0
 
Cls
Wait 1
 
 Do
 
   If Flaga_4ms = 1 Then
    Reset Flaga_4ms
     Gosub Menuu
 
   If Flaga_500ms = 1 Then
      Flaga_500ms = 0
       Gosub Wyswietl_1
       End If
      End If
 Loop
 End
 
 Sek:
 Timer0 = 6
  Flaga_4ms = 1
  Incr Y
   If Y = 150 Then
     Y = 0
      Set Flaga_500ms
       Incr Z
        If Z = 2 Then
         Z = 0
         Set Flaga_1s
      Incr S
      If S = 20 Then S = 0
End If
End If
Return
Wyswietl_1:
 Select Case X
 Case 0:
     If Y = 0 Then Incr G
     If G > 20 Then G = 0
     Select Case G
     Case 1 To 10:
     Readeeprom Tco , 1
     Cls
     Lcd "Temp.CO:" ; Tco ; Chr(0) ; "C"
     Lowerline
     Lcd "Nastawiono:" ; Tco ; Chr(0) ; "C"
 
     Case 11 To 20 :
     Readeeprom Tcwu , 2
 
     Cls
     Lcd "Temp.CWU:" ; Tcwu ; Chr(0) ; "C"
     Lowerline
     Lcd "Nastawiono:" ; Tcwu ; Chr(0) ; "C"
     End Select
  Case 1:
     Cls
     Lcd "TEMP. CO:" ; Tco ; Chr(0) ; "C"
     Lowerline
     Lcd "ust.od 40-75 st"
  Case 2:
     Cls
     Lcd "temp. CUW:" ; Tcwu ; Chr(0) ; "C"
     Lowerline
     Lcd "ust.od 40-75 st"
  Case 3:
     Cls
     Lcd "Zapis danych do"
     Lowerline
     Lcd "pamięci EEPROM"
     Writeeeprom Tco , 1
     Writeeeprom Tcwu , 2
     Waitms 1000
       X = 0
     End Select
  Return
 
 
 Menuu:
     Sw = Sw_port And &B00000111
  If Sw <> &B00000111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
 
    Select Case Stan_sw
     Case &B00000110:
       Incr X
       If X > 3 Then X = 0
     Case &B00000101:
       Select Case X
     Case 1:
       Incr Tco
       If Tco > 75 Then Tco = 40
       If Tco < 40 Then Tco = 75
     Case 2:
       Incr Tcwu
       If Tcwu > 75 Then Tcwu = 40
       If Tcwu < 40 Then Tcwu = 75
      End Select
 
     Case &B00000011:
       Select Case X
     Case 1:
       Decr Tco
       If Tco > 75 Then Tco = 40
       If Tco < 40 Then Tco = 75
     Case 2:
       Decr Tcwu
       If Tcwu > 75 Then Tcwu = 40
       If Tcwu < 40 Then Tcwu = 75
      End Select
 
 
     End Select
     End If
        Else
    Stan_sw = Sw
    Licznik_sw = 80
 
      End If
     Returnqb]