- LiFePO4 Speicher Test         
Ergebnis 1 bis 9 von 9

Thema: Goto vermeidbar? Graphische Menüführung mit Touch

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113

    Goto vermeidbar? Graphische Menüführung mit Touch

    Anzeige

    Praxistest und DIY Projekte
    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
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken flussdiagramm.gif  

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.01.2008
    Beiträge
    164
    Habe meine Glaskugel nicht dabei.

    Wo ist der Code?

    Das Diagramm nimm am besten raus.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    Zitat Zitat von sechsrad
    Habe meine Glaskugel nicht dabei.
    Schon klar 8-
    Zitat Zitat von sechsrad
    Das Diagramm nimm am besten raus.
    Warum?

    Zitat Zitat von sechsrad
    Wo ist der Code?
    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

    Code:
    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:

    Code:
    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

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Hallo Bauteillöter

    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

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    hallo mat-sche

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

    MfG

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    up's

    http://www.mcselec.com/index.php?opt...=189&Itemid=57

    wie gesagt, sehr gutes Menü!!!

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    danke =D>

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

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

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    jup, so ist es!

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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2008
    Beiträge
    113
    Danke nochmal

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen