nettes programmchen, ich habe ja die DS1307 Uhr und ein LCD Display und ein Menu muss man ja auch programmieren, kurz hier ist mein code ist aber noch nicht fertig:
Code: Alles auswählen
$regfile = "m8def.dat"
$crystal = 12000000
$lib "mcsbyteint.lbx"
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portb.5 , Rs = Portb.4
Config Lcdbus = 4
Config Timer1 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64
Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 64
Config Sda = Portc.4
Config Scl = Portc.5
Const Ds1307w = &HD0
Const Ds1307r = &HD1
Config Clock = User
Config Date = Dmy , Separator = .
Config Pinb.0 = Input
Config Pind.7 = Input
Config Pind.6 = Input
Config Pind.5 = Input
Portb.0 = 1
Portd.7 = 1
Portd.6 = 1
Portd.5 = 1
Deflcdchar 0 , 4 , 14 , 21 , 31 , 10 , 14 , 21 , 32
Deflcdchar 1 , 32 , 4 , 14 , 21 , 4 , 4 , 4 , 32
Dim R As Byte
Dim G As Byte
Dim B As Byte
Dim Mnuselect As Integer
Dim Mnuselectscount As Integer
Dim Mnuselectback As Integer
Dim Mnuselectpointer As Integer
Dim Mnutext(8) As String * 8
Dim Mnuselects(8) As Integer
Dim I As Integer
Dim N As Integer
Dim M As Byte
Dim O As Byte
Dim Mnuselectold As Integer
Mnuselect = 0
Dim X As Byte
Dim X1 As Integer
Dim X2 As Integer
Dim X3 As Integer
Dim X4 As Integer
Dim X5 As Integer
Dim X6 As Integer
Dim A As Byte
Dim A1 As Integer
Dim A2 As Integer
Dim A3 As Integer
Dim A4 As Integer
Dim A5 As Integer
Dim A6 As Integer
Dim B1 As Integer
Dim B2 As Integer
Dim B3 As Integer
Dim B4 As Integer
Dim B5 As Integer
Dim B6 As Integer
Enable Timer1
Enable Timer2
Enable Interrupts
Cls
Cursor Off
Locate 1 , 1
Lcd Chr(0) ; "AQUACOM"
Locate 2 , 1
Lcd " Hello! "
Waitms 2000
Cls
Do
Select Case Mnuselect
Case 0:
' Hauptmenue
Mnuselectback = 0
Mnutext(1) = "Port 1"
Mnuselects(1) = 1
Mnutext(2) = "Port 2"
Mnuselects(2) = 2
Mnutext(3) = "Port 3"
Mnuselects(3) = 3
Mnutext(4) = "Uhrzeit"
Mnuselects(4) = 4
Mnuselectscount = 4
Gosub Mnushow
Case 1:
' Untermenü "Port 1"
Mnuselectback = 0
Mnutext(1) = "1 Ein"
Mnuselects(1) = 11
Mnutext(2) = "2 Aus"
Mnuselects(2) = 12
Mnutext(3) = "3 Ein"
Mnuselects(3) = 13
Mnutext(4) = "4 Aus"
Mnuselects(4) = 14
Mnutext(5) = "Dimm/t"
Mnuselects(5) = 15
Mnuselectscount = 5
Gosub Mnushow
Case 2:
' Untermenü "Port 2"
Mnuselectback = 0
Mnutext(1) = "1 Ein"
Mnuselects(1) = 21
Mnutext(2) = "2 Aus"
Mnuselects(2) = 22
Mnutext(3) = "3 Ein"
Mnuselects(3) = 23
Mnutext(4) = "4 Aus"
Mnuselects(4) = 34
Mnutext(5) = "Dimm/t"
Mnuselects(5) = 25
Mnuselectscount = 5
Gosub Mnushow
Case 3:
' Untermenü "Port 3"
Mnuselectback = 0
Mnutext(1) = "1 Ein"
Mnuselects(1) = 31
Mnutext(2) = "2 Aus"
Mnuselects(2) = 32
Mnutext(3) = "3 Ein"
Mnuselects(3) = 33
Mnutext(4) = "4 Aus"
Mnuselects(4) = 34
Mnutext(5) = "Dimm/t"
Mnuselects(5) = 35
Mnuselectscount = 5
Gosub Mnushow
Case 4:
' Untermenü "Uhrzeit"
I2cstart ' Start
I2cwbyte Ds1307w ' DS1307 schreiben
I2cwbyte 0 ' DS1307 Adresszeiger auf 0 stellen
I2cstart ' Start
I2cwbyte Ds1307r ' DS1307 lesen (ab vorher eingestellter Adresse 0)
I2crbyte _sec , Ack ' Sekunden
I2crbyte _min , Ack ' Minuten
I2crbyte _hour , Ack ' Stunden
I2cstop
X5 = Makedec(_sec) : X3 = Makedec(_min) : X1 = Makedec(_hour)
Gosub Uhrzeit
Case 11:
Gosub Einstell
Case 12:
Gosub Einstell
Case 13:
Gosub Einstell
Case 14:
Gosub Einstell
Case Else:
' Falls der Mnuselec mal querläuft, wird wieder ins
' Hauptmenü gesprungen.
Mnuselect = 0
End Select
Loop
Einstell:
' Wenn dieser Punkt angesprungen wird, verlangt das System eine Eingabe.
' Alle weiteren Aktionen, sofern nicht durch Interrupts erzeugt, werden
' nicht weiter verarbeitet.
' Das alte Mnuselect wird gesichert
Mnuselectold = Mnuselect
' Der Zeiger wird auf den ersten Menüeintrag gestellt.
Mnuselectpointer = 1
M = 1
' So lange das Menue nicht geaendert wurde, wird dies immer fortgesetzt.
While Mnuselectold = Mnuselect
' Zuerst einmal muss nun auf dem Display etwas angezeigt werden.
' Dies ist der Zaehler für die anzuzeigende Zeile
Sprung1:
Cls
' Displayzeilen minus 1
N = Mnuselectpointer + 1
Decr N
' Mehr als die verfuegbaren Menuepunkte können nicht angezeigt werden.
If N > Mnuselectscount Then
N = Mnuselectscount
End If
' Anzeige der Zeilen
For I = Mnuselectpointer To N
Locate 1 , 1
Lcd A1 ; A2 ; ":" ; A3 ; A4 ; ":" ; A5 ; A6
Select Case M
Case 1:
Locate 2 , 1 : Lcd Chr(1)
Case 2:
Locate 2 , 2 : Lcd Chr(1)
Case 3:
Locate 2 , 4 : Lcd Chr(1)
Case 4:
Locate 2 , 5 : Lcd Chr(1)
Case 5:
Locate 2 , 7 : Lcd Chr(1)
Case 6:
Locate 2 , 8 : Lcd Chr(1)
End Select
Next
Waitms 250
' hier werden nun die Menuetasten ausgewertet.
' Aktion Taste nach oben
If Pind.7 = 0 Then
Select Case M
Case 1:
A1 = A1 + 1
If A1 > 2 Then A1 = 0
Case 2:
A2 = A2 + 1
If A2 > 3 Then A2 = 0
Case 3:
A3 = A3 + 1
If A3 > 5 Then A3 = 0
Case 4:
A4 = A4 + 1
If A4 > 9 Then A4 = 0
Case 5:
A5 = A5 + 1
If A5 > 5 Then A5 = 0
Case 6:
A6 = A6 + 1
If A6 > 9 Then A6 = 0
End Select
End If
' Aktion Taste nach unten
If Pinb.0 = 0 Then
Select Case M
Case 1:
A1 = A1 - 1
If A1 < 0 Then A1 = 2
Case 2:
A2 = A2 - 1
If A2 < 0 Then A2 = 3
Case 3:
A3 = A3 - 1
If A3 < 0 Then A3 = 5
Case 4:
A4 = A4 - 1
If A4 < 0 Then A4 = 9
Case 5:
A5 = A5 - 1
If A5 < 0 Then A5 = 5
Case 6:
A6 = A6 - 1
If A6 < 0 Then A6 = 9
End Select
End If
' Aktion Taste vor
If Pind.5 = 0 Then
M = M + 1
If M > 6 Then
Mnuselect = 0
End If
Goto Sprung1
End If
' Aktion Taste zurueck
If Pind.6 = 0 Then
Mnuselect = 1
End If
Wend
Cls
' Es wird wieder ins Hauptprogramm zurueck gesprungen.
Return
' hier startet nun die anzeigeroutine fuer das Display
Mnushow:
' Wenn dieser Punkt angesprungen wird, verlangt das System eine Eingabe.
' Alle weiteren Aktionen, sofern nicht durch Interrupts erzeugt, werden
' nicht weiter verarbeitet.
' Das alte Mnuselect wird gesichert
Mnuselectold = Mnuselect
' Der Zeiger wird auf den ersten Menüeintrag gestellt.
Mnuselectpointer = 1
' So lange das Menue nicht geaendert wurde, wird dies immer fortgesetzt.
While Mnuselectold = Mnuselect
' Zuerst einmal muss nun auf dem Display etwas angezeigt werden.
' Dies ist der Zaehler für die anzuzeigende Zeile
Cls
' Displayzeilen minus 1
N = Mnuselectpointer + 1
Decr N
' Mehr als die verfuegbaren Menuepunkte können nicht angezeigt werden.
If N > Mnuselectscount Then
N = Mnuselectscount
End If
' Anzeige der Zeilen
For I = Mnuselectpointer To N
Locate 1 , 1
Lcd Mnutext(i)
Locate 2 , 1 : Lcd Time$
Next
Waitms 250
' hier werden nun die Menuetasten ausgewertet.
' Aktion Taste nach oben
If Pind.7 = 0 Then
' Nur wenn das Menü noch nicht oben ist.
If Mnuselectpointer > 1 Then
Decr Mnuselectpointer
End If
End If
' Aktion Taste nach unten
If Pinb.0 = 0 Then
' Nur wenn das Menü noch nicht unten ist
If Mnuselectpointer < Mnuselectscount Then
Incr Mnuselectpointer
End If
End If
' Aktion Taste vor
If Pind.5 = 0 Then
Mnuselect = Mnuselects(mnuselectpointer)
End If
' Aktion Taste zurueck
If Pind.6 = 0 Then
Mnuselect = Mnuselectback
End If
Wend
Cls
' Es wird wieder ins Hauptprogramm zurueck gesprungen.
Return
Uhrzeit:
Mnuselect = 0
Mnuselectold = Mnuselect
Mnuselectpointer = 1
M = 1
While Mnuselectold = Mnuselect
Sprung2:
Cls
N = Mnuselectpointer + 1
Decr N
If N > Mnuselectscount Then
N = Mnuselectscount
End If
For I = Mnuselectpointer To N
Locate 1 , 1
Lcd X1 ; X2 ; ":" ; X3 ; A4 ; ":" ; X5 ; X6
Select Case M
Case 1:
Locate 2 , 1 : Lcd Chr(1)
Case 2:
Locate 2 , 2 : Lcd Chr(1)
Case 3:
Locate 2 , 4 : Lcd Chr(1)
Case 4:
Locate 2 , 5 : Lcd Chr(1)
Case 5:
Locate 2 , 7 : Lcd Chr(1)
Case 6:
Locate 2 , 8 : Lcd Chr(1)
End Select
Next
Waitms 250
If Pind.7 = 0 Then
Select Case M
Case 1:
X1 = X1 + 1
If X1 > 2 Then X1 = 0
Case 2:
X2 = X2 + 1
If X2 > 3 Then X2 = 0
Case 3:
X3 = X3 + 1
If X3 > 5 Then X3 = 0
Case 4:
X4 = X4 + 1
If X4 > 9 Then X4 = 0
Case 5:
X5 = X5 + 1
If X5 > 5 Then X5 = 0
Case 6:
X6 = X6 + 1
If X6 > 9 Then X6 = 0
End Select
End If
If Pinb.0 = 0 Then
Select Case M
Case 1:
X1 = X1 - 1
If X1 < 0 Then X1 = 2
Case 2:
X2 = X2 - 1
If X2 < 0 Then X2 = 3
Case 3:
X3 = X3 - 1
If X3 < 0 Then X3 = 5
Case 4:
X4 = X4 - 1
If X4 < 0 Then X4 = 9
Case 5:
X5 = X5 - 1
If X5 < 0 Then X5 = 5
Case 6:
X6 = X6 - 1
If X6 < 0 Then X6 = 9
End Select
End If
If Pind.5 = 0 Then
M = M + 1
If M > 6 Then
X = 10 * X5
X = X + X6
_sec = Makebcd(x)
X = 10 * X3
X = X + X4
_min = Makebcd(x)
X = 10 * X1
X = X + X2
_hour = Makebcd(x)
I2cstart ' Start
I2cwbyte Ds1307w ' DS1307 schreiben
I2cwbyte 0 ' DS1307 Adresszeiger auf 0 stellen
I2cwbyte _sec ' Sekunden schreiben
I2cwbyte _min ' Minuten schreiben
I2cwbyte _hour ' Stunden schreiben
I2cstop
Gosub Mnushow
End If
Goto Sprung2
End If
If Pind.6 = 0 Then
Mnuselect = 1
End If
Wend
Cls
Return
Dim Weekday As Byte
Getdatetime:
I2cstart ' Start
I2cwbyte Ds1307w ' DS1307 schreiben
I2cwbyte 0 ' DS1307 Adresszeiger auf 0 stellen
I2cstart ' Start
I2cwbyte Ds1307r ' DS1307 lesen (ab vorher eingestellter Adresse 0)
I2crbyte _sec , Ack ' Sekunden
I2crbyte _min , Ack ' Minuten
I2crbyte _hour , Ack ' Stunden
I2crbyte Weekday , Ack ' Wochentag (in Dummy gelesen da von date$/time$ nicht genutzt)
I2crbyte _day , Ack ' Tag
I2crbyte _month , Ack ' Monat
I2crbyte _year , Nack ' Jahr
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return