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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.