watch

Dependents:   Xadow_Watch_OLED Seeed_Arch_GPRS_V2_Humidty_Alert

Committer:
loovee
Date:
Tue Apr 01 07:01:08 2014 +0000
Revision:
0:f4f9b627adf9
watch

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loovee 0:f4f9b627adf9 1
loovee 0:f4f9b627adf9 2 #include "DS1337.h"
loovee 0:f4f9b627adf9 3
loovee 0:f4f9b627adf9 4
loovee 0:f4f9b627adf9 5 // NOTE: To keep the math from getting even more lengthy/annoying than it already is, the following constraints are imposed:
loovee 0:f4f9b627adf9 6 // 1) All times are in 24-hour format (military time)
loovee 0:f4f9b627adf9 7 // 2) DayOfWeek field is not used internally or checked for validity. Alarm functions may optionally set alarms repeating on DayOfWeek, but this feature has not been tested yet.
loovee 0:f4f9b627adf9 8 // 3) This library's buffer stores all times in raw BCD format, just as it is sent from the RTC.
loovee 0:f4f9b627adf9 9 // It is not converted to/from 'real' (binary) values until needed via get...() and set...() functions.
loovee 0:f4f9b627adf9 10 // In other words, don't go hacking around and reading from the rtc_bcd[] buffer directly, unless you want the raw BCD results.
loovee 0:f4f9b627adf9 11
loovee 0:f4f9b627adf9 12
loovee 0:f4f9b627adf9 13 // Cumulative number of days elapsed at the start of each month, assuming a normal (non-leap) year.
loovee 0:f4f9b627adf9 14 unsigned int monthdays[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
loovee 0:f4f9b627adf9 15
loovee 0:f4f9b627adf9 16
loovee 0:f4f9b627adf9 17 extern I2C i2c;
loovee 0:f4f9b627adf9 18
loovee 0:f4f9b627adf9 19 unsigned char DS1337::getRegister(unsigned char registerNumber)
loovee 0:f4f9b627adf9 20 {
loovee 0:f4f9b627adf9 21 uint8_t val = registerNumber;
loovee 0:f4f9b627adf9 22
loovee 0:f4f9b627adf9 23 i2c.write(DS1337_CTRL_ID,(char *)&val,1);
loovee 0:f4f9b627adf9 24 i2c.stop();
loovee 0:f4f9b627adf9 25 i2c.read(DS1337_CTRL_ID, (char *)&val, 1);
loovee 0:f4f9b627adf9 26 return val;
loovee 0:f4f9b627adf9 27 }
loovee 0:f4f9b627adf9 28
loovee 0:f4f9b627adf9 29 void DS1337::setRegister(unsigned char registerNumber, unsigned char value)
loovee 0:f4f9b627adf9 30 {
loovee 0:f4f9b627adf9 31 uint8_t val[2];
loovee 0:f4f9b627adf9 32 val[0] = registerNumber;
loovee 0:f4f9b627adf9 33 val[1] = value;
loovee 0:f4f9b627adf9 34 i2c.write(DS1337_CTRL_ID, (char *)val, 2);
loovee 0:f4f9b627adf9 35 }
loovee 0:f4f9b627adf9 36
loovee 0:f4f9b627adf9 37 void DS1337::readTime(void)
loovee 0:f4f9b627adf9 38 {
loovee 0:f4f9b627adf9 39 uint8_t val = 0x00;
loovee 0:f4f9b627adf9 40
loovee 0:f4f9b627adf9 41 i2c.write(DS1337_CTRL_ID,(char *)&val,1);
loovee 0:f4f9b627adf9 42 i2c.stop();
loovee 0:f4f9b627adf9 43 i2c.read(DS1337_CTRL_ID, (char *)rtc_bcd, 7);
loovee 0:f4f9b627adf9 44 }
loovee 0:f4f9b627adf9 45
loovee 0:f4f9b627adf9 46 unsigned char DS1337::getSeconds()
loovee 0:f4f9b627adf9 47 {
loovee 0:f4f9b627adf9 48 return bcd2bin(rtc_bcd[DS1337_SEC]);
loovee 0:f4f9b627adf9 49 }
loovee 0:f4f9b627adf9 50
loovee 0:f4f9b627adf9 51 unsigned char DS1337::getMinutes()
loovee 0:f4f9b627adf9 52 {
loovee 0:f4f9b627adf9 53 return bcd2bin(rtc_bcd[DS1337_MIN]);
loovee 0:f4f9b627adf9 54 }
loovee 0:f4f9b627adf9 55 unsigned char DS1337::getHours()
loovee 0:f4f9b627adf9 56 {
loovee 0:f4f9b627adf9 57 return bcd2bin(rtc_bcd[DS1337_HR]);
loovee 0:f4f9b627adf9 58 }
loovee 0:f4f9b627adf9 59 unsigned char DS1337::getDays()
loovee 0:f4f9b627adf9 60 {
loovee 0:f4f9b627adf9 61 return bcd2bin(rtc_bcd[DS1337_DATE]);
loovee 0:f4f9b627adf9 62 }
loovee 0:f4f9b627adf9 63 unsigned char DS1337::getDayOfWeek()
loovee 0:f4f9b627adf9 64 {
loovee 0:f4f9b627adf9 65 return bcd2bin(rtc_bcd[DS1337_DOW]);
loovee 0:f4f9b627adf9 66 }
loovee 0:f4f9b627adf9 67 unsigned char DS1337::getMonths()
loovee 0:f4f9b627adf9 68 {
loovee 0:f4f9b627adf9 69 return bcd2bin(rtc_bcd[DS1337_MTH]);
loovee 0:f4f9b627adf9 70 }
loovee 0:f4f9b627adf9 71 unsigned int DS1337::getYears()
loovee 0:f4f9b627adf9 72 {
loovee 0:f4f9b627adf9 73 return 2000 + bcd2bin(rtc_bcd[DS1337_YR]);
loovee 0:f4f9b627adf9 74 }
loovee 0:f4f9b627adf9 75
loovee 0:f4f9b627adf9 76
loovee 0:f4f9b627adf9 77 void DS1337::setSeconds(unsigned char v)
loovee 0:f4f9b627adf9 78 {
loovee 0:f4f9b627adf9 79 rtc_bcd[DS1337_SEC] = bin2bcd(v);
loovee 0:f4f9b627adf9 80
loovee 0:f4f9b627adf9 81 }
loovee 0:f4f9b627adf9 82 void DS1337::setMinutes(unsigned char v)
loovee 0:f4f9b627adf9 83 {
loovee 0:f4f9b627adf9 84 rtc_bcd[DS1337_MIN] = bin2bcd(v);
loovee 0:f4f9b627adf9 85
loovee 0:f4f9b627adf9 86 }
loovee 0:f4f9b627adf9 87 void DS1337::setHours(unsigned char v)
loovee 0:f4f9b627adf9 88 {
loovee 0:f4f9b627adf9 89 rtc_bcd[DS1337_HR] = bin2bcd(v);
loovee 0:f4f9b627adf9 90
loovee 0:f4f9b627adf9 91 }
loovee 0:f4f9b627adf9 92 void DS1337::setDays(unsigned char v)
loovee 0:f4f9b627adf9 93 {
loovee 0:f4f9b627adf9 94 rtc_bcd[DS1337_DATE] = bin2bcd(v);
loovee 0:f4f9b627adf9 95
loovee 0:f4f9b627adf9 96 }
loovee 0:f4f9b627adf9 97 void DS1337::setDayOfWeek(unsigned char v)
loovee 0:f4f9b627adf9 98 {
loovee 0:f4f9b627adf9 99 rtc_bcd[DS1337_DOW] = bin2bcd(v);
loovee 0:f4f9b627adf9 100
loovee 0:f4f9b627adf9 101 }
loovee 0:f4f9b627adf9 102 void DS1337::setMonths(unsigned char v)
loovee 0:f4f9b627adf9 103 {
loovee 0:f4f9b627adf9 104 rtc_bcd[DS1337_MTH] = bin2bcd(v);
loovee 0:f4f9b627adf9 105
loovee 0:f4f9b627adf9 106 }
loovee 0:f4f9b627adf9 107 void DS1337::setYears(unsigned int v)
loovee 0:f4f9b627adf9 108 {
loovee 0:f4f9b627adf9 109 if (v>1999)
loovee 0:f4f9b627adf9 110 {
loovee 0:f4f9b627adf9 111 v -= 2000;
loovee 0:f4f9b627adf9 112 }
loovee 0:f4f9b627adf9 113 rtc_bcd[DS1337_YR] = bin2bcd(v);
loovee 0:f4f9b627adf9 114
loovee 0:f4f9b627adf9 115 }
loovee 0:f4f9b627adf9 116
loovee 0:f4f9b627adf9 117 void DS1337::setTime()
loovee 0:f4f9b627adf9 118 {
loovee 0:f4f9b627adf9 119 char set_[8];
loovee 0:f4f9b627adf9 120 set_[0] = 0x00;
loovee 0:f4f9b627adf9 121 for(int i=0; i<7; i++)
loovee 0:f4f9b627adf9 122 {
loovee 0:f4f9b627adf9 123 set_[i+1] = rtc_bcd[i];
loovee 0:f4f9b627adf9 124 }
loovee 0:f4f9b627adf9 125 i2c.write(DS1337_CTRL_ID, set_, 8);
loovee 0:f4f9b627adf9 126 }
loovee 0:f4f9b627adf9 127
loovee 0:f4f9b627adf9 128 byte DS1337::bcd2bin(byte v)
loovee 0:f4f9b627adf9 129 {
loovee 0:f4f9b627adf9 130 return (v&0x0F) + ((v>>4)*10);
loovee 0:f4f9b627adf9 131 }
loovee 0:f4f9b627adf9 132
loovee 0:f4f9b627adf9 133 byte DS1337::bin2bcd(byte v)
loovee 0:f4f9b627adf9 134 {
loovee 0:f4f9b627adf9 135 return ((v / 10)<<4) + (v % 10);
loovee 0:f4f9b627adf9 136 }
loovee 0:f4f9b627adf9 137
loovee 0:f4f9b627adf9 138 void DS1337::stop(void)
loovee 0:f4f9b627adf9 139 {
loovee 0:f4f9b627adf9 140 setRegister(DS1337_SP, getRegister(DS1337_SP) | DS1337_SP_EOSC);
loovee 0:f4f9b627adf9 141 }
loovee 0:f4f9b627adf9 142
loovee 0:f4f9b627adf9 143 void DS1337::start(void)
loovee 0:f4f9b627adf9 144 {
loovee 0:f4f9b627adf9 145 setRegister(DS1337_SP, getRegister(DS1337_SP) & !DS1337_SP_EOSC);
loovee 0:f4f9b627adf9 146 }