Hallo Leute,

ich wollte den Code aus dem Roboternetz / Wissen mal auf eine fünfte oder auch sechste Taste erweitern, doch bisher ohne Erfolg.

Code:
'Beispiel für ein State Machine Menü
'Das Beispiel ist für den BASCOM-Simulator angepasst worden
'  getestet mit Bascom 1.11.9.1
'  Codelänge 2242 Byte

$regfile = "m32def.dat"
$framesize = 32                                             'Stack
$swstack = 32
$hwstack = 64
$sim
'
'Hinweis: Im Simulator müssen die Eingaben in dem blauen "Terminal Emulator Window" erfolgen!
'Auf der Tastatur ergeben sich für die VIER Joystick-Positionen folgende Umsetzungen
'
'              [Key_plus ]
' [Key_prev]   [         ]    [Key_next]
'              [Key_minus]
'
'
'              [ Taste_8 ]
' [Taste_4 ]   [         ]    [Taste_6 ]
'              [ Taste_2 ]
'
'bzw. im ASCII-Code:

Dim Keycode_string As String * 5  ' im Orginal 4
'Key_plus|Key_minus|Key_prev|Key_next| Return
Keycode_string = "{056}{050}{052}{054}{051}"   ' org fehlt {051}
Dim Keycode(5) As Byte At Keycode_string Overlay  ' org (4) 
Const Key_null = 0                                          'keine Taste gedrückt

'Pins des LCD-Modules setzen ggf. an eigene Anschlüsse anpassen
Config Lcd = 20 * 4
Initlcd
Cls

'******** Joystick/Key Settings ***********************************************
Dim Key As Byte                                             'key in Mainloop

'******** LCD *****************************************************************
Dim Lcd_textbuffer As String * 25

'******** allg Variablen ******************************************************
Dim I As Byte , J As Byte
Dim W As Word

'********* State Variables ****************************************************
Dim State As Word                                           'aktueller State
Dim State_renew As Byte                                     'Flag
Dim State_gosub As Word                                     'aktuelles Unterprogramm

'Initial state variables
State_renew = 1
State = Loadlabel(s10)                                      'Startbildschirm LADEN in dem Fall Stateview
Key = Key_null                                              'keine Taste gedrückt


'********** MAIN-Loop *********************************************************
Do
    'Menüeintrag und Tastencodes finden und ggf. State wechseln
    'hier nur Tastendruck auswerten
    Gosub Change_state                                      '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    'Pointer nach Statuswechsel neu setzen
    If State_renew = 1 Then Gosub Change_state

    'Unterprogramm des aktuellen State anspringen
    LDS R31, {State_gosub+1}                                'High see Bascom-Doc Mixing ASM and BASIC
    LDS R30, {State_gosub}                                  'Low
    LSR R31                                                 'Division durch 2 (Alternativ ADR verwenden)
    ROR R30
    'Call zum Sub
    ICALL


   '---------------------------------------------------------------
   'place for your own code in main loop
   '---------------------------------------------------------------

   'LCD refresh wenn Menü verändert
   If State_renew = 1 Then
      State_renew = 0
      Gosub Lcd_print
   End If

   'Tastaturabfrage mit Halt nur für Simulator, ansonsten Sleep+Timer_ISR verwenden!!
    Key = Waitkey()

 Loop
End

'********* 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 5                        '  org 4
      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
'---------------------------------------------------------------

Null:
         'Null is a dummy flag for State and Gosub -> do nothing
         Return

S10:
         Adr2 Null : Adr2 S11 : Adr2 Null : Adr2 S20 : Adr2 S20       'Key_plus|Key_minus|Key_prev|Key_next
         Adr2 Prog1wahl                                     'Subroutine for current State
         Data " "
                            'Menue Display Text

S11:
         Adr2 S10 : Adr2 S12 : Adr2 Null : Adr2 Null : Adr2 S20       'Key_plus|Key_minus|Key_prev|Key_next
         Adr2 Prog2wahl
         Data " "

S12:
         Adr2 S11 : Adr2 S13 : Adr2 Null : Adr2 Null : Adr2 S20
         Adr2 Prog3wahl
         Data " "

S13:
         Adr2 S12 : Adr2 S14 : Adr2 Null : Adr2 S20 : Adr2 S20       'Key_plus|Key_minus|Key_prev|Key_next
         Adr2 Prog4wahl                                     'Subroutine for current State
         Data " "
                            'Menue Display Text

