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]
(-;
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
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.".
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.
Będą Twoim "niewolnikiem" -
Będą Twoim "niewolnikiem" - jako ?C mówię że nie podobają mi się te wszystkie
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.".
cd.
robię np. tak
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.
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ć.