PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleine Menuesteuerung



Andree-HB
07.01.2006, 22:53
Bin gerade wieder ein bisschen bei meinem WinampTerminal bei und dabei ist vorerste eine kleine Menuesteuerung "abgefallen"

Zur Steuerung habe ich einen kleinen Minijoystick mit zwei kleinen Potis und einem Taster aus einem PS-Pad, man braucht daher nur 3 Eingänge für 4 Richtungsfunktionen und einer Tasterfunktion. Als Anzeige habe ich ein 4x16 Display. Als Board benutze ich derzeit das MyAvr.

Man scrollt hier einfach mit Up/down durch eine beliebig erweiterbare Anzahl von Menues und kann dort dann weitere Aktionen steuern.

http://www.pixelklecks.de/pictures/menue.jpg


Ist sicherlich nicht optimal programmiert, funktioniert aber :


$regfile = "m8def.dat"
$crystal = 3686400
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
Config Lcd = 16 * 4
Initlcd
Cursor Off


Config Portd = Output 'LED o.Ä. an Port D
Config Portc = Input 'Eingänge an Port C

'Taster an Port C.5
'Poti 1 an Port C.0
'Poti 2 an Port C.1


Dim W As Word 'adc horizontal
Dim X As Word 'adc vertikal
Dim R As Bit 'rechts
Dim L As Bit 'links
Dim O As Bit 'oben
Dim U As Bit 'unten
Dim T As Bit 'taste
Dim Z As Byte 'seitenzähler



Config Timer1 = Timer , Prescale = 64 'Interrupt wird erzeugt, springt 10x pro Sekunde nach Timer_irq
On Timer1 Timer_irq
Const Timervorgabe = 53036
Enable Timer1
Enable Interrupts

Cls 'Hauptschleife für Hauptmenue
Do
Locate 1 , 1
Lcd "Waehlen sie :"
Locate 2 , 1
Lcd "(Up/down)"
Locate 3 , 1


If O = 1 Then Incr Z 'wenn Poti nach oben, erhöhe Seitenzähler
If U = 1 Then Decr Z 'wenn Poti nach unten, verringere Seitenzähler


If Z = 1 Then Gosub Menue1 'springe je nach Zählstand
If Z = 2 Then Gosub Menue2
If Z = 3 Then Gosub Menue3
If Z = 4 Then Gosub Menue4
If Z > 4 Then Z = 0 'Zähler fängt bei > Menue 4 wieder vorne an
Waitms 300
Loop
End


Timer_irq:
Timer1 = Timervorgabe

Config Adc = Single , Prescaler = Auto
Start Adc

W = Getadc(0) 'Analogwerte werden eingelesen für "Taste" oben/unten
If W > 700 Then L = 1 Else L = 0
If W < 300 Then R = 1 Else R = 0

X = Getadc(1) 'Analogwerte werden eingelesen für "Taste" links/rechts
If X > 700 Then O = 1 Else O = 0
If X < 300 Then U = 1 Else U = 0

If Pinc.5 = 0 Then T = 1 Else T = 0 'taster wird eingelesen und "T" auf dessen Zustand gesetzt
Return



Menue1: 'Hier werden die Menues angesprungen
Cls
Do
Locate 1 , 1
Lcd "Menue 1"
Locate 2 , 1
Lcd "Das erste Menue"
Loop Until O = 1 Or U = 1 'loop bis oben/unten betätigt, springe dann zurück
Return

Menue2:
Cls
Do
Locate 1 , 1
Lcd "Menue 2"
Locate 2 , 1
Lcd "Das zweite"
Loop Until O = 1 or U=1
Return

Menue3:
Cls
Do
Locate 1 , 1
Lcd "Menue 3"
Locate 2 , 1
Lcd "Noch Eines"
Loop Until O = 1 or U=1
Return

Menue4:
Cls
Do
Locate 1 , 1
Lcd "Menue 4"
Locate 2 , 1
Lcd "Und Schliesslich"
Loop Until O = 1 Or U = 1
Return

Andree-HB
08.01.2006, 00:40
Hier mal ein Beispiel für einen Menuepunkt - z.B. Volume :





Menue1: angesprungen
dim V as byte ' variable Volume

Cls
If V > 99 Then V = 50 'beim ersten Anschalten auf max. Wert 50
Do
Locate 1 , 1
Lcd "Menue 1"
Locate 2 , 1
Lcd "Volume : " ; V ; " %"
If L = 1 Then Decr V 'wenn Poti nach rechts, erhöhe Volume
If R = 1 Then Incr V 'wenn Poti nach links, verringere Volume
If V > 99 Then V = 99
If L = 1 Or R = 1 Then 'wenn R/L betätigt, dann gib Wert über RS232
Print "volume" ; V
End If
Loop Until O = 1 Or U = 1 'loop bis oben/unten betätigt, springe dann zurück
Return

heinzi
20.02.2006, 20:46
hallo andree!

ich finds super, das du dein programm freiwillig veröffentlichst! ich wollte sowas auch schonmal machen.

falls du weitere änderungen oder andere funktionen einbindest, würde sich die forumgemeinde (und besonders ich *g*) sicherlich darüber freuen, wenn du es hier reinsetzt!


gruß heinzi