S14:
         Adr2 S13 : Adr2 S15 : Adr2 Null : Adr2 Null : Adr2 S20       'Key_plus|Key_minus|Key_prev|Key_next
         Adr2 Prog5wahl
         Data " "

S15:
         Adr2 S14 : Adr2 S16 : Adr2 Null : Adr2 Null : Adr2 S20
         Adr2 Prog6wahl
         Data " "

S16:
         Adr2 S15 : Adr2 S17 : Adr2 Null : Adr2 S20 : Adr2 S20       'Key_plus|Key_minus|Key_prev|Key_next
         Adr2 Prog7wahl                                     'Subroutine for current State
         Data " "
                            'Menue Display Text

S17:
         Adr2 S16 : Adr2 Null : Adr2 Null : Adr2 Null : Adr2 S20       'Key_plus|Key_minus|Key_prev|Key_next
         Adr2 Prog8wahl
         Data " "





''
S20:
         Adr2 Null : Adr2 Null : Adr2 S10 : Adr2 Null
         Adr2 Menu1
         Data "Prog1"

'********* LCD SUB routines ***************************************************
'---------------------------------------------------------------
'Subroutine: Lcd_print
'Call from:  anywhere
'Purpose:    gibt Lcd_textbuffer auf dem LCD-Display aus
'Result:     LCD
'---------------------------------------------------------------
Prog1wahl:
  'Adjusts the Clock
    Lcd_textbuffer = "PUNKT1"
    Locate 1 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt2"
    Locate 2 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt3"
    Locate 3 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt4"
    Locate 4 , 1
    Lcd Lcd_textbuffer
    State_renew = 0
  Return

Prog2wahl:
  'Adjusts the Clock
    Lcd_textbuffer = "punkt1"
    Locate 1 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "PUNKT2"
    Locate 2 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt3"
    Locate 3 , 1
    Lcd Lcd_textbuffer
    State_renew = 0

  Return

Prog3wahl:
  'Adjusts the Clock

    Lcd_textbuffer = "punkt2"
    Locate 2 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "PUNKT3"
    Locate 3 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt4"
    Locate 4 , 1
    Lcd Lcd_textbuffer
    State_renew = 0
  Return

Prog4wahl:
  'Adjusts the Clock

    Lcd_textbuffer = "punkt3"
    Locate 3 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "PUNKT4"
    Locate 4 , 1
    Lcd Lcd_textbuffer
    State_renew = 0
  Return

Prog5wahl:
  'Adjusts the Clock
    Lcd_textbuffer = "punkt2"
    Locate 1 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt3"
    Locate 2 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt4"
    Locate 3 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "PUNKT5"
    Locate 4 , 1
    Lcd Lcd_textbuffer
    State_renew = 0

  Return

Prog6wahl:
  'Adjusts the Clock
    Lcd_textbuffer = "punkt3"
    Locate 1 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt4"
    Locate 2 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt5"
    Locate 3 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "PUNKT6"
    Locate 4 , 1
    Lcd Lcd_textbuffer
    State_renew = 0

  Return

Prog7wahl:
  'Adjusts the Clock
    Lcd_textbuffer = "punkt4"
    Locate 1 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt5"
    Locate 2 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt6"
    Locate 3 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "PUNKT7"
    Locate 4 , 1
    Lcd Lcd_textbuffer
    State_renew = 0

  Return

  Prog8wahl:
  'Adjusts the Clock
    Lcd_textbuffer = "punkt5"
    Locate 1 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt6"
    Locate 2 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "punkt7"
    Locate 3 , 1
    Lcd Lcd_textbuffer

    Lcd_textbuffer = "PUNKT8"
    Locate 4 , 1
    Lcd Lcd_textbuffer
    State_renew = 0

  Return



Lcd_print:                                                  'Print lcd_textbuffer
    Cls
    Lcd Lcd_textbuffer
    State_renew = 0
Return


Menu1:                                                      'Print lcd_textbuffer
    Cls
    Lcd Lcd_textbuffer
    State_renew = 0
Return

Ich habe wohl noch nicht ganz verstanden wie hier sehr clever und mit sehr wenig Aufwand die entsprechenden sub´s aufgerufen werden, wenn eine der Tasten betätigt wird.

Kann mir jemand behilflich sein

vielen dank
olby2