Witam. Znalazłem ten kod na elektrodzie i zmodyfikowałem go trochę do własnych potrzeb. Zegarek mierzy poprawnie czas z PCF 8583, ale jest problem z odczytem daty tj dzień, miesiąc, rok, dzień tygodnia. Nie wiem jak prawidłowo ustawić bity w programie. Drugą sprawą jest sposób nastawiania zegarka, otóż chciałbym w przyszłości dopisać program do budzika, a nie chce mieć 100 przycisków. Proszę o poradę.
Poniżej kod:
Poprawiłem tytuł:
https://www.elektroda.pl/rtvforum/topic1015361.html
[c_p]
Poniżej kod:
$regfile = "m8def.dat"
$crystal = 8000000
Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.6 = Input
Config Pind.7 = Input
Config Lcd = 20 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config 1wire = Portb.7 'Złącze do obsługi DS18b20
Config Sda = Portc.1
Config Scl = Portc.0
Config I2cdelay = 10
I2cinit
Set Portd.0
Set Portd.1
Set Portd.6
Set Portd.7
S1 Alias Portd.0
S2 Alias Portd.1
S3 Alias Portd.6
S4 Alias Portd.7
Declare Sub Ustawh
Declare Sub Ustawm
Declare Sub Ustawd
Declare Sub Ustawmon
Config Debounce = 20
Deflcdchar 0 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32 'Znak stopnia Celsjusza
Dim I1 As Integer , T1 As String * 6
Dim I2 As Integer , T2 As String * 6
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim M As Byte
Dim S As Byte
Dim H As Byte
Dim D As Byte
Dim Mon As Byte
Dim Y As Byte
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
Cursor Off Noblink
Cls
Do
'1wire
1wreset
1wwrite &H55
1wverify Dsid1(1)
1wwrite &HBE
I1 = 1wread(2)
'---------------------------------
1wreset
1wwrite &H55
1wverify Dsid2(1)
1wwrite &HBE
I2 = 1wread(2)
'---------------------------------
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750 ' czekaj na konwersję temperatury
I1 = I1 * 10
I1 = I1 / 16
T1 = Str(i1)
T1 = Format(t1 , " 0.0")
I2 = I2 * 10
I2 = I2 / 16
T2 = Str(i2)
T2 = Format(t2 , " 0.0")
'i2c
I2cstart
I2cwbyte 160
I2cwbyte 0
I2cwbyte 8 ' włącza maskowanie roku i dnia tygodnia
I2cstop
I2cstart
I2cwbyte 160
I2cwbyte 2
I2cstart
I2cwbyte 161
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Ack
I2crbyte D , Ack
I2crbyte Mon , Ack
I2crbyte Y , Ack
I2cstop
H = Makedec(h) : M = Makedec(m) : S = Makedec(s) : D = Makedec(d) : Mon = Makedec(mon) : Y = Makedec(y)
If H < 10 Then
Lcd "0" ; H ; ":"
Else
Lcd H ; ":"
End If
Locate 1 , 4
If M < 10 Then
Lcd "0" ; M ; ":"
Else
Lcd M ; ":"
End If
Locate 1 , 7
If S < 10 Then
Lcd "0" ; S ;
Else
Lcd ; S ;
End If
Locate 1 , 11
Lcd ; T1 ; Chr(0) ; "C"
Locate 2 , 1
Lcd Bcd(d) ; "/" ; Bcd(mon) ; "/" ; Bcd(y)
Locate 2 , 11
Lcd ; T2 ; Chr(0) ; "C"
Home
Waitms 180
Debounce Pind.0 , 0 , Ustawh , Sub
Debounce Pind.1 , 0 , Ustawm , Sub
Debounce Pind.6 , 0 , Ustawd , Sub
Debounce Pind.7 , 0 , Ustawmon , Sub
Loop
End 'Koniec programu
Ustawh: ' Ustaw godzinę
S = 0
H = H + 1
If H > 23 Then
H = 0
End If
M = Makebcd(m)
H = Makebcd(h)
I2cstart
I2cwbyte 160
I2cwbyte 2
I2cwbyte S
I2cwbyte M
I2cwbyte H
I2cstop
Return
Ustawm: ' Ustaw minuty
S = 0
M = M + 1
If M > 59 Then
M = 0
End If
M = Makebcd(m)
I2cstart
I2cwbyte 160
I2cwbyte 2
I2cwbyte S
I2cwbyte M
I2cstop
Return
Ustawd:
D = D + 1
D = Makebcd(m)
I2cstart
I2cwbyte 160
I2cwbyte 3
I2cwbyte D
I2cwbyte Mon
I2cstop
Return
Ustawmon:
Mon = Mon + 1
Return
Poprawiłem tytuł:
https://www.elektroda.pl/rtvforum/topic1015361.html
[c_p]
