////////////////////////////////////////////////// // I2Cマスターテストプログラム // // PIC16F873 RIKIYA 2002.11.29 // // i2cmas1.C // // 1:3通信用のマスター側プログラム // // 各スレーブに順次0x0fと0x00のデータ // // を送信する。 // ////////////////////////////////////////////////// #include <16f873.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #use delay(clock = 10000000) // clock 10MHz #use fast_io(B) // 固定入力モード #use i2c(MASTER,SDA=PIN_C4,SCL=PIN_C3,FAST,FORCE_HW) void i2c_led(int add); //メイン関数///////////////////////////////////////// main(){ int count = 0; set_tris_b(0xf0); //RB 7-4:IN 3-0:OUT set_tris_c(0x00); //RC 7-0:OUT output_float(PIN_C3); //I2C pin float output_float(PIN_C4); //I2C pin float // 正常起動確認 output_b(0x0f); //PBに0x0fを出力 delay_ms(1000); //1000mS待機 output_b(0x00); //PBに0x00を出力 // 各スレーブに順次アクセス while(1){ switch(count){ case 0: i2c_led(0x00); break; case 1: i2c_led(0x02); break; case 2: i2c_led(0x04); break; } count++; if(count > 2){ count = 0;} } } //各スレーブ制御///////////////////////////////////// //スレーブのアドレスを引数addで渡す void i2c_led(int add){ i2c_start(); //スタートコンディション i2c_write(add); //アドレスaddに送信 i2c_write(0x0f); //送信データ i2c_stop(); //ストップコンディション output_b(0x0f); //自分のPBに0x0fを出力 delay_ms(250); //250mS待機 i2c_start(); //スタートコンディション i2c_write(add); //アドレスaddに送信 i2c_write(0x00); //送信データ i2c_stop(); //ストップコンディション output_b(0x00); //自分のPBに0x00を出力 delay_ms(250); //250mS待機 }