package stamp.peripheral.io; import stamp.core.*; import stamp.peripheral.io.I2C; /** * I2C Real Time Clock. * * This class manipulates a Dallas DS1307 RTC clock IC * * DS1307(I2C) constructor method I2C is pointer to an I2C object * setclock(hour,min,sec) sets the time * setdate(days,month,year) sets the date, year does not inc century * setday(day) sets day of the week 1=sun, 2=mon, etc * getreg(reg) get the contents of DS1307 reg see data sheet for IC * gettime() returns current time in hh:mm:ss format * getdate() returns date in dd/mm/yyyy format * getday() returns day of the week in Sun, Mon etc format * @version 1.1 22 August 2004 * @author Steven Tron */ public class DS1307 { final static int WRAddr = 0xD0; final static int RDAddr = 0xD1; final static int Sec = 0x0; final static int Min = 0x1; final static int Hour = 0x2; final static int Day = 0x3; final static int Days = 0x4; final static int Month = 0x5; final static int Year = 0x6; final static int Nak = 0x1; protected static I2C ioBus; protected static StringBuffer rtcval = new StringBuffer(7); public DS1307(I2C bus){ this.ioBus = bus; } private static int int2bcd(int val){ return ((val/10)*16)+(val%10); } private static int bcd2int(int val){ return ((val/16)*10)+(val%16); } private static void setreg(int reg) { ioBus.start(); ioBus.write(WRAddr); ioBus.write(reg); } public static void setclock(int hours, int mins, int secs) { setreg(Sec); ioBus.write(int2bcd(secs)); ioBus.write(int2bcd(mins)); ioBus.write(int2bcd(hours)); ioBus.stop(); } public static void setday(int day) { setreg(Day); ioBus.write(day); ioBus.stop(); } public static void setdate(int days, int month, int year) { setreg(Days); ioBus.write(int2bcd(days)); ioBus.write(int2bcd(month)); ioBus.write(int2bcd(year)); ioBus.stop(); } public static int getreg(int reg) { int val = 0; setreg(reg); ioBus.start(); ioBus.write(RDAddr); val = ioBus.read(Nak); ioBus.stop(); return bcd2int(val); } public static String getdate() { rtcval.clear(); rtcval.append(getreg(Days)); rtcval.append('/'); rtcval.append(getreg(Month)); rtcval.append('/'); if ((getreg(Year)/10)==0) { rtcval.append(200); rtcval.append(getreg(Year)); } else { rtcval.append(20); rtcval.append(getreg(Year)); } return rtcval.toString(); } public static String gettime() { rtcval.clear(); rtcval.append(getreg(Hour)); rtcval.append(':'); if ((getreg(Min)/10)==0) { rtcval.append(0); rtcval.append(getreg(Min)); } else { rtcval.append(getreg(Min)); } rtcval.append(':'); if ((getreg(Sec)/10)==0) { rtcval.append(0); rtcval.append(getreg(Sec)); } else { rtcval.append(getreg(Sec)); } return rtcval.toString(); } public static String getday() { rtcval.clear(); switch (getreg(Day)) { case 1: rtcval.append("Sun"); break; case 2: rtcval.append("Mon"); break; case 3: rtcval.append("Tue"); break; case 4: rtcval.append("Wed"); break; case 5: rtcval.append("Thur"); break; case 6: rtcval.append("Fri"); break; case 7: rtcval.append("Sat"); break; } return rtcval.toString(); } }