LCD Menü

Loety

Neues Mitglied
20. Feb. 2010
5
0
1
Sprachen
Hallo zusammen :)

Ich versuche seit einiger Zeit für meine Anwendung ein LCD Menü zu programmieren. Da ich keinen Schimmer hatte wie man sowas macht habe ich mich im Netz etwas umgesehen und folgenden Code gefunden. (Anhang Menü1)
Habe mich dann seit mehreren Tagen mit diesem Code beschäftigt und versucht in auf meine Bedürfnisse zu erweitern sprich mehr Einträge und mehr Untermenüs hinzufügen. Leider klappt das irgendwie nicht so recht denn wenn man mehr Einträge einfügt fängt das Menü dann irgendwann an nur noch Mist auf dem LCD anzuzeigen. Habe versucht nachzuvollziehen woran es liegen könnte doch ich komme nicht dahinter.

Vielleicht kann mir ja hier jemand helfen oder einen heißen Tipp geben.
Das geänderte Programm (LCD Menü) ist auch im Anhang zu finden.

Viele Grüße

Loety
 

Anhänge

  • Menü1.txt
    3,7 KB · Aufrufe: 43
  • LCD_Menü.bas
    4,5 KB · Aufrufe: 25
Hallo und Willkommen im AVR-Praxis Forum! :ciao:

Ich kann mir ja nachher mal dein geändertes Programm ansehen......
Momentan fehlt mir da etwas die Zeit.

Wenn du aber irgendwo im Internet ein Programm gefunden hast, warum fragst du dann zum Beispiel nicht einfach mal den Autor des Programms? :hmmmm:
Wie dem auch sei.....

Ich stelle dein Programm hier mal direkt ein.
Das ist für Alle nachher einfacher, als es extra noch herunter laden zu müssen. ;)
Außerdem können auch so die Anderen einen Blick drauf werfen, die vielleicht kein BASCOM haben.

Gruß,
Cassio



Hier mal "dein" Programm:



CodeBox bascom

$sim
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 38400
$hwstack = 32
$swstack = 32
$framesize = 64

'---------------------Sonderzeichen-für-das-LCD---------------------------------

Deflcdchar 5 , 32 , 32 , 32 , 32 , 32 , 17 , 10 , 4 'Pfeil

'---------------------Initalisieren-des-LCD-------------------------------------

Config Lcd = 20 * 4 , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.5 , Rs = Portb.7
Config Lcdbus = 4

Initlcd

'---------------------Konstanten-der-Displaygröße-------------------------------

Const Lcdrows = 4
Const Lcdcols = 20

'---------------------Konstanten-der-Tastenbelegung-----------------------------

Const Keyup = 1
Const Keydown = 2
Const Keyright = 3
Const Keyleft = 4

'---------------------Anzahl-der-Menüeinträge-als-Konstante---------------------

Const Mnumaxlines = 14

'---------------------Variablen-für-Programmablauf------------------------------

Config Kbd = Portc , Debounce = 20 , Delay = 10

Dim Hilf_mnu As Byte
Dim N As Byte
Dim Mnuselect As Word
Dim Mnuselectscount As Byte
Dim Mnuselectback As Word
Dim Mnuselectpointer As Byte
Dim Mnuselectpointer_old As Byte
Dim Mnutext(mnumaxlines) As String * Lcdcols
Dim Mnuselects(mnumaxlines) As Word
Dim I As Word
Dim M As Word
Dim Mnuselectold As Word
Dim Keypressed As Byte
Dim Keycode As Byte



Hilf_mnu = 1
N = 3
Mnuselectpointer = 1

Do
Select Case Mnuselect
Case 0:
Mnuselectback = 0
Mnutext(1) = "LINIENAUSWAHL"
Mnuselects(1) = 1
Mnutext(2) = "EINSTELLUNGEN"
Mnuselects(2) = 4
Mnuselectscount = 2
Gosub Mnushow
Case 1:
Mnuselectback = 0
Mnutext(1) = "S1"
Mnuselects(1) = 2
Mnutext(2) = "S2"
Mnuselects(2) = 0
Mnutext(3) = "S3"
Mnuselects(3) = 0
Mnutext(4) = "S4"
Mnuselects(4) = 0
Mnutext(5) = "S5"
Mnuselects(5) = 0
Mnutext(6) = "S6"
Mnuselects(6) = 0
Mnutext(7) = "S7"
Mnuselects(7) = 0
Mnutext(8) = "S8"
Mnuselects(8) = 0
Mnutext(9) = "S9"
Mnuselects(9) = 0
Mnuselectscount = 9
Mnuselectpointer_old = 1
Gosub Mnushow
Case 2:
Mnuselectback = 0
Mnutext(1) = "FW <> FORD"
Mnuselects(1) = 0
Mnutext(2) = "FORD <> FW"
Mnuselects(2) = 0
Mnutext(3) = "FOO <> FW"
Mnuselects(3) = 0
Mnutext(4) = "FW <> FOO"
Mnuselects(4) = 0
Mnutext(5) = "FF <> FHOE"
Mnuselects(5) = 0
Mnutext(6) = "FHOE <> FF"
Mnuselects(6) = 0
Mnutext(7) = "FF <> FHAS"
Mnuselects(7) = 0
Mnutext(8) = "FHAS <> FF"
Mnuselects(8) = 0
Mnutext(9) = "FORD <> FHM"
Mnuselects(9) = 0
Mnutext(10) = "FORD <> FHM"
Mnuselects(10) = 0
Mnuselectscount = 10
Mnuselectpointer_old = 1
Gosub Mnushow
End Select
Loop

