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
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