PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Goto vermeidbar? Graphische Menüführung mit Touch



Bauteiltöter
23.04.2009, 17:22
Hi,

Ich weiß, dass Goto allgemein als Schlechter Programmierstil ist, deswegen suche ich nach einer Lösung ohne Goto.

Im moment habe ich eine Version am Laufen, die total vergotot ist :D
Das Programm schmiert regelmäßig ab (vermute Stacküberlauf) (aber das ist jetzt egal- ich mache das nochmal komplet neu)

Die Menüführung ist wie im Anhang beschrieben.

Das Problem ist jetzt z.B. das Menü "Tastensperre" in der mitte des Bildes.
Wie man sieht, kann man von den meisten Menüs zur "Tastensperre" springen, aber von dort geht es nur zum Hauptmenü.
Wenn man immer Gosubs benutzt, bekommt man ein Problem.

Weil wenn man von hauptmenü-->Einstellungen geht, kommen 2 Bytes in den Stack. Wenn man jetzt von Einstellungen nach Einstellungen geht, kommen wieder 2 Bytes in den Stack. Jetzt von Einstellungen nach Hauptmenü und wieder 2 Bytes in den Stack. Irgendwann ist der Stack voll, und dann ist aus die Maus (das Display).

Wie kann ich das umgehen (außer Gotos verwenden)?

Ich hoffe ihr habt verstanden, was mein Problem ist.

MfG Bauteiltöter

sechsrad
23.04.2009, 17:34
Habe meine Glaskugel nicht dabei.

Wo ist der Code? :-s

Das Diagramm nimm am besten raus. :arrow:

Bauteiltöter
23.04.2009, 17:58
Habe meine Glaskugel nicht dabei.

Schon klar 8-
Das Diagramm nimm am besten raus.

Warum?


Wo ist der Code? :-s

Der Code ist sehr, sehr Lang (um die 1000 Zeilen) und sehr unübersichtlich--> war mein erstes großes Projekt--> Deswegen möchte ich das jetzt auch komplett NEU machen ;)

Ich mache mal einen Beispielcode, wie das im moment läuft




Initalisierung abgeschlossen

Hauptmenue:

Menü anzeigen

Do
Touchscreen auswerten
If Einstellungstaste gedrückt then
Goto Einstellungen
End if
Loop

Einstellungen:

Einstellungen anzeigen
Do
Touchscreen auswerten
If Zurueck-Taste gedrückt then
Goto hauptmenue
End if
If Code aendern-Taste gedrückt then
Goto Code_aendern
End if
Loop

Code_aendern:

Code ändern anzeigen

Do
Touchscreen auswerten

If Zurück-Taste gedrückt then
Goto Einstellungen
End if
If Tastenschloss-Taste gedrückt then
Goto Tastenschloss
End if

Loop

Tastenschloss:

Tastenschloss anzeigen

Do
Touchscreen auswerten

If Zurück-Taste gedrückt then
Goto Hauptmenue
End if

Loop



Ich glaube, man merkt, wie unübersichtlich das wird.

Deswegen suche ich nach einer eleganteren Lösung

MfG Bauteiltöter

EDIT: Ich habe gestern schon angefangen, neu zu Programmieren, bis mir die Idee gekommen ist, zu fragen, wie es besser geht. Hier das Progg von gestern abend:



Declare Sub Readtouch
Declare Function Key(byval Temp As Byte)as Byte

$regfile = "m644def.dat"
$crystal = 8000000
$hwstack = 300
$swstack = 300
$framesize = 300
$baud = 4800


Power_ Alias Portd.2
Config Power_ = Output
Power_ = 0

Taster Alias Pind.7
Config Taster = Input

Standbyled Alias Portd.4
Config Standbyled = Output

Licht Alias Porta.4
Config Licht = Output

Speaker Alias Portd.5
Config Speaker = Output

Buzzer Alias Portd.6
Config Buzzer = Output

Alarmtaster Alias Portd.3
Config Alarmtaster = Input

Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Setting up the a/d convertor

Dim X As Word , Y As Word
Dim Keynum As Byte
Dim Temp As Byte
Dim Ton As Word , Laenge As Word
Dim Uart_input As Byte
Dim Klingelflag As Bit
Dim Werklingel As Byte
Dim Alarman As Bit


Ton = 150
Laenge = 700

On Urxc Uart_interrupt
Enable Urxc


Bitwait Taster , Reset

