Loro
26.08.2008, 23:10
Hallo zusammen,
ich habe ein kleines Problem mit meinem Code (zu mindestens hoffe ich, dass es nur klein ist :-k ). Habe das Beispiel von https://www.roboternetz.de/wissen/index.php/Bascom_State_Machine_Menu auf meine Bedürfnisse umgestellt um es auf einem Display darzustellen.
Das Problem ist, wenn ich in U110 gehe, soll je nach dem aus welchem Menüpunkt ich komme, die entsprechende Zeile farblich hervorgehoben werden. Nur leider klappt das nicht so wie ich mir das vorstelle, bzw. wird die richtige Zeile erst gehighlighted wenn ich eine Taste drücke, die keine Auswirkung auf die Darstellung des Menüs hat.
Dim Keycode_string As String * 6
'Key_plus|key_minus|key_prev|key_next
Keycode_string = "{056}{050}{052}{054}{057}{055}"
Dim Keycode(6) As Byte At Keycode_string Overlay
Do
Debounce Pinc.6 , 0 , Up_press , Sub 'Keycode zuweisen hoch
Debounce Pinc.7 , 0 , Down_press , Sub 'runter
Debounce Pinc.4 , 0 , Minus_press , Sub 'links
Debounce Pinc.3 , 0 , Plus_press , Sub 'rechts
Debounce Pinc.5 , 0 , Ok_press , Sub 'OK
Debounce Pinc.2 , 0 , Abbort_press , Sub 'Abbrechen
Loop
Change_state:
lds R8, {State}
lds R9, {State + 1}
For I = 1 To 6
Read W
'Print Key
If Key = Keycode(i) Then
If W <> Loadlabel(null) Then
State_renew = 1
Key = Key_null
State = W
End If
End If
Next I
Read State_gosub
Read Lcd_textbuffer
Read Test_id
Return
S110: 'Programm 1
Adr2 Null : Adr2 Null : Adr2 Null : Adr2 S111 : Adr2 S120 : Adr2 S100
Adr2 U110 'Subroutine for current State
Data " UMenu 1_10 "
Data 1%
S111: 'Programm 1
Adr2 Null : Adr2 Null : Adr2 S110 : Adr2 S112 : Adr2 S120 : Adr2 S100
Adr2 U110 'Subroutine for current State
Data " UMenu 1_11"
Data 2%
S112: 'Programm 1
Adr2 Null : Adr2 Null : Adr2 S111 : Adr2 S113 : Adr2 S120 : Adr2 S100
Adr2 U110 'Subroutine for current State
Data " UMenu 1_12"
Data 3%
Caller:
LDS R31, {State_gosub+1} 'High see Bascom-Doc Mixing ASM and BASIC
LDS R30, {State_gosub} 'Low
LSR R31 'Division durch 2 (Alternativ ADR verwenden)
ROR R30
'Call zum Sub
ICALL
Return
U110:
Label_count = 1
For Point = 20 To 60 Step 10
If Test_id = Label_count Then
Call Lcd_print(text(label_count) , 10 , Point , 1 , 1 , 1 , Black , Green)
Else
Call Lcd_print(text(label_count) , 10 , Point , 1 , 1 , 1 , White , Dark_red)
End If
Label_count = Label_count + 1
Next Point
Return
Down_press: 'label für eine gedrückten Button
Key = "{054}"
Gosub Change_state_by_sub
Gosub Caller
Return
Ich hoffe es ist Verständlich was ich da an Code gepostet habe.....
ich habe ein kleines Problem mit meinem Code (zu mindestens hoffe ich, dass es nur klein ist :-k ). Habe das Beispiel von https://www.roboternetz.de/wissen/index.php/Bascom_State_Machine_Menu auf meine Bedürfnisse umgestellt um es auf einem Display darzustellen.
Das Problem ist, wenn ich in U110 gehe, soll je nach dem aus welchem Menüpunkt ich komme, die entsprechende Zeile farblich hervorgehoben werden. Nur leider klappt das nicht so wie ich mir das vorstelle, bzw. wird die richtige Zeile erst gehighlighted wenn ich eine Taste drücke, die keine Auswirkung auf die Darstellung des Menüs hat.
Dim Keycode_string As String * 6
'Key_plus|key_minus|key_prev|key_next
Keycode_string = "{056}{050}{052}{054}{057}{055}"
Dim Keycode(6) As Byte At Keycode_string Overlay
Do
Debounce Pinc.6 , 0 , Up_press , Sub 'Keycode zuweisen hoch
Debounce Pinc.7 , 0 , Down_press , Sub 'runter
Debounce Pinc.4 , 0 , Minus_press , Sub 'links
Debounce Pinc.3 , 0 , Plus_press , Sub 'rechts
Debounce Pinc.5 , 0 , Ok_press , Sub 'OK
Debounce Pinc.2 , 0 , Abbort_press , Sub 'Abbrechen
Loop
Change_state:
lds R8, {State}
lds R9, {State + 1}
For I = 1 To 6
Read W
'Print Key
If Key = Keycode(i) Then
If W <> Loadlabel(null) Then
State_renew = 1
Key = Key_null
State = W
End If
End If
Next I
Read State_gosub
Read Lcd_textbuffer
Read Test_id
Return
S110: 'Programm 1
Adr2 Null : Adr2 Null : Adr2 Null : Adr2 S111 : Adr2 S120 : Adr2 S100
Adr2 U110 'Subroutine for current State
Data " UMenu 1_10 "
Data 1%
S111: 'Programm 1
Adr2 Null : Adr2 Null : Adr2 S110 : Adr2 S112 : Adr2 S120 : Adr2 S100
Adr2 U110 'Subroutine for current State
Data " UMenu 1_11"
Data 2%
S112: 'Programm 1
Adr2 Null : Adr2 Null : Adr2 S111 : Adr2 S113 : Adr2 S120 : Adr2 S100
Adr2 U110 'Subroutine for current State
Data " UMenu 1_12"
Data 3%
Caller:
LDS R31, {State_gosub+1} 'High see Bascom-Doc Mixing ASM and BASIC
LDS R30, {State_gosub} 'Low
LSR R31 'Division durch 2 (Alternativ ADR verwenden)
ROR R30
'Call zum Sub
ICALL
Return
U110:
Label_count = 1
For Point = 20 To 60 Step 10
If Test_id = Label_count Then
Call Lcd_print(text(label_count) , 10 , Point , 1 , 1 , 1 , Black , Green)
Else
Call Lcd_print(text(label_count) , 10 , Point , 1 , 1 , 1 , White , Dark_red)
End If
Label_count = Label_count + 1
Next Point
Return
Down_press: 'label für eine gedrückten Button
Key = "{054}"
Gosub Change_state_by_sub
Gosub Caller
Return
Ich hoffe es ist Verständlich was ich da an Code gepostet habe.....