Mnushow:

Mnuselectold = Mnuselect

While Mnuselectold = Mnuselect
M = 1
If Mnuselectpointer < Hilf_mnu Then
Decr Hilf_mnu
Else
If Mnuselectpointer > N Then
Incr Hilf_mnu
End If
End If

N = Hilf_mnu + Mnuselectscount
Decr N
If N > Lcdrows Then
N = Lcdrows + Hilf_mnu
Decr N
End If

Cls

For I = Hilf_mnu To N
Locate M , 1
If I = Mnuselectpointer Then
Lcd Chr(&B01111110) ; " "
Else
Lcd " "
End If
Lcd Mnutext(i)
Incr M
Next

If Hilf_mnu > 1 Then
Locate 1 , Lcdcols
Lcd "^"
End If
If N < Mnuselectscount Then
Locate Lcdrows , Lcdcols
Lcd Chr(5)
End If

Do
Gosub Tstq
Loop Until Keypressed > 0

If Keypressed = Keyup And Mnuselectpointer > 1 Then
Decr Mnuselectpointer
End If
If Keypressed = Keydown And Mnuselectpointer < Mnuselectscount Then
Incr Mnuselectpointer
End If
If Keypressed = Keyright Then
Mnuselect = Mnuselects(mnuselectpointer)
End If
If Keypressed = Keyleft And Mnuselect <> 0 Then
Mnuselect = Mnuselectback
Mnuselectpointer = Mnuselectpointer_old
Hilf_mnu = Mnuselectpointer
End If

Wend

Cls

Return

Tstq:


Keycode = Getkbd()

Keypressed = 0

If Keycode = 0 Then
Keypressed = 1
End If
If Keycode = 1 Then
Keypressed = 2
End If
If Keycode = 2 Then
Keypressed = 3
End If
If Keycode = 3 Then
Keypressed = 4
End If

Waitms 200



Return

Ende:
End
 
Hallo Loety !

Puh, dass Programm kann man aber nicht mal eben schnell durchsehen.....
Dafür benötige ich einfach etwas mehr Zeit. :rolleyes:

Vielleicht kannst du uns allen ja etwas dabei helfen.
Beschreib doch mal mit einzelnen Abschnitten was das Programm macht.
Wenn wir den Ablauf und die Abschnitte dann verstanden haben können wir ja mal gemeinsam schauen, was da nun nicht richtig läuft.

Wäre also hilfreich, wenn du uns die ganzen Variablen und Subroutinen mal kurz erklärst.

Gruß,
Cassio
 
Hallo Loety,
hast du eigentlich mal versucht, den Fehler im Simulator zu erzeugen?
Da ist zwar die GetKBD() Funktion drinnen, die im Sim wohl nicht simuliert werden kann, aber du kannst ja die Eingabe selbst erzeugen.
Wenn der Fehler dort auch auftritt, wäre es für uns noch leichter, das nachzuvollziehen.

HBA
 
Hallo HBA!

Das mit dem Keyboard sollte nicht das Thema sein, dass funktioniert auch im Simulator ganz gut.
In der Hilfe von BASCOM wird aber extra noch mal darauf hingewiesen, dass man den Code bis zur Eingabe besser Zeilenweise abarbeiten muss.

Manchmal klappt es im Simulator aber auch so.... Hängt halt vom Programm ab.

Gruß,
Cassio
 
Hi Cassio,
ich hatte nicht damit gerechnet, dass eine komplexe Funktion wie GetKBD() simuliert werden könnte. Ist ja aber eigentlich klar.
Wieder was dazu gelernt.
Mit seinem Programm komme ich aber trotzdem nicht klar. Ich kann da von 0-3 rumklicken wie ich will, "Mist" wird nie angezeigt.
Wenn ich mit "Linienauswahl" starte, kommt bei "3" das Untermenu mit "S1 ...", eine weitere "3" bringt "FW ..." und noch 'ne "3" kommt wieder das erste Menu.
Drücke ich die "3" bei "Einstellungen", läuft das Programm in eine Endlosschleife.
Die Taste "0" hat keine Funktion.

HBA
 
Wieder was dazu gelernt.

Hi HBA!

Ja ja, nimm mich ruhig auf den Arm. ;)