Wakeup:

Power_ = 0

Config Graphlcd = 240 * 128 , Dataport = Portb , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6
Cls
Cursor Off








'################################################# ##############################
Hauptmenue:
'################################################# ##############################

'(
# # ###### # # ##### ##### # # ##### # # # # #####
# # # # # # # # # ## ## # ## # # # #
# # # # # # # # # # # # # # # # # # # #
##### ###### # # ##### # # # # #### # # # # # ####
# # # # # # # # # # # # # # # # #
# # # # # # # # # # # # ## # # #
# # # # ##### # # # # ##### # # ##### #####

')





Cls

Showpic 49 , 0 , Hauptmenue_bgf 'Keine Taste
Showpic 0 , 52 , On_bgf 'Taste 13
Showpic 196 , 52 , Off_i_bgf 'Taste 53
Showpic 71 , 52 , Alarm_bgf 'Taste 33
Showpic 49 , 104 , Stby_bgf 'Taste 25
Showpic 147 , 104 , Einstell_bgf 'Taste 45
Showpic 196 , 0 , Schloss_o_bgf 'Taste 51


Do
Keynum = Key(0)

Select Case Keynum
Case 13 : Sound Buzzer , Ton , Laenge 'ON-Taste
Alarman = 1
Showpic 0 , 52 , On_i_bgf
Showpic 196 , 52 , Off_bgf
Print "5"
Case 53 : Sound Buzzer , Ton , Laenge 'OFF-Taste
Alarman = 0
Showpic 0 , 52 , On_bgf
Showpic 196 , 52 , Off_i_bgf
Print "4"
Case 33 : Sound Buzzer , Ton , Laenge 'Alarm-Taste
Case 25 : Sound Buzzer , Ton , Laenge 'Standby-Taste
Goto Standby
Case 45 : Sound Buzzer , Ton , Laenge 'Einstellung-Taste
Goto Einstellungen
Case 51 : Sound Buzzer , Ton , Laenge 'Tastenschloss-Taste
End Select

Loop
End

'################################################# ##############################
Einstellungen:
'################################################# ##############################

'(
######## # # # ###### ##### ####### # # # # # # ###### ##### # #
# # ## # # # # # # # # ## # # # ## #
# # # # # # # # # # # # # # # # # # # #
#### # # # # ###### # #### # # # # # # # ###### ### # # #
# # # # # # # # # # # # # # # # # # # # #
# # # ## # # # # # # # # ## # # # # ##
####### # # # ###### # ####### ##### ##### ###### # # ###### ##### # #
')

Cls
Showpic 49 , 0 , Einstellungen_bgf
Showpic 196 , 0 , Schloss_o_bgf 'Taste 51
Showpic 0 , 0 , Zurueck_bgf 'Taste 11
Showpic 0 , 52 , Tastatur_bgf 'Taste 13
Showpic 98 , 52 , Lautsprecher_bgf 'Taste 33


Do
Keynum = Key(0)

Select Case Keynum:
Case 51 : Sound Buzzer , Ton , Laenge 'Tastenschloss-Taste
Case 11 : Sound Buzzer , Ton , Laenge 'Zurück-Taste
Goto Hauptmenue
Case 13 : Sound Buzzer , Ton , Laenge 'Code ändern-Taste
Case 33 : Sound Buzzer , Ton , Laenge 'Soundeinstellungs-Taste

End Select
Loop


Cls
Locate 4 , 1

Lcd "Error: SUB ohne Ende"
Locate 8 , 1
Lcd "Program stopp um Schaeden zu vermeiden"
Locate 11 , 1
Lcd "Error in SUB Einstellungen"

End


'################################################# ##############################
Standby:
'################################################# ##############################


'(
######### ######### ######### # # ###### ###### # #
# # # # ## # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # #
######### # ######### # # # # # ####### #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
######### # # # # ## ###### ###### #
')

Config Portb = Input
Config Portc = Input
Config Portd.1 = Input
Config Portd.0 = Input

Power_ = 1

Standbyled = 1

Do
If Taster = 0 Then
Standbyled = 0
Goto Wakeup
End If
Loop



'################################################# ##############################
'BGFs
'################################################# ##############################

Einstellungen_bgf:
$bgf "Einstellungen.bgf"

Tastatur_bgf:
$bgf "Tastatur.bgf"

Lautsprecher_bgf:
$bgf "Lautsprecher.bgf"

