I2C接続6桁数字表示
////////////////////////////////////////////////// // I2Cマスターテストプログラム // //7SEG*6 をI2Cで制御 //I2Cデバイスアドレスは0x62 //コマンド (num,val)、num,valは4bit //num:桁番号、val:値 //num=0はLEDで2進表示、他は0~9で数字表示 //マスタの回路は、C4,C3をI2C接続 //ポートB、A0 をLED表示(動作確認用) #include <16f873a.h> #fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT #use delay(clock = 20000000) #use i2c(MASTER,sda=PIN_C4,scl=PIN_C3,FORCE_HW) //メイン関数///////////////////////////////////////// #define seg6dva 0x62 int i,val; int tm,num; void main(){ val=0; tm=0; //set_tris_c(0x99); //RB 7-4:IN 3-0:OUT output_float(PIN_C3); //I2C pin float output_float(PIN_C4); //I2C pin float //Cポートに出力する場合、set_tris_c()が必要 delay_ms(100); //wait for Client up while(1){ output_bit(PIN_A0,tm);//動作確認 tm = ~tm; i2c_start(); //スタートコンディション i2c_write(seg6dva); for(i=0;i<7;i++){ num=i; i2c_write(num<<4 | (num + val) %10 ); } i2c_stop(); output_b(~val); val++; delay_ms(2000); } }
val2=i2c_read(0); segv[val2>>4]=val2 & 0xF;I2Cからデータを受け取り、上位4ビットで桁数、下位4ビットで表示する値としています。このままでは、8こあるLEDの上位4個が利用できません。8桁目でLEDの上位4ビットにする、などの変更が必要です。
//I2C Slave //set 7segLED //7seg:a-pic:B0,7seg:g-pic:B6,7seg:dp-pic:B7 //set_tris_c(0xF8);をしないと、C4,C3が0になりI2Cが動作しない //I2C割込みで、segv[]を設定 #include <16F873A.h> #fuses HS,NOWDT,NOLVP,NOBROWNOUT #use delay(clock = 20000000) #use I2c(slave,sda=PIN_C4,scl=PIN_C3,address=0x62,FORCE_HW)//address must be EvenNumber #use fast_io(c) #use fast_io(a) int val2; int state; int seg_data[]={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x67}; //表示する値0−9 int segv[7]={0,1,2,3,4,5,6}; int seg,loop; #INT_SSP void ssp_interupt (){ state=i2c_isr_state(); //printf("state:%x\r\n",state); if(state>=0x80){//addrs match with master read i2c_write(0);//return sw value } else if(state >0){//adrs match with master write val2=i2c_read(0); segv[val2>>4]=val2 & 0xF; } } void main (){ //output_c(0); output_a(0); set_tris_c(0xF8); set_tris_a(0xF0); output_float(PIN_C4); //I2C pin float output_float(PIN_C3); //I2C pin float set_tris_c(0xF8);//ここで設定がないとC3〜C0が出力にならない enable_interrupts(INT_SSP); //SSP割り込みを許可 enable_interrupts(GLOBAL); //全ての割り込みを許可 while (1) { for(loop=0;loop<100;loop++){ for(seg=0;seg<7;seg++){ output_c(0); output_a(0); output_b(seg_data[segv[seg]]); switch (seg){ case 0:output_b(segv[seg]); output_bit(PIN_C2,1); break; case 1:output_bit(PIN_C1,1); break; case 2:output_bit(PIN_C0,1); break; case 3:output_bit(PIN_A3,1); break; case 4:output_bit(PIN_A2,1); break; case 5:output_bit(PIN_A1,1); break; case 6:output_bit(PIN_A0,1); break; } delay_ms(2); } } } }