a library to use DS1337 as RTC

Fork of DS1337 by wei zou

Committer:
lawliet
Date:
Tue Apr 29 12:58:07 2014 +0000
Revision:
0:129d962af46f
Initial Version

Who changed what in which revision?

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