-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathRX8025_RTC.cpp
130 lines (111 loc) · 3.05 KB
/
RX8025_RTC.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "RX8025_RTC.h"
#include <Wire.h>
#include <TimeLib.h>
/********************************************************************************/
RX8025_RTC::RX8025_RTC(){
}
bool RX8025_RTC::write(tmElements_t tm){
_year = tmYearToCalendar(tm.Year);
_month = tm.Month;
_day = tm.Day;
_hour = tm.Hour;
_minute = tm.Minute;
_second = tm.Second;
return _begin();
}
tmElements_t RX8025_RTC::read(){
tmElements_t tm;
if(_read()){
tm.Year = CalendarYrToTm(_year);
tm.Month = _month;
tm.Day = _day;
tm.Hour = _hour;
tm.Minute = _minute;
tm.Second = _second;
return tm;
}
}
/********************************************************************************/
bool RX8025_RTC::_begin(){
byte n;
Wire.beginTransmission(RTC8052_I2CADDR);
Wire.write(0xE0);
Wire.write(RTC8052_CFG_PULSE_ITR_SEC); //Control 1
Wire.write(0x00); //Control 2
Wire.endTransmission();
delay(1);
Wire.beginTransmission(RTC8052_I2CADDR);
Wire.write(0x00);
n = _toBCD(_second);
Wire.write(n); //0:Seconds
n = _toBCD(_minute);
Wire.write(n); //1:Minutes
n = _toBCD(_hour);
Wire.write(n); //2:Hours
Wire.write(0x00); //3:Weekdays
n = _toBCD(_day);
Wire.write(n); //4:Days
n = _toBCD(_month);
Wire.write(n); //5:Months
n = _toBCD(_year);
Wire.write(n); //6:Years
Wire.endTransmission();
delay(1);
Wire.beginTransmission(RTC8052_I2CADDR);
Wire.write(0x8E);
Wire.write(0x00); //8:Alarm_W ; Minute
Wire.write(0x00); //9:Alarm_W ; Hour
Wire.write(0x00); //A:Alarm_W ; Weekday
Wire.write(0x00); //B:Alarm_D ; Minute
Wire.write(0x00); //C:Alarm_D ; Hour
Wire.endTransmission();
delay(1);
return true;
}
bool RX8025_RTC::_read(){
byte years,months,days,hours,minutes,seconds;
Wire.requestFrom(RTC8052_I2CADDR, 16);//RX8025一次给出16个字节,8个是闹钟 定时之类的,不管了,剩下的才是时间
//8个全跳过去
Wire.read();Wire.read();Wire.read();Wire.read();Wire.read();Wire.read();Wire.read();Wire.read();
//开始读时间
Wire.read();
seconds = Wire.read();
minutes = Wire.read();
hours = Wire.read();
/**
Serial.print("debug-->");
Serial.print(hours >> 4);
Serial.print(hours & 0x0F);
Serial.print(":");
Serial.print(minutes >> 4);
Serial.print(minutes & 0x0F);
Serial.print(":");
Serial.print(seconds >> 4);
Serial.print(seconds & 0x0F);
Serial.println("");
**/
Wire.read();
days = Wire.read();
months = Wire.read();
years = Wire.read();
_year = _fromBCD(years) + 2000;
_month = _fromBCD(months);
_day = _fromBCD(days);
_hour = _fromBCD(hours);
_minute = _fromBCD(minutes);
_second = _fromBCD(seconds);
return true;
}
/********************************************************************************/
byte RX8025_RTC::_toBCD(int i){
byte n0,n1;
n0 = i % 10;
n1 = (i /10) % 10;
return (n1 << 4) | n0;
}
int RX8025_RTC::_fromBCD(byte bcd){
int i0,i1;
i0 = bcd & 0x0F;
i1 = (bcd >> 4) * 10;
return i0 + i1;
}