Ich hatte das Programm ja herunter geladen und hier eingestellt.....
Danach habe ich es auch mal durch den Simulator gehauen.
Mir ging es dabei auch so wie dir. Irgendwie bin ich damit auch nicht klar gekommen. ;)

Ich finde den Aufbau des Programms für ein LCD-Menü auch sehr....... sagen wir mal "speziell". :cool:

Aus dem Grunde würde ich es auch gut finden, wenn uns Loety das Ganze erst mal vom Ablauf her erklärt.
Nicht einfach ein Programm aus dem Internet holen, vielleicht etwas dran rumwerkeln und dann..... ;)

Gruß,
Cassio
 
Hallo zusammen :D

Sorry das ich mich erst jetzt melde aber ich hatte Spätdienst !
Also ob das jetzt speziell vom Aufbau ist oder nicht kann ich nicht sagen weil es ja nicht von mir ist. Ich hatte halt nach einer einfachen Lösung für ein LCD Menü gesucht. Den Verfasser kann ich leider nicht mehr kontaktieren da das Posting aus 2004 war und er sich nicht auf meine Anfrage gemeldet hat. Das originale Programm ohne meine Änderungen habe ich ja auch oben im Anhang eingefügt. (Menü1)
Die Taste 1 ist rauf, Taste 2 ist runter, Taste 3 ist auswählen und Taste A ist zurück. Die Tastenabfrage über GetKBD() habe ich nur zu Simulationszwecken eingefügt. Dort sollen später mal natürlich normale Taster abgefragt werden.
Ja richtig die S1 funktioniert scheinbar noch richtig aber versucht mal die S3 auszuwählen. Wenn es dann zum Hauptmenü zurückspringen soll tut es das auch. Nur fehlt dann der Zeiger (Pfeil) oder wenn man dann auf A für zurück drückt kommt alles durcheinander ! Je mehr Einträge und Untermenüs ich hinzufüge je schlimmer wird es. Irgendwo scheint etwas überzulaufen oder so. Ich finde aber nicht die entscheidende Stelle im Code die dafür verantwortlich ist. Da der Code vom Verfasser leider nicht Kommentiert wurde ist es nochmal so schwer finde ich. Kann ja auch sein das Ihr jetzt sagt der Code ist totaler Schrott aber habt Ihr eine gute Alternative ? Die State Maschine vom Butterfly Menü im RoboterNetz finde ich schon wieder einen Ticken zu kompliziert. Das muss doch einfacher gehen. Ich möchte über die Linienauswahl in das nächste Menü springen wo mir dann die Linien S1 bis S9 zur Auswahl stehen. Bei Auswahl von S1 z.B. soll dann ein weiteres Menü angezeigt werden welches dann die einzelnen Streckenvarianten enthält. Das können pro Linie dann nochmal so ca. 15 Einträge sein. So mein Plan :D
Ich hoffe es euch halbwegs gut erklärt zu haben. Weitere Fragen beantworte ich euch gern !!

Könnt Ihr mir helfen ?

Viele Grüße

Loety
 
Hi Loety,

zuerst auch mal von mir herzlich willkommen im Forum :flowers:

Ich finde aber nicht die entscheidende Stelle im Code die dafür verantwortlich ist. Da der Code vom Verfasser leider nicht Kommentiert wurde ist es nochmal so schwer finde ich.
Das ist jetzt nur mal ne Feststellung vom mir. Aber das erinnert mich mal wieder
an meine Infos an die Leute ... dokumentiert euren Code vernünftig. Es lohnt
sich. Ja ich weiß, Loety, du kannst da nix zu. Das du versuchst dich in fremden
Code reinzuarbeiten ist auf jeden Fall schon mal ne Menge wert ;) Also kein
reines Copy-n-Paste :D Freut mich!

Die State Maschine vom Butterfly Menü im RoboterNetz finde ich schon wieder einen Ticken zu kompliziert.
Hier ist doch irgendwo im Forum schon nen Menü drin ... Astrowetterstation
oder war das bei der Wintergartensteuerung ? ... Ich weiß jetzt aber nicht
ob das nach dem Vorbild aus dem Roboternetz ist oder nach was anderem.

Ah .. gefunden .. Wintergartensteuerung - ab #26
Jou ... ist aus dem Roboternetz ... :eek:

Gruß
Dino
 
Hallo dino03 !

Ja die Wintergarten-Steuerung von Markus hatte ich schon entdeckt :D
Aber er verwendet wie Du schon sagst den Code aus dem RoboterNetz, und den fand ich etwas zu "oversized" für meine Anwendung. Wenn es natürlich nicht anders geht, muss ich mich mal in diesen Code einarbeiten.
Der müsste dann aber stark gekürzt werden, denn ich benötige soviele Einträge natürlich nicht.
Bei dem Code den ich im Netz gefunden habe, fand ich die Steuerung bzw. die Anzeige mit dem Pfeil, und das Einrücken des gewählten Menüeintrages so schön. Das fehlt mir etwas beim Code vom RoboterNetz.

Najamal sehen :)

Viele Grüße

Loety
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)