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

Thema: LCD Menue (State Machine)?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Scotch
    Registriert seit
    15.10.2004
    Ort
    Bei Braunschweig
    Alter
    52
    Beiträge
    305

    LCD Menue (State Machine)?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    ich versuche mich z. Z. mit dem Thema LCD Menue.
    Hier im RN Wissen habe ich ein Besipiel gefunden http://www.rn-wissen.de/index.php/Ba...e_Machine_Menu .
    Das Beispiel (Version2) habe ich auf dem Arduino Uno mit DFRobot LCD Sheld (http://robosavvy.com/store/product_i...oducts_id/1862)
    zum laufen gebracht. LCD funktioniert und die Tasten am Analogeingang funktionieren auch.
    Genau so wie das blättern im Menue.

    Nur mit dem Verständnis der Datentabelle und deren abfrage hapert es noch.
    Wobei der Inhalt der Tabelle an sich verstanden ist.
    hier mal ein Auszug wo ich nicht weiter komme.

    Code:
    '********* State routines ***************************************************
    '---------------------------------------------------------------
    'Subroutine: Change_state
    'Call from:  main loop
    'Purpose:    Status der State Machine feststellen und ggf. Wechseln
    'Result:     Pointer auf State / Variable State_renew
    '---------------------------------------------------------------
    Change_state:
        lds R8, {State}
        lds R9, {State + 1}
        For I = 1 To Key_buttons
          Read W
          If Key = Keycode(i) Then
               If W <> Loadlabel(null) Then
                  State_renew = 1
                  Key = Key_null                                'reset key status after get a new state of state machine (prevent influence on GOSUBs)
                  State = W
               End If
          End If
        Next I
        Read State_gosub                                        'Adresse des akt. Unterprogramms einlesen
        Read Lcd_textbuffer                                     'read LCD text
    Return
    
    '---------------------------------------------------------------
    'Subroutine: Change_state_by_sub
    'Call from:  subroutine
    'Purpose:    change state of state machine by a subbroutine
    '---------------------------------------------------------------
    Change_state_by_sub:
       State_renew = 1
       Gosub Change_state
    Return
    
    '---------------------------------------------------------------
    'DATA:       State Machine
    'Result:     Pointers auf States , Unterprogramme
    '            Menütexte
    'Format:     1. Zeile: für jede Taste genau eine Verzeigung ADR2 (see Key_buttons=xx)
    '            2. Zeile: Sprunglabel als ADR2 für ein ggf. anzuspringendes Unterprogramm
    '            3. Zeile: Displaytext des akt. Status als DATA Feld
    'Hinweis:    wenn nichts passieren soll wird das Label NULL eingetragen
    '---------------------------------------------------------------
    
    Null:
             'Null is a dummy flag for State and Gosub -> do nothing
             Return
    
    S10:
             Adr2 Null : Adr2 S20 : Adr2 Null : Adr2 S11        'Key_plus|Key_minus|Key_prev|Key_next
             Adr2 Null                                          'Subroutine for current State
             Data "1 Butterfly Bascom"                          'Menue Display Text
    S11:
                 Adr2 Null : Adr2 Null : Adr2 S10 : Adr2 Null   'Key_plus|Key_minus|Key_prev|Key_next
                 Adr2 Null
                 Data "11 Rev 2"
    Zu einem ist es die Tabelle an sich.
    Die sieht mir aus wie normale Labes (S10: S20: ....) die ich auch bei Gosub z.b. benutze.
    Woher weiß Bascom das dies eine Datentabelle ist?
    Die Zeile
    Adr2 Null : Adr2 S20 : Adr2 Null : Adr2 S11
    sind die Sprungmarken für die Einzelnen Tasten zum anzeigen des nächsten Menuepunktes.
    Muss ich der Tabelle irgendwo sagen wie viel Einträge pro Datensatz gemacht werden?

    Und das auslesen will sich mir auch noch nicht so recht erschließen.
    Mit Read W wird die Tabelle gelesen und mit der For Next Schleife,
    werden die Daten pro Datensatz z. B. Adr2 Null : Adr2 Null : Adr2 S10 : Adr2 Null
    ausgelesen aber wie wird dann die zweite und dritte Zeile ausgelesen ?
    Also die Zeilen
    Adr2 Null
    Data "11 Rev 2

    Die Bascom Hilfe zu Read und Loadlabe war auch nicht so aufschlussreich.

    Vielleicht kann mir einer hier im Forum die Funktion bzw. das Arbeiten mit
    Tabellen erläutern.

    Gruß Ingo

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    65
    Beiträge
    358
    Hallo Scotch !

    Null:
    S10: und s11: sind auch Sprunglabel, das hast Du schon treffend erkannt.
    Die Datentabelle fehlt in deinem Codeschnipsel komplett.
    Müsste so aussehen und am Programmende stehen:

    DATA 12 , 23 , 22 u.s.w.
    DATA 24 , 40 , 66 u.s.w.

    Die Zahlen wurden von mir willkürlich gewählt.

    In deinen Sprungadressen S10: und S11: ist nur jeweils eine Data Zeile mit jeweils einem String vorhanden.

    Ich hoffe das hilft Dir ein wenig weiter
    Nachlesen kannst Du mehr in der Bascom Hilfe unter DATA Anweisung

    Roland
    Robotik & Arduino Homepage
    http://www.ardumega.de

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von Scotch
    Registriert seit
    15.10.2004
    Ort
    Bei Braunschweig
    Alter
    52
    Beiträge
    305
    Hallo Roland,
    Danke für Deine Antwort.
    Eine Datentabelle ist nicht am Programmende.
    Sondern nur immer eine DATA Zeile zwischen den Labels.

    Wie schon geschrieben der COde Funktioniert, nur wenn es Sprung Label's sind,
    dann vermisse ich die Return Zeile.


    Die Zeile mit den

    Adr2 Null : Adr2 Null : Adr2 S57 : Adr2 Null
    ist das eine Art von Array? Es ist je schließlich immer die selbe Variable (Adr2) mit unterschiedlichen Werten.



    Hier mal alle DATA Anweisung bzw, das ganze Menue.
    Code:
    '---------------------------------------------------------------
    'DATA:       State Machine
    'Result:     Pointers auf States , Unterprogramme
    '            Menütexte
    'Format:     1. Zeile: für jede Taste genau eine Verzeigung ADR2 (see Key_buttons=xx)
    '            2. Zeile: Sprunglabel als ADR2 für ein ggf. anzuspringendes Unterprogramm
    '            3. Zeile: Displaytext des akt. Status als DATA Feld
    'Hinweis:    wenn nichts passieren soll wird das Label NULL eingetragen
    '---------------------------------------------------------------
    
    Null:
             'Null is a dummy flag for State and Gosub -> do nothing
             Return
    
    S10:
             Adr2 Null : Adr2 S20 : Adr2 Null : Adr2 S11        'Key_plus|Key_minus|Key_prev|Key_next
             Adr2 Null                                          'Subroutine for current State
             Data "1 Butterfly Bascom"                          'Menue Display Text
    S11:
                 Adr2 Null : Adr2 Null : Adr2 S10 : Adr2 Null   'Key_plus|Key_minus|Key_prev|Key_next
                 Adr2 Null
                 Data "11 Rev 2"
    S20:
             Adr2 S10 : Adr2 S30 : Adr2 Null : Adr2 S21
             Adr2 Null
             Data "2 Time"
    S21:
                 Adr2 Null : Adr2 S22 : Adr2 S20 : Adr2 S23
                 Adr2 Null
                 Data "21 Clock"
    S22:
                 Adr2 S21 : Adr2 Null : Adr2 S20 : Adr2 S24
                 Adr2 Null
                 Data "22 Date"
    S23:                                                        'Show HH:MM:SS
                       Adr2 Null : Adr2 S24 : Adr2 S21 : Adr2 S25
                       Adr2 Showclock
                       Data ""
    S24:                                                        'Show DD:MM:YY
                       Adr2 S23 : Adr2 Null : Adr2 S22 : Adr2 S26
                       Adr2 Showdate
                       Data ""
    S25:
                       Adr2 S27 : Adr2 Null : Adr2 S23 : Adr2 S65
                       Adr2 Null
                       Data "211 Adjust Clock"
    S26:
                       Adr2 Null : Adr2 S28 : Adr2 S24 : Adr2 S66
                       Adr2 Null
                       Data "221 Adjust Date"
    S27:
                       Adr2 Null : Adr2 S25 : Adr2 S23 : Adr2 S67
                       Adr2 Null
                       Data "212 Clock Format"
    S28:
                       Adr2 S26 : Adr2 Null : Adr2 S23 : Adr2 S68
                       Adr2 Null
                       Data "222 Date Format"
    S30:
             Adr2 S20 : Adr2 S40 : Adr2 Null : Adr2 S31
             Adr2 Null
             Data "3 DataLogger"
    S31:
                 Adr2 Null : Adr2 S32 : Adr2 S30 : Adr2 S35
                 Adr2 Null
                 Data "31 Log Cycle"
    S32:
                 Adr2 S31 : Adr2 S33 : Adr2 S30 : Adr2 S36
                 Adr2 Null
                 Data "32 Delete Flash"
    S33:
                 Adr2 S32 : Adr2 S34 : Adr2 S30 : Adr2 S37
                 Adr2 Null
                 Data "33 Show LogCount"
    S34:
                 Adr2 S33 : Adr2 Null : Adr2 S30 : Adr2 S38
                 Adr2 Null
                 Data "34 Print to RS232"
    S35:                                                        'HH:MM
                       Adr2 Null : Adr2 Null : Adr2 S31 : Adr2 Null
                       Adr2 Datalogger_setloginterval
                       Data ""
    S36:
                       Adr2 Null : Adr2 Null : Adr2 S32 : Adr2 S76
                       Adr2 Null
                       Data "321 RIGHT Delete DF"
    S37:                                                        '1234
                       Adr2 Null : Adr2 Null : Adr2 S33 : Adr2 Null
                       Adr2 Datalogger_logcount
                       Data ""
    S38:
                       Adr2 Null : Adr2 Null : Adr2 S34 : Adr2 S78
                       Adr2 Null
                       Data "341 RIGHT Print9600B"
    S40:
            Adr2 S30 : Adr2 S50 : Adr2 Null : Adr2 S41
            Adr2 Null
            Data "4 ADC"
    S41:
               Adr2 Null : Adr2 S42 : Adr2 S40 : Adr2 S45
               Adr2 Null
               Data "41 Temperature"
    S42:
               Adr2 S41 : Adr2 S43 : Adr2 S40 : Adr2 S46
               Adr2 Null
               Data "42 Voltage"
    S43:
               Adr2 S42 : Adr2 S44 : Adr2 S40 : Adr2 S47
               Adr2 Null
               Data "43 ADC Port RAW"
    S44:
               Adr2 S43 : Adr2 Null : Adr2 S40 : Adr2 S48
               Adr2 Null
               Data "44 Battery"
    S45:                                                        '+24°C
                       Adr2 Null : Adr2 Null : Adr2 S41 : Adr2 Null
                       Adr2 Temperaturefunc
                       Data ""
    S46:                                                        '0 mV
                       Adr2 Null : Adr2 Null : Adr2 S42 : Adr2 Null
                       Adr2 Voltagefunc
                       Data ""
    S47:                                                        'CH:RAW
                       Adr2 Null : Adr2 Null : Adr2 S43 : Adr2 Null
                       Adr2 Adc_raw_func
                       Data ""
    S48:                                                        '2900mV
                       Adr2 Null : Adr2 Null : Adr2 S44 : Adr2 Null
                       Adr2 Adc_batt_func
                       Data ""
    S50:
            Adr2 S40 : Adr2 Null : Adr2 Null : Adr2 S51
            Adr2 Null
            Data "5 Options"
    
    S51:
               Adr2 Null : Adr2 S52 : Adr2 S50 : Adr2 S56
               Adr2 Null
               Data "51 LCD contrast"
    S52:
               Adr2 S51 : Adr2 S53 : Adr2 S50 : Adr2 S57
               Adr2 Null
               Data "52 Bootloader"
    
    S53:
               Adr2 S52 : Adr2 S54 : Adr2 S50 : Adr2 S83
               Adr2 Null
               Data "53 LCD OFF"
    
    S54:
               Adr2 S53 : Adr2 S55 : Adr2 S50 : Adr2 S58
               Adr2 Null
               Data "54 LCD Auto Power"
    
    S55:
               Adr2 S54 : Adr2 Null : Adr2 S50 : Adr2 S59
               Adr2 Null
               Data "55 Key Click"
    S56:                                                        '0...15
                       Adr2 Null : Adr2 Null : Adr2 S51 : Adr2 Null
                       Adr2 Setcontrast
                       Data ""
    S57:
                       Adr2 Null : Adr2 Null : Adr2 S52 : Adr2 S87
                       Adr2 Null
                       Data "521 RIGHT bootloader"
    
    S58:                                                        'OFF/5..90min
                       Adr2 Null : Adr2 Null : Adr2 S54 : Adr2 Null
                       Adr2 Autopower
                       Data ""
    S59:                                                        'ON/OFF
                       Adr2 Null : Adr2 Null : Adr2 S55 : Adr2 Null
                       Adr2 Keyclick_set
                       Data ""
    'Untermenüs zu State 25 bis 28
    S65:                                                        'sub for "211 Adjust Clock"
                              Adr2 S67 : Adr2 Null : Adr2 S23 : Adr2 Null
                              Adr2 Setclock
                              Data ""
    S66:                                                        'sub for "221 Adjust Date"
                              Adr2 Null : Adr2 S68 : Adr2 S24 : Adr2 Null
                              Adr2 Setdate
                              Data ""
    S67:                                                        'sub for "212 Clock Format"
                              Adr2 Null : Adr2 S65 : Adr2 S23 : Adr2 Null
                              Adr2 Setclockformat
                              Data ""
    S68:                                                        'sub for  "222 Date Format"
                              Adr2 S66 : Adr2 Null : Adr2 S24 : Adr2 Null
                              Adr2 Setdateformat
                              Data ""
    'Untermenüs zu State 36 und 38
    S76:                                                        'sub for  "321 RIGHT Delete DF"
                              Adr2 Null : Adr2 Null : Adr2 S36 : Adr2 Null
                              Adr2 Datalogger_erase
                              Data ""
    S78:                                                        'sub for  "341 RIGHT Print9600B"
                              Adr2 Null : Adr2 Null : Adr2 S38 : Adr2 Null
                              Adr2 Datalogger_rs232
                              Data ""
    'Untermenü zu State 53 und 57
    S83:                                                        'sub for  "53 LCD OFF"
                              Adr2 Null : Adr2 Null : Adr2 S53 : Adr2 Null
                              Adr2 Power_off_func
                              Data ""
    S87:                                                        'sub for "521 RIGHT bootloader"
                              Adr2 Null : Adr2 Null : Adr2 S57 : Adr2 Null
                              Adr2 Bootfunc
                              Data ""
    Das Komplette Programm findet man im RN Wissen (Link im ersten Post)
    Gruß Ingo

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    28.09.2009
    Beiträge
    5
    Adr2 gibt die Adresse des jeweiligen Labels im Speicher zurück. Die 2. und 3. Zeile liest du mit Read State_gosub (Zeile2) und Read Lcd_textbuffer (Zeile3).

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    65
    Beiträge
    358
    Hallo!

    Lies Dir mal die Bascom Hilfe, im speziellen die Befehle Read, Data und Restore durch, dann dürfte dein Verständnisproblem sich auflösen.
    Es funktioniert folgendermassen:

    Restore S22 Bedeutet: Lese die Datas am Sprunglabel S22:
    Mit dem Read Befehl werden dann die entsprechenden Datas gelesen
    Dann:
    Restore S55 Bedeutet: Lese die Datas am Sprunglabel S55:
    Wieder mit dem Read Befehl Datas ab Label S55: lesen.
    Ein Return Befehl ist dabei nicht nötig.

    Alle Angaben wurden von mir willkürlich gewählt und beziehen sich nicht auf dein Programm!
    Ich hoffe damit verstehst Du es.

    Roland
    Robotik & Arduino Homepage
    http://www.ardumega.de

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von Scotch
    Registriert seit
    15.10.2004
    Ort
    Bei Braunschweig
    Alter
    52
    Beiträge
    305
    Hallo Roland,

    ich habe mir gestern mal die Variable State_gosub per Print ausgegeben.
    Von dem Ergebnis war ich erst etwas verwundert. 792, 812, 836... Nach dem ich mir die
    Assemblerbefehle etwas genauer angeschaut habe, kam etwas Licht ins Dunkel.
    Mit Read
    State_gosub wird die Speicheradresse des Labels gelesen und
    dann per Assembler Befehl angesprungen.

    Die Abstände zwischen den Zahlen (792, 812...)sind unterschiedlich,
    darauf hab ich mal die Zeichenlänge in den Data "....." angepasst, so das über all
    gleich viele Zeichen drin stehen und siehe da, dann sind die Abstände gleich groß.

    Nur wenn ich W per Print mir anzeigen lasse, werden auch nur Wirre Zahlen ausgegeben.
    Sind das dann die Hexwerte aus dem Speicher?

    Gruß Ingo

Ähnliche Themen

  1. Print Ausgabe bei State Machine
    Von JuergenG im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 08.02.2010, 16:25
  2. State Machine
    Von Loro im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 17.03.2009, 11:51
  3. Frage zur State-Machine
    Von guenter1604 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 05.01.2009, 20:13
  4. State Machine Aktualisierungsproblem
    Von Loro im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 27.08.2008, 23:07
  5. State Machine aus Beispiel mit 5 Tasten
    Von olby2 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 16.08.2008, 23:36

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress