Forum: Mikrocontroller und Digitale Elektronik BASCOM LCD-Display Menü


von Lokus P. (derschatten)


Lesenswert?

Hallo Leute,
ich bin mal hier gelandet da es nicht so viele Foren gibt die sich 
intensiv mit Bascom beschäftigen.
Hoffe deshalb hier wird einem geholfen.

Ich habe zwar schon einige Beiträge über erstellen eines LCD-Menüs 
gelesen, jedoch war nie das richtige für mich dabei.
Da ich mich erst seit kurzem überhaupt mit AVR's beschäftige habe ich in 
dieser Richtung auch so gut wie keine Erfahrung.
Zu meinem Problem:

Ich möchte gerne auf einem 16x2 Zeilen Display ein Auswahlmenü 
darstellen.
Das ganze soll mittels 3 Taster (bzw. Drehimpulsgeber mit Taster) 
gesteuert werden.
(2 Taster für Links/Rechts, 1 Taster für Menü/Option-Auswahl)
Die obere Zeile soll zur Auswahl des Menüs dienen, die untere zur 
Auswahl der Option des Menüs.

Bsp:
1.Zeile: LED 1
2.Zeile: [AUS] EIN

Wobei die 2te Zeile erst erscheinen soll wenn bei der ersten die 
Auswahltaste gedrückt wurde. (Die Eckige Klammer zeigt die Auswahl an)
In der zweiten kann man dann ebenfalls mittels Taste Links/Rechts die 
Option auswähln und mit der Auswahltaste bestätigen.

Jede Option soll natürlich noch eine Funktion ausführen. (zb. Ausgang 
Portc.1 auf HI schalten)

Nach der Auswahl soll die Anzeige wieder zu einer Standardanzeige 
zurückspringen.
Und das Menü soll erst wieder erscheinen sobald eine der 
Links/Rechts-Taste betätigt wurde.

Das ganze soll vorerst auf einem ATmega8 laufen.

Ich weiß, etwas viel für den Anfang, aber vielleicht kann mir ja jemand 
dazu einige Tips geben.

Ich habe folgendes Codebeispiel das ich im netz gefunden habe, das in 
etwa meinen Vorstellungen ensprechen würde, jedoch muß hier eine 
Tastatur angeschlossen werden und die Menüführung funktioniert in alle 
Richtungen mit Untermenüs, was ich ja nicht benötigen würde.
1
' KONFIGURATION
2
'
3
$regfile = "m8def.dat"
4
$crystal = 3686400
5
6
' Displaytyp
7
Const Lcdrows = 2
8
Const Lcdcols = 16
9
10
Const Keyup = 8
11
Const Keydown = 2
12
Const Keyright = 6
13
Const Keyleft = 4
14
15
'Speicherbereich für Menüeinträge
16
Const Mnumaxlines = 10
17
18
' LCD Einstellungen
19
Config PortD = Output
20
Config Lcdmode = Port
21
Config Lcdbus = 4
22
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 ,
23
Config Lcdpin = Pin , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
24
Config Lcd = 16 * 2
25
Cursor Off
26
27
' VARIABLEN
28
'
29
Dim Mnuselect As Integer
30
Dim Mnuselectscount As Integer
31
Dim Mnuselectback As Integer
32
Dim Mnuselectpointer As Integer
33
Dim Mnutext(mnumaxlines) As String * Lcdcols
34
Dim Mnuselects(mnumaxlines) As Integer
35
Dim I As Integer
36
Dim N As Integer
37
Dim M As Integer
38
Dim Mnuselectold As Integer
39
Dim Keypressed As Integer
40
41
'PROGRAMM
42
'
43
Waitms 300
44
45
Mnuselect = 0
46
47
Do
48
   Select Case Mnuselect
49
      Case 0:
50
         Mnuselectback = 0
51
         Mnutext(1) = "1541 Floppy ID"
52
         Mnuselects(1) = 1
53
         Mnutext(2) = "Selbsttest"
54
         Mnuselects(2) = 2
55
         Mnuselectscount = 2
56
         Gosub Mnushow
57
      Case 1:
58
         Mnuselectback = 0
59
         Mnutext(1) = "IP-Adresse"
60
         Mnuselects(1) = 11
61
         Mnutext(2) = "DHCP"
62
         Mnuselects(2) = 12
63
         Mnutext(3) = "Mac-Adresse"
64
         Mnuselects(3) = 13
65
         Mnuselectscount = 3
66
         Gosub Mnushow
67
      Case 11:
68
         '
69
         ' Programmteil
70
         '
71
         Waitms 500
72
         Mnuselect = 1
73
      Case 12:
74
         '
75
         ' Programmteil
76
         '
77
         Waitms 500
78
         Mnuselect = 1
79
      Case 13:
80
         '
81
         ' Programmteil
82
         '
83
         Waitms 500
84
         Mnuselect = 1
85
      Case 2:
86
         Mnuselectback = 0
87
         Mnutext(1) = "Vollstaendig"
88
         Mnuselects(1) = 21
89
         Mnutext(2) = "Teilweise"
90
         Mnuselects(2) = 22
91
         Mnuselectscount = 2
92
         Gosub Mnushow
93
      Case 21:
94
         '
95
         ' Programmteil
96
         '
97
         Waitms 500
98
         Mnuselect = 2
99
      Case 22:
100
         Mnuselectback = 2
101
         Mnutext(1) = "Display"
102
         Mnuselects(1) = 221
103
         Mnutext(2) = "Schnittstellen"
104
         Mnuselects(2) = 222
105
         Mnuselectscount = 2
106
         Gosub Mnushow
107
      Case 221:
108
         '
109
         ' Programmteil
110
         '
111
         Waitms 500
112
         Mnuselect = 22
113
      Case 222:
114
         '
115
         ' Programmteil
116
         '
117
         Waitms 500
118
         Mnuselect = 22
119
      Case Else:
120
         Mnuselect = 0
121
   End Select
122
Loop
123
124
Mnushow:
125
Mnuselectold = Mnuselect
126
Mnuselectpointer = 1
127
128
While Mnuselectold = Mnuselect
129
   M = 1
130
   Cls
131
   N = Mnuselectpointer + Lcdrows
132
   Decr N
133
134
   If N > Mnuselectscount Then
135
      N = Mnuselectscount
136
   End If
137
138
   For I = Mnuselectpointer To N
139
      Locate M , 1
140
      If I = Mnuselectpointer Then
141
         Lcd "["
142
      Else
143
         Lcd " "
144
      End If
145
      Lcd Mnutext(i)
146
      Incr M
147
   Next
148
149
   Do
150
      Gosub Tstq
151
   Loop Until Keypressed > 0
152
153
   If Keypressed = Keyup Then
154
      If Mnuselectpointer > 1 Then
155
         Decr Mnuselectpointer
156
      End If
157
   End If
158
159
   If Keypressed = Keydown Then
160
      If Mnuselectpointer < Mnuselectscount Then
161
         Incr Mnuselectpointer
162
      End If
163
   End If
164
165
   If Keypressed = Keyright Then
166
      Mnuselect = Mnuselects(mnuselectpointer)
167
   End If
168
169
   If Keypressed = Keyleft Then
170
      Mnuselect = Mnuselectback
171
   End If
172
173
Wend
174
Cls
175
Return
176
177
Tstq:
178
Ddrb = &B11111111
179
Portb = &B00000000
180
Ddrc = &B00000000
181
Portc = &B11111111
182
183
Keypressed = 0
184
185
If Pinc.3 = 0 Then
186
   Keypressed = Keypressed + 10
187
End If
188
189
If Pinc.4 = 0 Then
190
   Keypressed = Keypressed + 20
191
End If
192
193
If Pinc.5 = 0 Then
194
   Keypressed = Keypressed + 30
195
End If
196
197
If Pinc.6 = 0 Then
198
   Keypressed = Keypressed + 40
199
End If
200
201
If Keypressed > 0 Then
202
   Ddrb = &B00000000
203
   Portb = &B11111111
204
   Ddrc = &B11111111
205
   Portc = &B00000000
206
207
   If Pinb.0 = 0 Then
208
      Keypressed = Keypressed + 1
209
   End If
210
211
   If Pinb.1 = 0 Then
212
      Keypressed = Keypressed + 2
213
   End If
214
215
   If Pinb.2 = 0 Then
216
      Keypressed = Keypressed + 3
217
   End If
218
219
   If Pinb.3 = 0 Then
220
      Keypressed = Keypressed + 4
221
   End If
