void IncrementReminderYear( y_reminder *reminder ){ int year = BCDtoInt( reminder->Time.Year & 0xFF ); if( year < 99 ) { year++; reminder->Time.Year &= 0xff00; reminder->Time.Year |= IntToBCD( year ); } else { int century = BCDtoInt( reminder->Time.Year >> 8 ); century++; reminder->Time.Year &= 0x0000; reminder->Time.Year |= ( IntToBCD( century ) << 8 ); } }
void IncrementReminderMonth( y_reminder *reminder ){ int month = BCDtoInt( reminder->Time.Month ); if( month < 12 ) { month++; reminder->Time.Month = IntToBCD( month ); } else { reminder->Time.Month = 1; IncrementReminderYear( reminder ); } }
void PCF8583::SetTime(int UnixTimeStamp) { DateTime date(UnixTimeStamp); DigitalOut myled(LED3); myled = 1; wait(0.2); myled = 0; wait(0.2); PCF8583::i2c->start(); PCF8583::i2c->write(RTCAddr); PCF8583::i2c->write(SecondsRegAddr); PCF8583::i2c->write(IntToBCD(date.second())); PCF8583::i2c->write(IntToBCD(date.minute())); PCF8583::i2c->write(0x3F & (IntToBCD(date.hour()))); PCF8583::i2c->write(0x3F & (IntToBCD(date.day()))); PCF8583::i2c->write(0x1F & (IntToBCD(date.month()))); PCF8583::i2c->stop(); }
void PCF8583::SetAlarm(int UnixTimeStamp) { DateTime date(UnixTimeStamp); PCF8583::i2c->start(); PCF8583::i2c->write(RTCAddr); PCF8583::i2c->write(AlarmSecondsRegAddr); PCF8583::i2c->write(IntToBCD(date.second())); PCF8583::i2c->write(IntToBCD(date.minute())); PCF8583::i2c->write(0x3F & (IntToBCD(date.hour()))); PCF8583::i2c->write(0x1F & (IntToBCD(date.day()))); PCF8583::i2c->write(0x7F); PCF8583::i2c->stop(); //set alarm register into active mode SetReg(AlarmControlRegAddr,0x90);//(FetchReg(AlarmControlRegAddr) & 0x0F ) | 0x90); SetReg(ControlRegAddr,(FetchReg(ControlRegAddr) | 0x04)); // await allarm }
void PCF8583::SetAlarm(uint8_t seconds, uint8_t minutes, uint8_t hours) { //set alarm times PCF8583::i2c->start(); PCF8583::i2c->write(RTCAddr); PCF8583::i2c->write(AlarmSecondsRegAddr); PCF8583::i2c->write(IntToBCD(seconds)); PCF8583::i2c->write(IntToBCD(minutes)); PCF8583::i2c->write(0x3F & (IntToBCD(hours))); PCF8583::i2c->write(0x3F & (IntToBCD(1))); PCF8583::i2c->write(0x1F & (IntToBCD(2))); PCF8583::i2c->stop(); //set alarm register into active mode SetReg(AlarmControlRegAddr,0x9C);//(FetchReg(AlarmControlRegAddr) & 0x0F ) | 0x90); SetReg(ControlRegAddr,(FetchReg(ControlRegAddr)) | 0x04); // await allarm }
void IncrementReminderDay( y_reminder *reminder ){ int day = BCDtoInt( reminder->Time.DayOfMonth ); if ( day < 28 ) reminder->Time.DayOfMonth = IntToBCD( ++day ); else { if ( reminder->Time.Month == 0x04 || reminder->Time.Month == 0x06 || reminder->Time.Month == 0x09 || reminder->Time.Month == 0x11 ){ if ( day < 30 ) reminder->Time.DayOfMonth = IntToBCD( ++day ); else { reminder->Time.DayOfMonth = 1; IncrementReminderMonth( reminder ); } } else if ( reminder->Time.Month == 0x02 ){ int year = BCDtoInt( reminder->Time.Year ); if ( IsLeapYear(year) ){ if ( day < 29 ) reminder->Time.DayOfMonth = IntToBCD( ++day ); else { reminder->Time.DayOfMonth = 1; IncrementReminderMonth( reminder ); } } else { if ( day < 28 ) reminder->Time.DayOfMonth = IntToBCD( ++day ); else { reminder->Time.DayOfMonth = 1; IncrementReminderMonth( reminder ); } } } else { if ( day < 31 ) reminder->Time.DayOfMonth = IntToBCD( ++day ); else { reminder->Time.DayOfMonth = 1; IncrementReminderMonth( reminder ); } } } }