Skip to content

Commit 161a93e

Browse files
committed
Fixed 12 AM Bug,
1 parent 6985ec2 commit 161a93e

File tree

3 files changed

+167
-93
lines changed

3 files changed

+167
-93
lines changed

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=RTC
2-
version=1.9.1
2+
version=1.9.2
33
author=Manjunath CV
44
maintainer=Manjunath CV <[email protected]>
55
sentence=Library for I2C based RTCs (DS1307, DS3231, PCF8563, PCF8523, MCP7940).

src/DS1307.cpp

Lines changed: 163 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -189,43 +189,31 @@ uint8_t DS1307::getHours()
189189

190190
void DS1307::setHours(uint8_t hours)
191191
{
192-
bool reg_hour, h_mode;
192+
uint8_t reg_hour;
193+
bool h_mode, meridiem;
193194

194195
reg_hour = _read_one_register(R_HOURS);
195196
h_mode = bitRead(reg_hour, 6); //Get hour mode
196197

197198
if (hours >= 00 && hours <= 23)
198199
{
199-
h_mode = getHourMode();
200+
//h_mode = getHourMode();
200201

201202
if (h_mode == CLOCK_H24)
202203
{
203204
_write_one_register(R_HOURS,bin2bcd(hours));
204205
}
205206
else if (h_mode == CLOCK_H12)
206207
{
207-
if(hours < 12)
208-
{
209-
hours = bin2bcd(hours);
210-
bitSet(hours, 6);
211-
bitClear(hours, 5); //AM
212-
_write_one_register(R_HOURS,hours);
213-
}
214-
else if (hours == 12)
215-
{
216-
hours = bin2bcd(hours);
217-
bitSet(hours, 6); // Set to 12 Hour mode again
218-
bitSet(hours, 5); // PM
219-
_write_one_register(R_HOURS,hours);
220-
}
221-
else if (hours > 12)
222-
{
223-
hours = hours % 12;
224-
hours = bin2bcd(hours);
225-
bitSet(hours, 6); // Set to 12 Hour mode again
226-
bitSet(hours, 5); // PM
227-
_write_one_register(R_HOURS,hours);
228-
}
208+
meridiem = (hours >= 12);
209+
if (hours == 0)
210+
hours = 12;
211+
if (hours > 12)
212+
hours -= 12;
213+
hours = bin2bcd(hours);
214+
bitWrite(hours, 5, meridiem);
215+
bitSet(hours, 6);
216+
_write_one_register(R_HOURS,hours);
229217
}
230218
}
231219
}
@@ -388,6 +376,7 @@ void DS1307::setDateTime(String date, String time)
388376
{
389377
uint8_t reg_hours, reg_seconds, h_mode, ch_bit;
390378
uint8_t day, month, hours, minutes, seconds, year;
379+
bool meridiem;
391380

392381
reg_hours = _read_one_register(R_HOURS);
393382
reg_seconds = _read_one_register(R_SECONDS);
@@ -430,28 +419,15 @@ void DS1307::setDateTime(String date, String time)
430419
}
431420
else if (h_mode == CLOCK_H12)
432421
{
433-
if(hours < 12)
434-
{
435-
hours = bin2bcd(hours);
436-
bitSet(hours, 6);
437-
bitClear(hours, 5); //AM
438-
Wire.write(hours);
439-
}
440-
else if (hours == 12)
441-
{
442-
hours = bin2bcd(hours);
443-
bitSet(hours, 6); // Set to 12 Hour mode again
444-
bitSet(hours, 5); // PM
445-
Wire.write(hours);
446-
}
447-
else if (hours > 12)
448-
{
449-
hours = hours % 12;
450-
hours = bin2bcd(hours);
451-
bitSet(hours, 6); // Set to 12 Hour mode again
452-
bitSet(hours, 5); // PM
453-
Wire.write(hours);
454-
}
422+
meridiem = (hours >= 12);
423+
if (hours == 0)
424+
hours = 12;
425+
if (hours > 12)
426+
hours -= 12;
427+
hours = bin2bcd(hours);
428+
bitWrite(hours, 5, meridiem);
429+
bitSet(hours, 6);
430+
Wire.write(hours);
455431
}
456432

