mam taki program zegara ds1307 trochę już pokombinowałem
tylko obsługa zmiany zapisanie do ds1307 mi nie działa ,
założyłem że
pierwszy klawisz s1 wejście w menu ustawień kolejne przyciśnięcie s1 ma zmieniać wartość x od 0 do 5 wyświetlać kolejno "godzina minuta sekunda rok miesiac dzien" a klawiszem s3 zmieniać na razie tylko w górę wartości , problem z tym że ze jak wejdę do menu "_ustaw" to kolejno pozostają śmieci po liczbach, w sumie to może mały problem tylko jak jeszcze te wartości zapisywać do ds1307
tylko obsługa zmiany zapisanie do ds1307 mi nie działa ,
założyłem że
pierwszy klawisz s1 wejście w menu ustawień kolejne przyciśnięcie s1 ma zmieniać wartość x od 0 do 5 wyświetlać kolejno "godzina minuta sekunda rok miesiac dzien" a klawiszem s3 zmieniać na razie tylko w górę wartości , problem z tym że ze jak wejdę do menu "_ustaw" to kolejno pozostają śmieci po liczbach, w sumie to może mały problem tylko jak jeszcze te wartości zapisywać do ds1307
Code:
$regfile = "m8def.DAT"
$crystal = 12000000
$lib "I2C.LBX"
$lib "Ds1307clock.lib"
Config Lcdpin = Pind , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.5
Config Lcd = 16 * 2
Config Sda = Portc.4
Config Scl = Portc.5
Config 1wire = Portb.0
'Config Portb.0 = Input
Config Pinc.3 = Input
Config Pinc.2 = Input
Config Pinc.1 = Input
Config Pinc.6 = Input
Config Clock = User
Config Date = Dmy , Separator = .
Config Int1 = Low Level
Enable Interrupts
Const Ds1307w = &HD0
Const Ds1307r = &HD1
Dim Temp1 As Integer , Ss1 As String * 6
Dim Temp2 As Integer , Ss2 As String * 6
Dim Tzad As Integer , Tzadana As String * 6
Dim Tzad1 As Integer , Tzadana1 As String * 6
Dim Tzad2 As Integer , Tzadana2 As String * 6
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim T1 As Integer
Dim T2 As Integer
Dim W As Byte
Dim B As Byte 'Dane temperatura
'Dim Kod As Integer 'Dane pilota RC5
Dim Weekday As Byte ' Dane zegara
S1 Alias Pinc.3
S2 Alias Pinc.2
S3 Alias Pinc.1
Set S1
Set S2
Set S3
Dim Sekunda As Integer
Dim Godzina As Integer
Dim Minuta As Integer
Dim Dzien As Integer
Dim Rok As Integer
Dim Miesiac As Integer
Dim X As Integer
Deflcdchar 0 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32 'znak stopnia Celsjusza
Cursor Off
Declare Sub Poczatek
Declare Sub Getdatetime
Declare Sub Setdate
Declare Sub Settime
Declare Sub _ustaw
Declare Sub _start
_start:
Cls : Cursor Off
W = 1wirecount()
Lcd "Ilosc czujnikow:" 'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 500
Locate 2 , 8
Lcd W
Wait 2
Cls 'Znajdź pierwszy czujnik podpięty do portu
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext() 'Znajdź kolejny czujnik podpięty do portu
If Dsid1(8) = Crc8(dsid1(1) , 7) Then 'ta opcja pojawia się tylko przy włączaniu urządzenia
Locate 1 , 1
Lcd "CRC OK Czujnik 1 ID"
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid1(b))
Next
End If
Waitms 900
Cls
If Dsid2(8) = Crc8(dsid2(1) , 7) Then 'ta opcja pojawia się tylko przy włączaniu urządzenia
Locate 1 , 1
Lcd "CRC OK Czujnik 2 ID"
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
Waitms 900
Cls
Cls
Cursor Off
'****************************************************************
' PROGRAM GŁÓWNY
'****************************************************************
Poczatek:
Cls
Do
1wreset
1wwrite &H55
1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika
1wwrite &HBE
Temp1 = 1wread(2)
1wreset
1wwrite &H55
1wverify Dsid2(1) 'wysylam adres drugiego czujnika
1wwrite &HBE
Temp2 = 1wread(2)
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
Temp1 = Temp1 * 10
Temp1 = Temp1 / 16
T1 = Temp1 + 5
Ss1 = Str(t1)
Ss1 = Format(ss1 , "0.0")
Temp2 = Temp2 * 10
Temp2 = Temp2 / 16
T2 = Temp2 + 5
Ss2 = Str(t2)
Ss2 = Format(ss2 , "0.0")
Locate 1 , 1 : Lcd Time$
Locate 1 , 10 : Lcd Ss1 ; Chr(0) ; "C"
Locate 2 , 1 : Lcd Date$
Locate 2 , 10 : Lcd Ss2 ; Chr(0) ; "C"
If S1 = 0 Then Gosub _ustaw
Loop
Getdatetime:
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Ack
I2crbyte Weekday , Ack
I2crbyte _day , Ack
I2crbyte _month , Ack
I2crbyte _year , Nack
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 4 '
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
Return
Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop
Return
_ustaw:
Cls
Locate 2 , 11 : Lcd "Ustaw"
Godzina = Makebcd(_hour)
Minuta = Makebcd(_min)
Sekunda = Makebcd(_sec)
Rok = Makebcd(_year)
Miesiac = Makebcd(_month)
Dzien = Makebcd(_day)
Do
If X = 0 Then
Locate 2 , 1 : Lcd "ustaw Godzina"
Locate 1 , 1 : Lcd Godzina
If S3 = 0 Then
Incr Godzina
If Godzina > 23 Then Godzina = 0
Waitms 100
End If
End If
If X = 1 Then
Locate 2 , 1 : Lcd "ustaw Minuta"
Locate 1 , 1 : Lcd Minuta
If S3 = 0 Then
Incr Minuta
If Minuta > 59 Then Minuta = 0
Waitms 100
End If
End If
If X = 2 Then
Locate 2 , 1 : Lcd "ustaw Sekunda"
Locate 1 , 1 : Lcd Sekunda
If S3 = 0 Then
Incr Sekunda
If Sekunda > 59 Then Sekunda = 0
Waitms 100
End If
End If
If X = 3 Then
Locate 2 , 1 : Lcd "ustaw Rok"
Locate 1 , 1 : Lcd Rok
If S3 = 0 Then
Incr Rok
If Rok > 99 Then Rok = 0
Waitms 100
End If
End If
If X = 4 Then
Locate 2 , 1 : Lcd "ustaw Miesiac"
Locate 1 , 1 : Lcd Miesiac
If S3 = 0 Then
Incr Miesiac
If Miesiac > 12 Then Miesiac = 1
Waitms 100
End If
End If
If X = 5 Then
Locate 2 , 1 : Lcd "ustaw Dzien"
Locate 1 , 1 : Lcd Dzien
If S3 = 0 Then
Incr Dzien
If Dzien > 31 Then Dzien = 1
Waitms 100
End If
End If
Waitms 50
If S1 = 0 Then
Incr X
If X > 5 Then X = 0
Waitms 200
Cls
End If
If S2 = 0 Then Gosub _start
Loop