////////////////////////////////////////////////// // I2Cマスターテストプログラム // // PIC16F873 RIKIYA 2002.12.08 // // i2cmas3.C // // 1:3通信用マスター側プログラム // // 各スレーブと順次データを送受信し // // 受信データをPBに表示する。 // ////////////////////////////////////////////////// #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((add/2)+1); //(add/2)+1を送信 i2c_start(); //再スタートコンディション i2c_write(add | 0x01); //アドレスaddから受信 output_b(i2c_read(0)); //受信データを自分のPBに出力 i2c_stop(); //ストップコンディション delay_ms(250); //250mS待機 output_b(0x00); //自分のPBに0x00を出力 delay_ms(250); //250mS待機 }