457433
Wire.write(calculateDayOfWeek(day, month, year));
@@ -474,6 +450,7 @@ void DS1307::setDateTime(String timestamp)
474450
uint8_t reg_hours, reg_seconds, h_mode, ch_bit;
475451
uint8_t day, month, hours, week, minutes, seconds, year;
476452
String month_str, week_str;
453+
bool meridiem;
477454

478455
reg_hours = _read_one_register(R_HOURS);
479456
reg_seconds = _read_one_register(R_SECONDS);
@@ -524,36 +501,21 @@ void DS1307::setDateTime(String timestamp)
524501
}
525502
else if (h_mode == CLOCK_H12)
526503
{
527-
if(hours < 12)
528-
{
529-
hours = bin2bcd(hours);
530-
bitSet(hours, 6);
531-
bitClear(hours, 5); //AM
532-
Wire.write(hours);
533-
}
534-
else if (hours == 12)
535-
{
536-
hours = bin2bcd(hours);
537-
bitSet(hours, 6); // Set to 12 Hour mode again
538-
bitSet(hours, 5); // PM
539-
Wire.write(hours);
540-
}
541-
else if (hours > 12)
542-
{
543-
hours = hours % 12;
544-
hours = bin2bcd(hours);
545-
bitSet(hours, 6); // Set to 12 Hour mode again
546-
bitSet(hours, 5); // PM
547-
Wire.write(hours);
548-
}
504+
meridiem = (hours >= 12);
505+
if (hours == 0)
506+
hours = 12;
507+
if (hours > 12)
508+
hours -= 12;
509+
hours = bin2bcd(hours);
510+
bitWrite(hours, 5, meridiem);
511+
bitSet(hours, 6);
512+
Wire.write(hours);
549513
}
550-
551514
Wire.write(week);
552515
Wire.write(bin2bcd(day));
553516
Wire.write(bin2bcd(month));
554517
Wire.write(bin2bcd(year));
555518
Wire.endTransmission();
556-
557519
}
558520

559521
tm DS1307::getDateTime()
@@ -614,6 +576,7 @@ void DS1307::setEpoch(time_t epoch)
614576
struct tm epoch_tm, * ptr_epoch_tm;
615577
uint8_t reg_hours, reg_seconds, h_mode, ch_bit;
616578
uint8_t day, month, hours, week, minutes, seconds, year;
579+
bool meridiem;
617580

618581
if(epoch >= UNIX_OFFSET)
619582
{
@@ -662,28 +625,15 @@ void DS1307::setEpoch(time_t epoch)
662625
}
663626
else if (h_mode == CLOCK_H12)
664627
{
665-
if(hours < 12)
666-
{
667-
hours = bin2bcd(hours);
668-
bitSet(hours, 6);
669-
bitClear(hours, 5); //AM
670-
Wire.write(hours);
671-
}
672-
else if (hours == 12)
673-
{
674-
hours = bin2bcd(hours);
675-
bitSet(hours, 6); // Set to 12 Hour mode again
676-
bitSet(hours, 5); // PM
677-
Wire.write(hours);
678-
}
679-
else if (hours > 12)
680-
{
681-
hours = hours % 12;
682-
hours = bin2bcd(hours);
683-
bitSet(hours, 6); // Set to 12 Hour mode again
684-
bitSet(hours, 5); // PM
685-
Wire.write(hours);
686-
}
628+
meridiem = (hours >= 12);
629+
if (hours == 0)
630+
hours = 12;
631+
if (hours > 12)
632+
hours -= 12;
633+
hours = bin2bcd(hours);
634+
bitWrite(hours, 5, meridiem);
635+
bitSet(hours, 6);
636+
Wire.write(hours);
687637
}
688638

689639
Wire.write(week);
@@ -925,6 +875,127 @@ String DS1307::getDateTimeString()
925875
return (dateTimeString);
926876
}
927877

878+
String DS1307::getTimeString()
879+
{
880+
uint8_t seconds, minutes, hours, meridiem, h_mode;
881+
uint16_t year;
882+
String timeString;
883+
884+
Wire.beginTransmission(DS1307_ADDR);
885+
Wire.write(R_SECONDS);
886+
Wire.endTransmission();
887+
Wire.requestFrom(DS1307_ADDR, 3);
888+
889+
seconds = Wire.read();
890+
bitClear(seconds, 3);
891+
seconds = bcd2bin(seconds);
892+
893+
minutes = Wire.read();
894+
minutes = bcd2bin(minutes);
895+
896+
hours = Wire.read();
897+
h_mode = bitRead(hours, 6);
898+
meridiem = bitRead(hours, 5);
899+
900+
if (h_mode == CLOCK_H24)
901+
{
902+
hours = bcd2bin(hours);
903+
}
904+
else //h_mode == CLOCK_H12
905+
{
906+
bitClear(hours, 5);
907+
bitClear(hours, 6);
908+
hours = bcd2bin(hours);
909+
}
910+
911+
if(hours<10)
912+
timeString.concat("0");
913+
timeString.concat(hours);
914+
timeString.concat(":");
915+
if(minutes<10)
916+
timeString.concat("0");
917+
timeString.concat(minutes);
918+
timeString.concat(":");
919+
if(seconds<10)
920+
timeString.concat("0");
921+
timeString.concat(seconds);
922+
if (h_mode == CLOCK_H12)
923+
{
924+
switch (meridiem)
925+
{
926+
case HOUR_AM :
927+
timeString.concat(" AM");
928+
break;
929+
case HOUR_PM :
930+
timeString.concat(" PM");
931+
break;
932+
}
933+
}
934+
return (timeString);
935+
}
936+
937+
String DS1307::getDateString()
938+
{
939+
uint8_t week, day, month, meridiem, h_mode;
940+
uint16_t year;
941+
String dateString;
942+
943+
Wire.beginTransmission(DS1307_ADDR);
944+
Wire.write(R_WEEKDAY);
945+
Wire.endTransmission();
946+
Wire.requestFrom(DS1307_ADDR, 7);
947+
948+
week = Wire.read();
949+
week = week;
950+
951+
day = Wire.read();
952+
day = bcd2bin(day);
953+
954+
month = Wire.read();
955+
month = bcd2bin(month);
956+
957+
year = Wire.read();
958+
year = bcd2bin(year) + 2000;
959+
960+
switch (week)
961+
{
962+
case 1:
963+
dateString.concat("SUN");
964+
break;
965+
case 2:
966+
dateString.concat("MON");
967+
break;
968+
case 3:
969+
dateString.concat("TUE");
970+
break;
971+
case 4:
972+
dateString.concat("WED");
973+
break;
974+
case 5:
975+
dateString.concat("THU");
976+
break;
977+
case 6:
978+
dateString.concat("FRI");
979+
break;
980+
case 7:
981+
dateString.concat("SAT");
982+
break;
983+
}
984+
985+
dateString.concat(" ");
986+
if(day<10)
987+
dateString.concat("0");
988+
dateString.concat(day);
989+
dateString.concat("-");
990+
if(month<10)
991+
dateString.concat("0");
992+
dateString.concat(month);
993+
dateString.concat("-");
994+
dateString.concat(year);
995+
996+
return (dateString);
997+
}
998+
928999
/* NVRAM Functions */
9291000

9301001
bool NVRAM::begin()

src/I2C_RTC.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ class DS1307
119119

120120
tm getDateTime();
121121
String getDateTimeString();
122+
String getTimeString();
123+
String getDateString();
124+
122125

123126
void setEpoch(time_t epoch);
124127
time_t getEpoch();

0 commit comments

Comments
 (0)