//I2CLedMst88.c // I2Cマスターテストプログラム // //音階を送る //PC0:テスト用LED #include <16f873a.h> #fuses HS,NOWDT,NOLVP #use delay(CLOCK=20000000) //クロック20MHz #use i2c(MASTER,sda=PIN_C4,scl=PIN_C3) //メイン関数///////////////////////////////////////// #define sounddva 0x80 int num; int flag; //メロディ int melody[30]={0,2,3,5,7,8,10,12,14,15,17,19,20,22,24,26,27,0xff}; int melody1[30]={0,2,3,5,7,8,10,12,14,15,17,19,20,22,24,26,27,0xff}; int i,oto; void main(){ num=30;//melody[]配列の音符の数 while(1){ for(i=0;i<num;i++){ output_toggle(pin_c0); oto=melody[i]; if(oto==255) break;//1曲終了 i2c_start(); //I2Cで送る i2c_write(sounddva); i2c_write(oto ); i2c_stop(); delay_ms(500); } delay_ms(500);//次の音符までの時間 }//while }
//i2cLEDSlv873.c //i2cから音階データを受け取り演奏する:PC1出力 //I2Cアドレス0x80 //PC0:割り込みトグル #include <16F873A.h> #fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT #use delay(clock = 20000000) #use I2c(slave,sda=PIN_C4,scl=PIN_C3,address=0x80,force_hw) int flag; //音階の周期 ラ ラ# シ ド ド# レ レ# ミ ファ ファ# ソ ソ# ラ ラ# シ ド ド# レ レ# // 0 2 3 5 7 8 10 12 14 15 17 unsigned long onkai[30]= {62695,62854,63005, 63147,63281,63407,63527,63639, 63746,63847,63941,64031,64115,64195,64270,64341, 64408,64471,64531,64587,64641,64691,64738,64783, 64825,64865,64903,64938}; unsigned long prd; int oto; int state; #INT_SSP void ssp_interupt (){ state=i2c_isr_state(); output_toggle(PIN_A0); if(state>=0x80){//addrs match with master read //i2c_write(0);//return value } else if(state >0){//adrs match with master write output_toggle(pin_c0); oto=i2c_read();//1:ack,default 0:nack if(oto==255) prd=0;//低い音を出す prd=onkai[oto]; //output_toggle(PIN_B1); } } //タイマー割り込み関数 #int_timer1 void timer1_isr() { output_bit(PIN_C1,flag);//C1にパルスを発生する if (flag==1) flag=0; else flag=1; set_timer1(prd); } void main (){ setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); set_timer1(0); enable_interrupts(INT_TIMER1); //タイマ0割込み許可 enable_interrupts(INT_SSP); //SSP割り込みを許可 enable_interrupts(GLOBAL); //全ての割り込みを許可 while (1) { } }