Zurueck_bgf:
$bgf "Zurueck.bgf"

Schloss_o_bgf:
$bgf "Schloss_offen.bgf"

Schloss_z_bgf:
$bgf "Schloss_zu.bgf"

Stby_bgf:
$bgf "Stby.bgf"

Einstell_bgf:
$bgf "Einstell.bgf"

Hauptmenue_bgf:
$bgf "Hauptmenue.bgf"

Off_bgf:
$bgf "Off.bgf"

Off_i_bgf:
$bgf "off_i.bgf"

On_bgf:
$bgf "on.bgf"

On_i_bgf:
$bgf "on_i.bgf"


Full_tasten_bgf:
$bgf "Full_tasten_2.bgf"

Einzel_bgf:
$bgf "Einzel_taste.bgf"

Doppel_bgf:
$bgf "Zweier_taste.bgf"

Dreier_bgf:
$bgf "Dreier_taste.bgf"

Alarm_bgf:
$bgf "Alarm.bgf"

'################################################# ##############################
'Subs
'################################################# ##############################

'unten--> Oben:
'1: Mama will besuchen
'2: Papa will besuchen
'3: Inga will besuchen
'4: 3x Code Falsch
'5: Alarm ausgelöst
'6: Tür zu
'7: Tür auf
'8: Test_antwort

'Oben--> Unten
'1: Komm
'2: Hau ab
'3: Sirene aus
'4: alarm aus
'5: alarm ein
'7: Sirene an
'8: Test
'9: Code ändern
'A: Klingel gesperrt
'B: Klingel entsperrt
'C: Debugg
Uart_interrupt:
Uart_input = Udr

Select Case Uart_input:
Case 1 : Werklingel = 1
Klingelflag = 1
Case 2 : Werklingel = 2
Klingelflag = 1
Case 3 : Werklingel = 3
Klingelflag = 1
End Select

Return






Function Key(byval Temp As Byte) As Byte
Readtouch
Temp = 0

If X < 1000 And Y < 1000 Then


Select Case X:
Case 746 To 855 : Temp = 10
Case 617 To 730 : Temp = 20
Case 490 To 600 : Temp = 30
Case 360 To 470 : Temp = 40
Case 230 To 340 : Temp = 50
End Select

Select Case Y:
Case 330 To 400 : Temp = Temp + 1
Case 416 To 480 : Temp = Temp + 2
Case 500 To 570 : Temp = Temp + 3
Case 586 To 655 : Temp = Temp + 4
Case 670 To 740 : Temp = Temp + 5


End Select




Key = Temp
Else

Key = 0

End If



End Function

Sub Readtouch:
Config Pina.0 = Output
Config Pina.2 = Output
Set Porta.0
Reset Porta.2
Ddra.1 = 0 '
Ddra.3 = 0
Waitms 20
X = Getadc(3)

Config Pina.1 = Output
Config Pina.3 = Output
Reset Porta.1
Set Porta.3
Ddra.0 = 0
Ddra.2 = 0
Waitms 20
Y = Getadc(2)


End Sub

mat-sche
23.04.2009, 18:09
Hallo Bauteillöter :D

schau mal Dir dieses Menü an!!! Ich nutze es und es funktionioert bestens!!!! incl. Touchscreen!!!

Die Menüs bekommen eine ID die Du dann in einer select case Schleife abfragen kannst, jenach wie sie gedrückt werden. Bei Fragen = PN!

@ sechsrad: er brauch irgendwie immer ne Glaskugel ;)

Gruß MAT

Bauteiltöter
23.04.2009, 18:14
hallo mat-sche :D

welches Menü? Ich glaube, du hast den Anhang vergessen ;)

MfG

mat-sche
23.04.2009, 18:23
up's :D

http://www.mcselec.com/index.php?option=com_content&task=view&id=189&Itemid=57

wie gesagt, sehr gutes Menü!!!

Bauteiltöter
23.04.2009, 18:51
danke =D>

Denn Code muss ich mir erstmal durchlesen, der ist keine leichte Kost 8-[

Aber ich hab mal Drübergeguckt, und muss sagen, der sieht genial einfach aus *freu* ;)

mat-sche
23.04.2009, 19:43
jup, so ist es!

bei mir funst er genau so wie ich mir ein Menü vorstelle!
Viel Spaß damit

Bauteiltöter
23.04.2009, 20:25
Danke nochmal ;)