Potrafi obliczyć na podstawie daty jaki jest dzień tygodnia i dużo więcej. Trzeba tylko włączyć Clock = User i zapodac dane do zmiennych _sec, _min, _hour, _day, _month i _year.
Temu służa właśnie te dwa dołączone do postu pliki
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '*********************************************************
- '* *
- '* INTEGRATING PCF8583 WITH $TIME and $DATE *
- '* *
- '* 18.01.2016 BARTek niveasoft(at)tlen.pl *
- '* *
- '* DECLARATION FILE SHOULD BE INCLUDED AFTER I2C CONFIG *
- '* *
- '* $include "user_clock_pcf8583_declarations.inc" *
- '* *
- '* Dim .... *
- '* *
- '* Do *
- '* ....... *
- '* Loop *
- '* End *
- '* *
- '* $include "user_clock_pcf8583_routines.inc" *
- '* *
- '*********************************************************
- $nocompile
- Config Clock = User
- Config Date = Dmy , Separator = /
- ' adresy układu PCF8583
- ' jeżeli noga A0 układ PCF8583 jest podłączony do GND to:
- ' adres do odczytu = &HA1
- ' adres do zapisu = &HA0
- ' jeżeli noga A0 układ PCF8583 jest podłączony do VCC to:
- ' adres do odczytu = &HA3
- ' adres do zapisu = = &HA2
- Const Pcf8583r = &HA1 'PCF address for read
- Const Pcf8583w = &HA0 'PCF address for write
- Dim Rtc_year_date As Byte , Rtc_weekdays_months As Byte , Temp_b As Byte
- Dim Pcf8583_kalendarz_baza As Byte , Pcf8583_year_old As Byte
- Sub Store_year
- I2cstart
- I2cwbyte Pcf8583w
- I2cwbyte 16
- I2cwbyte Pcf8583_kalendarz_baza
- End Sub
- Sub Read_year
- I2cstart
- I2cwbyte Pcf8583w
- I2cwbyte 16
- I2crbyte Pcf8583_kalendarz_baza , Nack
- I2cstop
- End Sub
- Call Read_year
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '*********************************************************
- '* *
- '* INTEGRATING PCF8583 WITH $TIME and $DATE *
- '* *
- '* 18.01.2016 BARTek niveasoft(at)tlen.pl *
- '* *
- '* DECLARATION FILE SHOULD BE INCLUDED AFTER I2C CONFIG *
- '* *
- '* $include "user_clock_pcf8583_declarations.inc" *
- '* *
- '* Dim .... *
- '* *
- '* Do *
- '* ....... *
- '* Loop *
- '* End *
- '* *
- '* $include "user_clock_pcf8583_routines.inc" *
- '* *
- '*********************************************************
- $nocompile
- Getdatetime:
- 'called when date or time is read
- I2cstart
- If Err = 0 Then
- I2cwbyte Pcf8583w
- If Err = 0 Then
- I2cwbyte 2
- If Err = 0 Then
- I2cstart
- If Err = 0 Then
- I2cwbyte Pcf8583r
- I2crbyte _sec , Ack 'sec
- I2crbyte _min , Ack 'min
- I2crbyte _hour , Ack 'hour
- I2crbyte Rtc_year_date , Ack 'date
- I2crbyte Rtc_weekdays_months , Nack 'date
- _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
- Temp_b = Rtc_year_date ' rok
- Shift Temp_b , Right , 6
- Temp_b = Makedec(temp_b)
- _year = Pcf8583_kalendarz_baza + Temp_b ' baza + wartość kalendarza czteroletniego
- If Pcf8583_year_old <> Temp_b Then ' jeżeli zmienił się rok
- If Temp_b = 0 And Pcf8583_year_old = 3 Then ' jeżeli skończył się kalendarz czteroletni
- Pcf8583_kalendarz_baza = Pcf8583_kalendarz_baza + 4 ' zmień bazę kalendarza
- End If
- Pcf8583_year_old = Temp_b 'dopiero tu może dostać nowa wartość
- 'zapisz dane o aktualnym roku w układzie PCF8583
- Call Store_year
- End If
- Temp_b = Rtc_year_date And &B0011_1111 ' dzień
- _day = Makedec(temp_b)
- Temp_b = Rtc_weekdays_months And &B0001_1111 ' miesiąc
- _month = Makedec(temp_b)
- End If
- End If
- End If
- I2cstop
- End If
- Return
- Setdate:
- Rtc_year_date = Makebcd(_day) 'w bajcie zapisz dzień w kodzie BCD
- Temp_b = _year Mod 4
- Temp_b = Makebcd(temp_b)
- Pcf8583_year_old = Temp_b 'zapamietaj bo przyda sie kiedy rok w PCF się zmieni
- Pcf8583_kalendarz_baza = _year - Temp_b
- Shift Temp_b , Left , 6
- Rtc_year_date = Rtc_year_date Or Temp_b
- Rtc_weekdays_months = Makebcd(_month) ' dzień tygodnia i miesiąc
- Temp_b = Dayofweek()
- Temp_b = Makebcd(temp_b)
- Shift Temp_b , Left , 5
- Rtc_weekdays_months = Rtc_weekdays_months Or Temp_b
- I2cstart
- I2cwbyte Pcf8583w
- I2cwbyte 5
- I2cwbyte Rtc_year_date
- I2cwbyte Rtc_weekdays_months
- Call Store_year
- I2cstop
- Return
- Settime:
- _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
- I2cstart '
- I2cwbyte Pcf8583w
- I2cwbyte 2
- I2cwbyte _sec
- I2cwbyte _min '
- I2cwbyte _hour
- I2cstop
- Return
Przykład jak można tego użyć nie pisząc od nowa całej obsługi PCF8583
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m32adef.dat"
- $crystal = 8000000
- $hwstack = 64
- $swstack = 64
- $framesize = 64
- Config Submode = New
- ' I2C config
- $lib "i2c_twi.lbx"
- Config Scl = Portc.0
- Config Sda = Portc.1
- I2cinit
- Config Twi = 100000
- $include "user_clock_pcf8583_declarations.inc"
- Dim Day_nr As Byte , Day_str As String * 15
- Do
- Lcd Time$ 'odczytuje czas - uzywac co jakiś czas a nie wkółko w petli
- Locate 1 , 11 : Lcd Date$
- Day_nr = Dayofweek() 'oblicz który to dzień tygodnia
- Day_str = Lookupstr(day_nr , Dni_tygodnia) 'pobierz napis z tabeli
- Locate 2 , 1 : Lcd Day_str 'wyswietl napis w drugiej linii
- Waitms 500
- Loop
- End
- $include "user_clock_pcf8583_routines.inc"
- Dni_tygodnia:
- Data "Poniedzia{001}ek" , "Wtorek" , "Sroda" , "Czwartek" , "Pi{004}tek" , "Sobota" , "Niedziela"
Chodzi o to że Bascom, kiedy używamy funkcji $Time lub $Date to automatycznie użyje Subów Getdatetime Setdate lub Settime
Tak więc by ustawić zegarek czasem wystarczy napisać $Time = 23:50:00 i ..gotowe
Można osobno ustawić sobie _min = 40 _hour = 2 i zrobić Gosub Settime i ...gotowe!