//RTC realTimeClock //deviceaddress 0xA0 //year,month,date,houre,nim,second set &read //timer & alerm //output timer signal char year,month,week,day; char hour,min,sec; int td; //void rtc_date_set(); //void rtc_date_read(); //void rtc_alarm_set(int aweek,int aday,int ahour,int amin); //void rtc_timer_set(int timer); //void rtc_timer_start(int tc); //int rtc_control_get(); //void rtc_control_set(int mode); //void rtc_clockout_set(int tfreq); //void rtc_control_init(); long st[4]; // 【日付時刻設定】 //値は BCD で設定 //2000年以後は月のMSBを1にする void output_dgt(int dgt,int val) { switch (dgt){ case 0 :output_bit(PIN_B3,val);break; case 1 :output_bit(PIN_B4,val);break; case 2 :output_bit(PIN_B5,val);break; case 3 :output_bit(PIN_B6,val); } } void rtc_date_set() { i2c_start(); i2c_write(0xa2); // 書き込みモード i2c_write(0x02); // 秒のアドレス i2c_write(sec); // 秒の値 0-59 i2c_write(min); // 分の値 0-59 i2c_write(hour); // 時の値 0-23 i2c_write(day); // 日の値 1-31 i2c_write(week); // 曜の値 日月火水木金土 0123456 i2c_write(month);// 月の値 (C:MSB)1-12 Cは1のとき21世紀 i2c_write(year); // 年の値 00-99 i2c_stop(); } // 【日付時刻読み出し】 void rtc_date_read() { i2c_start(); i2c_write(0xa2); // 書き込みモード i2c_write(0x02); // 秒のアドレス i2c_start(); i2c_write(0xa3); // 読み込みモード sec= i2c_read(1); // 秒の値 min= i2c_read(1); // 分の値 hour= i2c_read(1); // 時の値 day= i2c_read(1); // 日の値 week= i2c_read(1); // 曜の値 month=i2c_read(1); // 月の値 year= i2c_read(0); // 年の値 i2c_stop(); sec=sec&0x7F; dateTime[12]= (( sec>>4))|0x30; dateTime[13]= ( sec&0x0f)|0x30; min=min&0x7F; dateTime[9]= (( min>>4))|0x30; dateTime[10]= ( min&0x0f)|0x30; dateTime[11]=':'; hour = hour & 0x3F; dateTime[7]= (( hour>>4))|0x30; dateTime[8]= ( hour&0x0f)|0x30; day = day & 0x3F; dateTime[4]= (( day>>4))|0x30; dateTime[5]= ( day&0x0f)|0x30; dateTime[6]='/'; month = month&0x1F; dateTime[2]=((month>>4))|0x30; dateTime[3]=(month&0x0f)|0x30; dateTime[0]= (( year>>4))|0x30; dateTime[1]= ( year&0x0f)|0x30; dateTime[14]=0x20; dateTime[15]=0x0;//terminate } // 【アラームの設定】 //BCDでアラームをセット、最上位bitを1にすると //他の値は無関係に control:AF をセットする void rtc_alarm_set(int aweek,int aday,int ahour,int amin) { i2c_start(); i2c_write(0xa2); // 書き込みモード i2c_write(0x09); // アラーム分のアドレス i2c_write(amin); // アラーム分の値 0-59 i2c_write(ahour); // アラーム時の値 0-23 i2c_write(aday); // アラーム日の値 1-31 i2c_write(aweek); // アラーム曜の値 日月火水木金土 0123456 i2c_stop(); // 上位5bitは Don't Care } // タイマーの設定 //timer:タイマーの値 unsigned char void rtc_timer_set(int timerm,int timer) { if (timerm ==0) td=0x2;//秒 else { td=0x3;timer = timerm;} i2c_start(); i2c_write(0xa2); // 書き込みモード i2c_write(0x0E); // タイマ制御値のアドレス i2c_write(td); //秒or 分 i2c_write(timer); // タイマ値(2進8ビット) i2c_stop(); } //tc: 4096Hz:0x81,64Hz:0x81,1sec:0x82,1min:0x83 //タイマーが0になるとcontrol:TFが1になる void rtc_timer_start() { i2c_start(); i2c_write(0xa2); // 書き込みモード i2c_write(0x0E); // タイマ制御値のアドレス i2c_write(0x80+td); // タイマ更新間隔 i2c_stop(); } // 【出力周波数の設定】 //tfreq: 32768Hz:0x80,1024Hz:0x81,32Hz:0x82,1Hz:0x83 void rtc_clockout_set(int tfreq) { i2c_start(); i2c_write(0xa2); // 書き込みモード i2c_write(0x0D); // クロック出力周波数のアドレス i2c_write(tfreq); // クロック出力周波数の値 i2c_stop(); } //0bit:Timer Enable 1bit:Alarm Enable //2bit:TimerFlag 3bit:Alarm Flag //4bit:if set to 1, reload timer value after timer event void rtc_control_set(int mode) { i2c_start(); i2c_write(0xa2); // 書き込みモード i2c_write(0x01); // control2のアドレス i2c_write(mode); // モード設定 i2c_stop(); } void rtc_control_init() { delay_ms(700); i2c_start(); i2c_write(0xa2); // 書き込みモード i2c_write(0x00); // control0のアドレス i2c_write(0x0); // test=0 i2c_write(0x0); //AIE=TIE=0 i2c_stop(); } //clear timer int rtc_control_get() { int mode; i2c_start(); i2c_write(0xa2); // 書き込みモード i2c_write(0x01); // control2のアドレス i2c_start(); i2c_write(0xa3); // 読み込みモード mode = i2c_read(0); // i2c_stop(); return mode; }