Xadow Watch with RGB OLED

Dependents:   Xadow_Watch_RGBOLED Xadow_Watch_RGBOLED

Committer:
loovee
Date:
Tue Apr 01 07:02:12 2014 +0000
Revision:
0:9d7c6f478d8c
..;

Who changed what in which revision?

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