a copy of PCF8583_rtc lib with some modification

Fork of PCF8583_rtc by Dennis Smith

Committer:
pedro_C
Date:
Wed Oct 19 10:26:18 2016 +0000
Revision:
3:c267167e379e
Parent:
2:3291c1f0b986
my test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dennyem 0:7b654820260e 1 #include <mbed.h>
dennyem 0:7b654820260e 2
dennyem 0:7b654820260e 3 #define PCF8583_addr_1 0xA0 // PCF8583 Write address,
dennyem 0:7b654820260e 4 #define PCF8583_addr_2 0xA2 // PCF8583 Write address,
dennyem 0:7b654820260e 5 #define ON 1
dennyem 0:7b654820260e 6 #define OFF 0
dennyem 0:7b654820260e 7
dennyem 0:7b654820260e 8 //Configuration Alarm Control Register
dennyem 0:7b654820260e 9 #define alarm_enable_bit 0x04
dennyem 0:7b654820260e 10 #define alarm_flag 0x02;
dennyem 0:7b654820260e 11 #define timer_hundsek 0x01
dennyem 0:7b654820260e 12 #define timer_seconds 0x02
dennyem 0:7b654820260e 13 #define timer_minutes 0x03
dennyem 0:7b654820260e 14 #define timer_hours 0x04
dennyem 0:7b654820260e 15 #define timer_days 0x05
dennyem 0:7b654820260e 16 #define timer_int_enable 0x08
dennyem 0:7b654820260e 17 #define daily_alarm 0x10
dennyem 0:7b654820260e 18 #define weekday_alarm 0x20
dennyem 0:7b654820260e 19 #define dated_alarm 0x30
dennyem 0:7b654820260e 20 #define timer_alarm_enable 0x40
dennyem 0:7b654820260e 21 #define alarm_int_enable 0x80
dennyem 0:7b654820260e 22 #define timer_alarm_enable 0x40
dennyem 0:7b654820260e 23 #define alarm_int_enable 0x80
dennyem 0:7b654820260e 24
dennyem 0:7b654820260e 25 // Use the first 2 NVRAM addresses for the century and year bytes.
dennyem 0:7b654820260e 26 #define CENTURY_REG 0x10
dennyem 0:7b654820260e 27 #define YEAR_REG 0x11
dennyem 0:7b654820260e 28 #define USER_REG 0x12
dennyem 0:7b654820260e 29
dennyem 0:7b654820260e 30 #define TIME 1
dennyem 0:7b654820260e 31 #define ALARM 9
dennyem 0:7b654820260e 32
dennyem 1:eaba89d6e5d8 33 /// Structures
dennyem 0:7b654820260e 34 struct Time_t {
pedro_C 3:c267167e379e 35 bool fmt_hours;
pedro_C 3:c267167e379e 36 bool am_pm_flag;
pedro_C 3:c267167e379e 37 char hours;
pedro_C 3:c267167e379e 38 char minutes;
pedro_C 3:c267167e379e 39 char seconds;
pedro_C 3:c267167e379e 40 char hundreds;
dennyem 0:7b654820260e 41 };
dennyem 0:7b654820260e 42
dennyem 0:7b654820260e 43 struct Date_t {
pedro_C 3:c267167e379e 44 char day;
pedro_C 3:c267167e379e 45 char month;
pedro_C 3:c267167e379e 46 char year;
pedro_C 3:c267167e379e 47 char century;
pedro_C 3:c267167e379e 48 char weekday;
dennyem 0:7b654820260e 49 };
dennyem 0:7b654820260e 50
dennyem 0:7b654820260e 51 struct DateTime_t {
pedro_C 3:c267167e379e 52 struct Date_t date;
pedro_C 3:c267167e379e 53 struct Time_t time;
dennyem 0:7b654820260e 54 };
dennyem 0:7b654820260e 55
pedro_C 3:c267167e379e 56 class PCF8583rtc
pedro_C 3:c267167e379e 57 {
pedro_C 3:c267167e379e 58 I2C *_i2c;
pedro_C 3:c267167e379e 59
dennyem 0:7b654820260e 60 public:
dennyem 0:7b654820260e 61
pedro_C 3:c267167e379e 62 /**
pedro_C 3:c267167e379e 63 * Set these public variables according to your locale, default (in brackets) is Australian English.
pedro_C 3:c267167e379e 64 * char *ShortDateFormat; ("d,m,yy")
pedro_C 3:c267167e379e 65 * char *LongDateFormat; ("dddd dd mmmm yyyy")
pedro_C 3:c267167e379e 66 * char *ShortTimeFormat; ("d:m:yy")
pedro_C 3:c267167e379e 67 * char *LongTimeFormat; ("dd:nn:yyyy")
pedro_C 3:c267167e379e 68 *
pedro_C 3:c267167e379e 69 * char DateSeparator; ("\")
pedro_C 3:c267167e379e 70 * char TimeSeparator; (":")
pedro_C 3:c267167e379e 71 *
pedro_C 3:c267167e379e 72 * char *ShortDayNames[7]; ({"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"})
pedro_C 3:c267167e379e 73 * char *LongDayNames[7]; ({"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"})
pedro_C 3:c267167e379e 74 * char *ShortMonthNames[12]; ({"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"})
pedro_C 3:c267167e379e 75 * char *LongMonthNames[12]; ({"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"})
pedro_C 3:c267167e379e 76 *
pedro_C 3:c267167e379e 77 * Example:
pedro_C 3:c267167e379e 78 * @code
pedro_C 3:c267167e379e 79 * #include <mbed.h>
pedro_C 3:c267167e379e 80 * #include "PCF8583_rtc.h"
pedro_C 3:c267167e379e 81 *
pedro_C 3:c267167e379e 82 * I2C i2c(P0_10, P0_11); // sda, scl
pedro_C 3:c267167e379e 83 * PCF8583rtc rtc(&i2c, PCF8583_addr_2);
pedro_C 3:c267167e379e 84 *
pedro_C 3:c267167e379e 85 * struct DateTime_t dtl;
pedro_C 3:c267167e379e 86 *
pedro_C 3:c267167e379e 87 * //Set the time
pedro_C 3:c267167e379e 88 * dtl = rtc.read(TIME);
pedro_C 3:c267167e379e 89 * dtl.time.hours = rtc.bin2bcd(11);
pedro_C 3:c267167e379e 90 * dtl.time.minutes = rtc.bin2bcd(43);
pedro_C 3:c267167e379e 91 * rtc.write(TIME, dtl);
pedro_C 3:c267167e379e 92 *
pedro_C 3:c267167e379e 93 * //Read and display the time on the nixie display
pedro_C 3:c267167e379e 94 * dtl = rtc.read(TIME);
pedro_C 3:c267167e379e 95 * i2c.write(ADDR_8574_1, &dtl.time.hours, 1);
pedro_C 3:c267167e379e 96 * i2c.write(ADDR_8574_2, &dtl.time.minutes, 1);
pedro_C 3:c267167e379e 97 *
pedro_C 3:c267167e379e 98 * @endcode
dennyem 0:7b654820260e 99
pedro_C 3:c267167e379e 100 PCF8583rtc(I2C *i2c, char I2cAddress);
pedro_C 3:c267167e379e 101
pedro_C 3:c267167e379e 102 DateTime_t read(const char address);
pedro_C 3:c267167e379e 103 void write(const char address, DateTime_t dti);
pedro_C 3:c267167e379e 104 void FormatDateTime(char *dest, char *format);
pedro_C 3:c267167e379e 105 bool WriteNVram(char address, char * value, char num);
pedro_C 3:c267167e379e 106 bool ReadNVram(char address, char * dest, char num);
pedro_C 3:c267167e379e 107 void SetDateTime(DateTime_t dti);
pedro_C 3:c267167e379e 108 struct DateTime_t GetDateTimeBCD(void);
dennyem 0:7b654820260e 109
pedro_C 3:c267167e379e 110 */
dennyem 0:7b654820260e 111
pedro_C 3:c267167e379e 112 char *ShortDateFormat;
pedro_C 3:c267167e379e 113 char *LongDateFormat;
pedro_C 3:c267167e379e 114 char *ShortTimeFormat;
pedro_C 3:c267167e379e 115 char *LongTimeFormat;
dennyem 0:7b654820260e 116
pedro_C 3:c267167e379e 117 char DateSeparator;
pedro_C 3:c267167e379e 118 char TimeSeparator;
dennyem 0:7b654820260e 119
pedro_C 3:c267167e379e 120 char *ShortDayNames[7];
pedro_C 3:c267167e379e 121 char *LongDayNames[7];
pedro_C 3:c267167e379e 122 char *ShortMonthNames[12];
pedro_C 3:c267167e379e 123 char *LongMonthNames[12];
dennyem 0:7b654820260e 124
pedro_C 3:c267167e379e 125 PCF8583rtc(I2C *i2c, char I2cAddress);
dennyem 0:7b654820260e 126
pedro_C 3:c267167e379e 127 /** read the current Time or Alarm
pedro_C 3:c267167e379e 128 *
pedro_C 3:c267167e379e 129 * @param address "TIME" = read the time, "ALARM" = read the alarm
pedro_C 3:c267167e379e 130 * @returns
pedro_C 3:c267167e379e 131 * a DateTime_t structure
pedro_C 3:c267167e379e 132 */
pedro_C 3:c267167e379e 133 DateTime_t read(const char address);
pedro_C 3:c267167e379e 134
pedro_C 3:c267167e379e 135 /** write the current Time or Alarm
pedro_C 3:c267167e379e 136 *
pedro_C 3:c267167e379e 137 * @param address "TIME" = read the time, "ALARM" = read the alarm
pedro_C 3:c267167e379e 138 * @param dti a DateTime_t structure containing the time or alarm data
pedro_C 3:c267167e379e 139 */
pedro_C 3:c267167e379e 140 void write(const char address, DateTime_t dti);
dennyem 0:7b654820260e 141
pedro_C 3:c267167e379e 142 void FormatDateTime(char *dest, char *format);
pedro_C 3:c267167e379e 143
pedro_C 3:c267167e379e 144 bool WriteNVram(char address, char * value, char num);
dennyem 0:7b654820260e 145
pedro_C 3:c267167e379e 146 bool ReadNVram(char address, char * dest, char num);
pedro_C 3:c267167e379e 147
pedro_C 3:c267167e379e 148 void SetDateTime(DateTime_t dti);
dennyem 0:7b654820260e 149
pedro_C 3:c267167e379e 150 char bin2bcd(char value);
dennyem 0:7b654820260e 151
pedro_C 3:c267167e379e 152 void configureAlarmReg(char alarm);
pedro_C 3:c267167e379e 153 void configureControlReg(char control);
pedro_C 3:c267167e379e 154 /* void enableCounting(void);
pedro_C 3:c267167e379e 155 void pauseCounting(void);*/
pedro_C 3:c267167e379e 156 void enableCounting(void);
pedro_C 3:c267167e379e 157 void pauseCounting(void);
dennyem 2:3291c1f0b986 158
dennyem 0:7b654820260e 159 private:
pedro_C 3:c267167e379e 160 struct DateTime_t dt;
pedro_C 3:c267167e379e 161 char _I2cAddress;
dennyem 0:7b654820260e 162
pedro_C 3:c267167e379e 163 char Bcd2Char(char *d, char val, char WantLeadZero);
pedro_C 3:c267167e379e 164 //void enableCounting(void);
pedro_C 3:c267167e379e 165 //void pauseCounting(void);
pedro_C 3:c267167e379e 166 char readByte(char address);
pedro_C 3:c267167e379e 167 void writeByte(char address, char d);
dennyem 0:7b654820260e 168 };
dennyem 0:7b654820260e 169
dennyem 0:7b654820260e 170 /** PCF8583_rtc class.
dennyem 0:7b654820260e 171 *
dennyem 0:7b654820260e 172 * Example:
dennyem 0:7b654820260e 173 * @code
dennyem 0:7b654820260e 174 * #include <mbed.h>
dennyem 0:7b654820260e 175 * #include <PCF8583_rtc.h>
dennyem 0:7b654820260e 176 *
dennyem 0:7b654820260e 177 * I2C i2c(P0_10, P0_11); // sda, scl
dennyem 0:7b654820260e 178 * PCF8583rtc rtc(&i2c);
dennyem 0:7b654820260e 179 *
pedro_C 3:c267167e379e 180 * int main() {
pedro_C 3:c267167e379e 181 *
dennyem 0:7b654820260e 182 * rtc.read(TIME);
dennyem 0:7b654820260e 183 * i2c.write(ADDR_8574_1, &rtc.HoursBCD, 1); //write hours to display
dennyem 0:7b654820260e 184 * i2c.write(ADDR_8574_2, &rtc.MinsBCD, 1); //write minutes to display
dennyem 0:7b654820260e 185 * }
dennyem 0:7b654820260e 186 * @endcode
dennyem 0:7b654820260e 187 */
pedro_C 3:c267167e379e 188
dennyem 0:7b654820260e 189 /** Create a PCF8583rtc object using a pointer to the given I2C object.
dennyem 0:7b654820260e 190 *
dennyem 0:7b654820260e 191 * @param i2c pointer to an I2C object to which the PCF8583 device is connected.
dennyem 0:7b654820260e 192 */
dennyem 0:7b654820260e 193 //PCF8583rtc(I2C *i2c);
dennyem 0:7b654820260e 194
dennyem 0:7b654820260e 195 /** the Read_DateTime function.
dennyem 0:7b654820260e 196 *
dennyem 0:7b654820260e 197 * @param address Determines whether to read the date/time or alarm registers
dennyem 0:7b654820260e 198 * Values are retrieved from the internal datetime structure
dennyem 0:7b654820260e 199 */
dennyem 0:7b654820260e 200 //void read(const char address);
dennyem 0:7b654820260e 201
dennyem 0:7b654820260e 202 /** the Write_DateTime function.
dennyem 0:7b654820260e 203 *
dennyem 0:7b654820260e 204 * @param address Determines whether to set the date/time or alarm registers
dennyem 0:7b654820260e 205 * Values are first set into the internal datetime structure prior to calling
dennyem 0:7b654820260e 206 */
dennyem 0:7b654820260e 207 //void write(const char address);
pedro_C 3:c267167e379e 208
dennyem 0:7b654820260e 209 /** the FormatDateTime function.
dennyem 0:7b654820260e 210 *
dennyem 0:7b654820260e 211 * @param dest a pointer to a char array where formatted values are to be placed
pedro_C 3:c267167e379e 212 * @param format a pointer to a string describing how to format the values
dennyem 0:7b654820260e 213 */
dennyem 0:7b654820260e 214 //void FormatDateTime(char *dest, char *format);
dennyem 0:7b654820260e 215
dennyem 0:7b654820260e 216 /** the WriteNVram function.
dennyem 0:7b654820260e 217 *
dennyem 0:7b654820260e 218 * @param address address where value is to be placed
dennyem 0:7b654820260e 219 * @param value pointer to char array containing the value(s) to be stored
dennyem 0:7b654820260e 220 * @param num the number bytes to store
dennyem 0:7b654820260e 221 */
dennyem 0:7b654820260e 222 //void WriteNVram(char address, char *value, char num);
dennyem 0:7b654820260e 223
dennyem 0:7b654820260e 224 //#endif