舞鶴技術研究会・技術講演会より(2004/2/28(土)) |
---|
if(input(PIN_A4)==0) { delay_ms(20); if(input(PIN_A4)==0) {
///// rctcap01 RTC , lap counter///// #include <16f84.h> #fuses HS,NOWDT,NOPROTECT,PUT #use delay(CLOCK = 20000000) #use fast_io(A) #use fast_io(B) #use i2c(MASTER, SDA=PIN_A0, SCL=PIN_A1, ADDRESS=0xa0, FORCE_HW) // I2C使用宣言 #define mode 0 ////// 液晶表示ライブラリ設定 #define input_x input_B //ポートB使用 #define output_x output_B #define set_tris_x set_tris_B #define stb PIN_B3 #define rs PIN_B2 #byte port_a=5 #include "lcd_lib.c" // 液晶ライブラリ #include "rtc_lib.c" // RTCライブラリ #include "rtc_lap.c" // ラップ計算 ///// メイン関数 void main() { int pa; int lap=-1; set_tris_a(0x3F); // A-port all input output_float(PIN_A1); //SCLピン定義 output_float(PIN_A0); //SDAピン定義 lcd_init(); //LCD初期化 lcd_cmd(0x0C); // cursor off lcd_clear(); year=0x03; month=0x90; week=0x00; day=0x12; hour=0x00; min=0x00; sec=0x00; rtc_date_set(); rtc_date_read(); rtc_lap_init(); while(1) { //永久ループ rtc_date_read(); lcd_cmd(0x00); //1行目の先頭へ lcd_cmd(0x02); printf(lcd_data," Now %c%c:%c%c:%c%c",h_hour,l_hour,h_min,l_min,h_sec,l_sec); if(input(PIN_A4)==0) { delay_ms(20); if(input(PIN_A4)==0) { lap++; if(lap==0) { year=0x03; month=0x90; week=0x00; day=0x12; hour=0x00; min=0x00; sec=0x00; rtc_date_set(); rtc_date_read(); } rtc_lap_calc(); lcd_cmd(0xC0); //2行目の先頭へ printf(lcd_data," Lap%2d %c%c:%c%c:%c%c",lap,hl_hour,ll_hour,hl_min,ll_min,hl_sec,ll_sec); do {} while(input(PIN_A4)==0); } } } } // LCD表示 16文字×2 // 0123456789ABCDEF // Now 12:34:56 // Lap01 00:00:12
/////////////////////////////////////////////// // 液晶表示器制御ライブラリ // 内蔵関数は以下 // lcd_init() ----- 初期化 // lcd_cmd(cmd) ----- コマンド出力 // lcd_data(chr) ----- 1文字表示出力 // lcd_clear() ----- 全消去 ////////////////////////////////////////////// //////// データ出力サブ関数 void lcd_out(int code, int flag) { output_x((code & 0xF0) | (input_x() & 0x0F)); if (flag == 0) output_high(rs); //表示データの場合 else output_low(rs); //コマンドデータの場合 delay_cycles(1); //NOP output_high(stb); //strobe out delay_cycles(2); //NOP output_low(stb); //reset strobe } //////// 1文字表示関数 void lcd_data(int asci) { lcd_out(asci, 0); //上位4ビット出力 lcd_out(asci<<4, 0); //下位4ビット出力 delay_us(50); //50μsec待ち } /////// コマンド出力関数 void lcd_cmd(int cmd) { lcd_out(cmd, 1); //上位4ビット出力 lcd_out(cmd<<4, 1); //下位4ビット出力 delay_ms(2); //2msec待ち } /////// 全消去関数 void lcd_clear() { lcd_cmd(0x01); //初期化コマンド出力 delay_ms(15); //15msec待ち } /////// 初期化関数 void lcd_init() { set_tris_x(mode); //モードセット delay_ms(15); lcd_out(0x30, 1); //8bit mode set delay_ms(5); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x20, 1); //4bit mode set delay_ms(1); lcd_cmd(0x2E); //DL=0 4bit mode lcd_cmd(0x08); //display off C=D=B=0 lcd_cmd(0x0D); //display on C=D=1 B=0 lcd_cmd(0x06); //entry I/D=1 S=0 lcd_cmd(0x02); //cursor home }
// I2C RTC EPSON RTC-8564 functions By H.machida@MNCT-S 2003/10/9 // rtc_lib.c // global variables int year,month,week,day,hour,min,sec; // 現時刻 char h_year,h_month,h_week,h_day,h_hour,h_min,h_sec; // 現時刻文字2桁め char l_year,l_month,l_week,l_day,l_hour,l_min,l_sec; // 現時刻文字1桁め // 【<1>日付時刻設定】 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 上位5bitはDon't Car i2c_write(month);// 月の値 (C:MSB)1-12 Cは1のとき21世紀 i2c_write(year); // 年の値 00-99 i2c_stop(); } // 【<2>日付時刻読み出し】 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(); h_sec= (( sec>>4)&0x07)|0x30; l_sec= ( sec&0x0f)|0x30; h_min= (( min>>4)&0x07)|0x30; l_min= ( min&0x0f)|0x30; h_hour= (( hour>>4)&0x03)|0x30; l_hour= ( hour&0x0f)|0x30; h_day= (( day>>4)&0x03)|0x30; l_day= ( day&0x0f)|0x30; h_week= 0; l_week= ( week&0x0f)|0x30; h_month=((month>>4)&0x01)|0x30; l_month=(month&0x0f)|0x30; h_year= (( year>>4)&0x0f)|0x30; l_year= ( year&0x0f)|0x30; } // 【<3>アラームの設定】毎時10分にアラーム出力する。 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 MSBはAE i2c_write(ahour); // アラーム時の値 0-23 i2c_write(aday); // アラーム日の値 1-31 i2c_write(aweek); // アラーム曜の値 日月火水木金土 0123456 i2c_stop(); // 上位5bitは Don't Care } // 【<4>タイマ、周波数の設定】周波数1Hz,タイマ10秒設定 void rtc_timer_set(int tfreq,int tcont,int timer) { i2c_start(); i2c_write(0xa2); // 書き込みモード i2c_write(0x0D); // クロック出力周波数のアドレス i2c_write(tfreq); // クロック出力周波数の値 i2c_write(tcont); // タイマ制御値 i2c_write(timer); // タイマ値 i2c_stop(); }
// I2C RTC EPSON RTC-8564 functions By H.machida@MNCT-S 2003/10/9 // rtc_lap.c // global variables // int year,month,week,day,hour,min,sec; // 現時刻 // char h_year,h_month,h_week,h_day,h_hour,h_min,h_sec; // 現時刻文字2桁め // char l_year,l_month,l_week,l_day,l_hour,l_min,l_sec; // 現時刻文字1桁め char hb_hour,hb_min,hb_sec; // 前時刻文字2桁め char lb_hour,lb_min,lb_sec; // 前時刻文字1桁め char hl_hour,hl_min,hl_sec; // ラップ時間2桁め char ll_hour,ll_min,ll_sec; // ラップ時間文字1桁め char ht_hour,ht_min,ht_sec; // 待避用時刻文字2桁め char lt_hour,lt_min,lt_sec; // 待避用時刻文字1桁め // void rtc_lap_init() { hb_hour=h_hour; hb_min=h_min; hb_sec=h_sec; lb_hour=l_hour; lb_min=l_min; lb_sec=l_sec; } // 【ラップ時間=現在時刻-前時刻】 void rtc_lap_calc() { ht_hour=h_hour; ht_min=h_min; ht_sec=h_sec; lt_hour=l_hour; lt_min=l_min; lt_sec=l_sec; if(lb_sec > l_sec) { l_sec+=10; hb_sec++; } ll_sec=(l_sec-lb_sec)|0x30; if(hb_sec > h_sec) { h_sec+=6; lb_min++; } hl_sec=(h_sec-hb_sec)|0x30; if(lb_min > l_min) { l_min+=10; hb_min++; } ll_min=(l_min-lb_min)|0x30; if(hb_min > h_min) { h_min+=6; lb_hour++; } hl_min=(h_min-hb_min)|0x30; if(lb_hour > l_hour) { l_hour+=10; hb_hour++; } ll_hour=(l_hour-lb_hour)|0x30; if(hb_hour > h_hour) h_hour+=3; hl_hour=(h_hour-hb_hour)|0x30; hb_hour=ht_hour; hb_min=ht_min; hb_sec=ht_sec; lb_hour=lt_hour; lb_min=lt_min; lb_sec=lt_sec; }