- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 5 von 5

Thema: Ein Menü erstellen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2007
    Alter
    43
    Beiträge
    10

    Ein Menü erstellen

    Anzeige

    Praxistest und DIY Projekte
    Hallo erst mal !

    Da ich gerade ein kleines Projekt vor habe. Brauch ich mal eure hilfe.
    Ich möchte gerne ein Menü auf ein Display zaubern. Da ich aber noch Anfänger bin weiß ich nicht so recht wie ich das anfangen oder anstellen soll.
    Aussehen sollte es so in etwa:

    1: Einstellungen
    - Timer
    Uhrzeit einstellen
    -Dimmer
    Dimmer einstellen
    2:Option
    -???
    3:???

    usw.

    Na ja so hatte ich mir das irgendwie vorgestellt. Es soll über vier Tasten laufen ( Abbrechen, rauf, runter , Enter)die am ADC hängen.

    Ich weiß für die die es können ist so was recht leicht.

    ich brauche ein paar denk anstöße !

    Wäre nett wenn ihr ein paar Ideen für mich habt.

  2. #2

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2007
    Alter
    43
    Beiträge
    10

    Ein Menü erstellen

    Danke für den Link!

    Habe mir den Bascom-code mal angeschaut.

    Ich versuch mein problem ein wenig genauer zu beschreiben.

    Ich habe ein schöne grafik Display von Display3???? ist echt super und leicht anzusteuern.

    Was mir eigentlich vorschwebt ist

    Das ich verschieden Menü punkte habe die jeweils (Einstellung,Option,usw)
    aber diese haben dann jeweils noch Untermenüs.

    Wie oben schon beschrieben Einstellung- Timer- Timer einstellen

    Und genau das ist mein problem. Ich weiß nicht wie ich das verschachteln soll.

    Ich hoffe ich konnte mein problem verständlich schildern.

    Wenn noch einer ne Idee hätte wäre ich dankbar

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    54
    Beiträge
    2.806
    Das ich verschieden Menü punkte habe die jeweils (Einstellung,Option,usw)
    aber diese haben dann jeweils noch Untermenüs.
    ...genau das macht doch der Code - scrollt durch die Menüs, in denen man dann z.B Parameter einstellen kann...allerdings in dem Beispiel nur für Text-LCD`s, weil man ja nicht wusste, dass Du ein Grafikdisplay hast...

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.12.2005
    Ort
    @FFM
    Alter
    48
    Beiträge
    408
    Hallo biete hier mein Universal-menü
    Menueeinträge und Untermenües sowie sprungmarken werden einfach ganz unten in die data zeile eingetragen.
    Das prog baut dann selbständig ein 4 Zeilen menüe zusammen

    das menue ist per Tastatur zu steuern (RS232 terminal) und kann auch simuliert werden
    bei simulation die anweisung $sim noch ganz oben reinschreiben und neu kompilieren

    einfach mal die kommentare durchlesen

    Code:
    $regfile = "m16def.dat"                                     ' specify the used micro
    $crystal = 16000000                                         ' used crystal frequency
    $baud = 9600                                                ' use baud rate
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 32                                               ' default use 10 for the SW stack
    $framesize = 64                                             ' default use 40 for the frame space
    Const Anzahl_eintrage_menu_ebene_01 = 10
    
    Dim Menuepunkt As Byte
    Dim Menuepunkt_intern As Byte
    Dim Menuerichtung As Byte                                   'je nach richtung 1=hoch,2=runter,3=rechts,4=link
    Dim Inkey_byte As Byte
    Dim Inkey_string As String * 1
    Dim Menue_aktion As Byte
    Dim Menue_eintrag As String * 20
    Dim Zeichen As String * 3
    Dim Such_string As String * 3
    Dim Faktor As Byte
    Menuepunkt = 2
    
    
    Declare Function Typ_von_untermenu(byref Menue_eintrag_tvu As Byte)as Byte
    Declare Function Linkes_zeichen(byref Menue_punkt_lz As Byte)as String
    
    Lcd_db4 Alias Portc.4
    Lcd_db5 Alias Portc.5
    Lcd_db6 Alias Portc.6
    Lcd_db7 Alias Portc.7
    Lcd_e Alias Portb.0
    Lcd_rs Alias Portb.1
    
    Config Lcd_db4 = Output
    Config Lcd_db5 = Output
    Config Lcd_db6 = Output
    Config Lcd_db7 = Output
    Config Lcd_e = Output
    Config Lcd_rs = Output
    
    Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs
    Config Lcd = 20 * 4a , Chipset = Ks077
    Initlcd
    
    Waitms 500
    Cls
    Locate 1 , 1
    Lcd "System gestartet"
    Wait 5
    Menuerichtung = 1
    Gosub Lcd_update
    
    Do
       Inkey_byte = Inkey()                                     'Taste aus RS232 buffer
       If Inkey_byte > 48 Then                                  'wenn taste grösser als zahl 0
          If Inkey_byte < 60 Then                               'und kleiner als 5
             Inkey_string = Chr(inkey_byte)                     'byte in string wandeln
             If Inkey_string = "8" Then Menuerichtung = 1
             If Inkey_string = "2" Then Menuerichtung = 2
             If Inkey_string = "4" Then Menuerichtung = 4
             If Inkey_string = "6" Then Menuerichtung = 3
             Gosub Lcd_update
          End If
       End If
    Loop
    
    End
    
    Lcd_update:
       Menue_aktion = Typ_von_untermenu(menuepunkt)
       If Menue_aktion > 0 Then                                 'wenn untermenu ereigniss ist
          If Menuerichtung = 3 Then                             'und Taste rechts gedrückt wurde
             Waitms 5
             Cls
             Waitms 5
             Locate 1 , 1
             Lcd "Ereigniss:" ; Menue_aktion
             Waitms 5
             Return
          End If
       End If
    
       Cls
       Menuepunkt_intern = Menuepunkt
       Gosub Hole_menuepunkt
       Menuepunkt = Menuepunkt_intern
    
       Menuerichtung = 4
       Gosub Hole_menuepunkt
       If Menuepunkt_intern = 2 Then
          If Menuepunkt < Anzahl_eintrage_menu_ebene_01 Then
              Menue_eintrag = "Hauptmenue"
          Else
              Menue_eintrag = Lookupstr(menuepunkt_intern , Menue)
          End If
       Else
          Menue_eintrag = Lookupstr(menuepunkt_intern , Menue)
       End If
       Faktor = Len(menue_eintrag)
       Faktor = 20 - Faktor
       Faktor = Faktor / 2
       Locate 1 , Faktor
       Waitms 5
       Lcd Menue_eintrag
       Waitms 5
       Locate 2 , 1
       Waitms 5
       Menuepunkt_intern = Menuepunkt
       Menuerichtung = 1
       Gosub Hole_menuepunkt
       Menue_eintrag = Lookupstr(menuepunkt_intern , Menue)
       Lcd Menue_eintrag
       Waitms 5
       Locate 3 , 1
       Waitms 5
       Menuepunkt_intern = Menuepunkt
       Menue_eintrag = Lookupstr(menuepunkt_intern , Menue)
       Faktor = Len(menue_eintrag)
       If Faktor < 18 Then
          Menue_eintrag = "-> " + Menue_eintrag
       End If
       Lcd Menue_eintrag
       Waitms 5
       Locate 4 , 1
       Waitms 5
       Menuepunkt_intern = Menuepunkt
       Menuerichtung = 2
       Gosub Hole_menuepunkt
       Menue_eintrag = Lookupstr(menuepunkt_intern , Menue)
       Lcd Menue_eintrag
       Waitms 208
    Return
    
    
    Hole_menuepunkt:                                            'aktualisiert die variable menuepunkt_intern
       If Menuerichtung = 1 Then                                'Taste Menue hoch
          Menuepunkt_intern = Menuepunkt_intern - 2
          If Linkes_zeichen(menuepunkt_intern) = "#"then        'dann letzten Eintrag suchen,da menuebenenanfang erreicht
             Do
                Menuepunkt_intern = Menuepunkt_intern + 2
                Zeichen = Linkes_zeichen(menuepunkt_intern)
             Loop Until Zeichen = "#"                           'es wird vorwärts gesucht bis die nächste Menueebene beginnt
             Menuepunkt_intern = Menuepunkt_intern - 2          'dann zwei Einträge zurück
          End If
       Elseif Menuerichtung = 2 Then                            'Taste Menue runter
          Menuepunkt_intern = Menuepunkt_intern + 2
          If Linkes_zeichen(menuepunkt_intern) = "#"then        'wenn der Anfang der nächsten Ebene erreicht ist
             Do
                Menuepunkt_intern = Menuepunkt_intern - 2       'wird rückwärts gesucht
                Zeichen = Linkes_zeichen(menuepunkt_intern)
             Loop Until Zeichen = "#"                           'bis der Anfang dieser Menueebene gefunden ist
             Menuepunkt_intern = Menuepunkt_intern + 2          'dann ist der erste Eintrag 2 Schritte vorwärts
          End If
       Elseif Menuerichtung = 3 Then                            'wenn Taste rechts (Sprung in Unterebene)
          Menuepunkt_intern = Menuepunkt_intern + 1             'dann wird zum nächsten Eintrag gegangen (Sprungmarke)
          Such_string = Lookupstr(menuepunkt_intern , Menue)
          Such_string = "#" + Such_string                       'diesem Eintrag wird eine Raute vorangestellt
          Menuepunkt_intern = 0
          Do                                                    'und nach ihm vom ersten menueindex an gesucht
             Menue_eintrag = Lookupstr(menuepunkt_intern , Menue)
             Menuepunkt_intern = Menuepunkt_intern + 2
          Loop Until Menue_eintrag = Such_string                'wenn gefunden ist man in der richtigen Menueebene
       Elseif Menuerichtung = 4 Then                            'Taste links (Obermenu)
          Do
             Menuepunkt_intern = Menuepunkt_intern - 2          'wird rückwärts gesucht
             Zeichen = Linkes_zeichen(menuepunkt_intern)
          Loop Until Zeichen = "#"                              'bis Anfang gefunden
          Menuepunkt_intern = Menuepunkt_intern + 1             'dann um 1 erhöht
          Such_string = Lookupstr(menuepunkt_intern , Menue)
          Zeichen = Right(such_string , 1)                      'das 1.Zeichen von rechts wird gelesen
          Faktor = Val(zeichen)                                 'und in einen Faktor
          Faktor = Faktor * 2                                   'umgewandelt
          Such_string = Left(such_string , 2)                   'danach die zwei Zeichen von links
          Such_string = "#" + Such_string                       'mit Raute davor ergeben die Rücksprungebene
          Menuepunkt_intern = 0
          Do                                                    'es wird nach Rücksprungebene gesucht angefangen beim Index 0
             Menue_eintrag = Lookupstr(menuepunkt_intern , Menue)
             Menuepunkt_intern = Menuepunkt_intern + 2
          Loop Until Menue_eintrag = Such_string                'wenn gefunden
          Menuepunkt_intern = Menuepunkt_intern - 2             'werden die 2 die oben aufaddiert wieder abgezogen
          Menuepunkt_intern = Menuepunkt_intern + Faktor        'und um den Faktor nach vorn gesprungen
       End If
    Return
    
    
    Function Typ_von_untermenu(byref Menue_eintrag_tvu As Byte)as Byte       'schaut nach ob der übergebene menuepunkt auf ein ereigniss verweist
       Local Menue_eintrag_text_tvu As String * 20
       Local Menuepunkt_intern_tvu As Byte
       Local Ereigniss_nummer_text_tvu As String * 2
       Local Ereigniss_nummer_tvu As Byte
       Menuepunkt_intern_tvu = Menue_eintrag_tvu
       Menuepunkt_intern_tvu = Menuepunkt_intern_tvu + 1
       Menue_eintrag_text_tvu = Lookupstr(menuepunkt_intern_tvu , Menue)
       If Linkes_zeichen(menuepunkt_intern_tvu) = "!"then
          Ereigniss_nummer_text_tvu = Right(menue_eintrag_text_tvu , 2)
          Ereigniss_nummer_tvu = Val(ereigniss_nummer_text_tvu)
       Else
          Ereigniss_nummer_tvu = 0
       End If
       Typ_von_untermenu = Ereigniss_nummer_tvu
    End Function
    
    
    Function Linkes_zeichen(byref Menue_punkt_lz As Byte)as String       'gibt das erste Zeichen eines Menueeintrags zurück
       Local Menue_eintrag_text_lz As String * 20
       Local Zeichen_lz As String * 1
       Local Menuepunkt_intern_lz As Byte
       Menuepunkt_intern_lz = Menue_punkt_lz
       Menue_eintrag_text_lz = Lookupstr(menuepunkt_intern_lz , Menue)
       Zeichen_lz = Left(menue_eintrag_text_lz , 1)
       Linkes_zeichen = Zeichen_lz
    End Function
    
    
    
    
    
    
    
    ' hinter der #  steht die Menueebene dahinter steht die Rücksprungadresse (Taste links) für diese Menueebene
    ' zB wird aus einem Eintrag der Ebene #04 (zB Abstand) in die Ebene #03 Eintrag 1 gesprungen (031)
    ' in diesem fall nach eingänge und von dort gehts zurück in ebene 1 eintrag 2 (012) das wäre dann "Tests"
    ' nach der Rücksprungadresse folgt der erste Menuepunt (max 20 Zeichen)und danach dessen Vorprung Adresse (Taste nach rechts)
    ' zB hinter "Einstellungen" steht 07 also verzweigt das Menue von dort in die Unterebene #07
    ' falls aus einem Menuepunkt nicht weiter in ein Untermenue gesprungen werden soll sondern ein bestimmdes Ereigniss stattfinden soll
    ' dann kommt als Vorsprungadresse (die Zahl hinter dem Eintrag) ein ! und eine Zahl von 1-99
    ' diese Zahl wird dann in der variable Ereigniss zurueckgegeben
    ' zB wenn man im Menuepunkt "Akku Laden" die Menue-vor Taste (Taste rechts) drückt wird der wert 02 zurueckgegeben dieser kann dann ausgewertet werden
    ' das Menue kann beliebig erweitert oder verändert werden.es ist nur das Format einzuhalten.
    
    Menue:
    Data "#01" , "011" , "Modus" , "02" , "Test" , "03" , "Einstellungen" , "07" , "Akku laden" , "!02"
    Data "#02" , "011" , "Autonom" , "!03" , "Erkunden" , "!04" , "Manuell RC" , "!05" , "Manuell-Stick" , "!06"
    Data "#03" , "012" , "Eingaenge" , "04" , "Ausgaenge" , "05"
    Data "#04" , "031" , "Kollision" , "!07" , "Abstand" , "!08" , "Richtung" , "!09" , "Spannung" , "!10" , "Encoder" , "!77"
    Data "#05" , "032" , "Antrieb" , "!11" , "Servos" , "06" , "Walze" , "!12" , "Lenkung" , "!13",
    Data "#06" , "052" , "Servo links" , "!14" , "Servo rechts" , "!15"
    Data "#07" , "013" , "Uhrzeit" , "08" , "Offset" , "!16"
    Data "#08" , "071" , "Stunden" , "!17" , "Minuten" , "!18" , "Jahr" , "!19" , "Monat" , "!20"
    Data "#EO"                                                  'muß am ende stehen damit das Ende der vorigen Ebene erkannt wird

Berechtigungen

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

Solar Speicher und Akkus Tests