222
223
   If Pinb.4 = 0 Then
224
      Keypressed = Keypressed + 5
225
   End If
226
227
   If Pinb.5 = 0 Then
228
      Keypressed = Keypressed + 6
229
   End If
230
231
   If Pinb.6 = 0 Then
232
      Keypressed = Keypressed + 7
233
   End If
234
235
   If Pinb.7 = 0 Then
236
      Keypressed = Keypressed + 8
237
   End If
238
239
   Waitms 250
240
End If
241
242
Return
243
End

von Gast (Gast)


Lesenswert?

Schmeiß den Code weg und lerne Programmieren.
Fang an das LCD an zu steueren und gib einen
Text aus. Dann machste das ganze mit drei Tasten
ob dein Auswahlmenue so funktioniert, wie du es haben
willst. Dann kannste dich an den Drehimpulsgeber geben.
Und schauen ob den hinbekommst. Dort mußte was auf die Zeiten
achten, damit der richtig funktioniert. Ist alles in Basic
machbar. Habe es selber für einen µC (PIC) (Mikrobasic)
hinbekommen. War auch kein problem.
Also gutest gelingen.

von Karl H. (kbuchegg)


Lesenswert?

Seh ich auch so wie mein Vorredner
Lern zuallererst einmal programmieren und schraub deine Erwartungen 
zunächst mal zurück. Nicht gleich an alles denken und sich in Details 
verlieren.

Ein Menü ist erst mal nichts anderes als ein Text, der an einer 
bestimmten Stelle ausgegeben wird und der sich verändert, wenn ein 
Eingabemedium (bei dir der Drehgeber) betätigt wird. Damit solltest du 
anfangen: In der ersten Zeile sollen deine Hauptmenüpunkte sich 
durchschalten, wenn der Drehgeber betätigt wird. Und dann geht das 
lernen los, wie man sowas vernünftig organisieren kann.

Niemand wird als Wunderwutzi geboren. Ein Menü ist für jeden eine 
Herausforderung. Vor allem wenn es möglichst universell sein soll. Aber 
Kopf hoch: Es ist auch nicht Raketentechnik. Alles ist machbar.

von Lokus P. (derschatten)


Lesenswert?

Gast wrote:
> Schmeiß den Code weg und lerne Programmieren.

Tolle Aussage.
dann ist dieses Board hier und die Hilfestellungen die hier angeboten 
werden sozusagen nur Zeitverschwendung. Willst du mir das damit 
mitteilen?

von Gast (Gast)


Lesenswert?

Du scheinst nicht zu verstehen für was ein
Forum da ist. Ich verstehe den Code und ich sage
dir, das dieses Beispiel für dich ungeeignet ist.
Um einen fertigen Code zu ändern, muß man viel
Ahnung von programmieren haben. Noch mehr, als wenn man
es selber machen würde. Und keiner wird wahrscheinlich
dafür bereit sein, diesen Code, für dich anzupassen.
Schreib selber ein Programm und dir wird geholfen, was du besser
oder anders machen sollst. Ein Forum bietet dir Hilfe, wenn
du mit deinen Gedanken nicht mehr weiter kommst. Aber keiner
nimmt dir die Arbeit ab, selber sich Gedanken darüber zu machen.
In diesem Beispiel, wird dir geholfen, wenn du bei deinem
Programm probleme hast. Nur ich seh kein Programm von dir.
Oder änderungen an Codeschnippsel. Das wirst du schon selber
machen müssen. Wenn du das nicht willst, dann such dir eine
Firma, die machen sowas gerne. Geld darf dann aber fast keine
Rolle spielen.
So genug geschrieben. Setz dich hin und lerne Programmieren.

von Lokus P. (derschatten)


Lesenswert?

Gast wrote:
> Nur ich seh kein Programm von dir.
> Oder änderungen an Codeschnippsel.

Wenn du das sehen könntest wärst du hellseher.
Den ich habe tatsächlich einiges am Code geändert wo ich dachte ich 
könnte das ganze an meine Wünsche anpassen.
Kaum zu glauben, oder?

Trotzdem danke für deinen wunderbaren, überweltigen Rat.

von Gast (Gast)


Lesenswert?

Ich seh schon du hast nichts verstanden.
Na dann mal gutest gelingen.
Vielleicht wirst du ja noch schlau daraus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.