I2C接続3桁数字表示
(ブレッドボード)
/I2C 接続 3桁数字 //A7,A6,A4,A3,A2,A1,A0:7素子 g,f,e,d,c,b,a 接続 //B0,B2,B3 >>d1,d2,d3 //I2C B1:SDA,B4:SCL //B4:Monitor LED //command:上位4ビット:桁数(1〜3) 下位4ビット:値(0〜9) #include <16f88.h> #fuses INTRC_IO,NOWDT,NOLVP,NOMCLR//内部クロック、WDT,LVPなし #use I2c(slave,sda=PIN_B1,scl=PIN_B4,address=0x60,FORCE_HW)// #use delay(CLOCK=4000000) //クロック4MHz #use fast_io(B) //int v3,v2,v1; int digit; int segv[4]={0,1,2,3};//初期値1,2,3 int state,val2; //int segment_data[]={0x3f,0x06,0x9B,0x8F,0xA6,0xAAD,0xBD,0x07,0xBF,0xA7}; //A5 が出力不可のため、A5を飛ばしたパターン int segment_data[]={0x5f,0x06,0x9B,0x8F,0xC6,0xCD,0xDD,0x07,0xDF,0xC7}; long val; int ct; long prd; //タイマー割り込み関数 #int_timer1 void timer1_isr() { //output_toggle(PIN_A0);//A0にパルスを発生する output_bit(PIN_B3,0);//表示を消す output_bit(PIN_B2,0); output_bit(PIN_B0,0); if(digit== 3){//第3桁の表示 output_a(segment_data[segv[3]]); output_bit(PIN_B3,1);//3桁表示開始 } if(digit== 2){ output_a(segment_data[segv[2]]); output_bit(PIN_B2,1); } if(digit == 1){ output_a(segment_data[segv[1]]); output_bit(PIN_B0,1); } digit ++;//表示桁を変更 if(digit ==4 ) digit=1; set_timer1(prd); } #INT_SSP void ssp_interupt (){ state=i2c_isr_state(); //printf("state:%x\r\n",state); output_toggle(PIN_B7); 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); if((val2 >> 4) < 4 ) segv[val2 >> 4]=val2 & 0xF; //output_toggle(PIN_B7); } } void main(){ set_tris_b(0x32);//B4,B1は入力 output_float(PIN_B4); //I2C pin float output_float(PIN_B1); //I2C pin float setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); prd = 65535-256*2;//2mS割り込み set_timer1(prd); // enable_interrupts(INT_TIMER1); enable_interrupts(INT_SSP); enable_interrupts(GLOBAL); val = 0;//表示する値 ct=1; //v3=v2=v1=0; digit = 1;//桁数 while(1){ if(digit== 3){//第3桁の表示 output_a(segment_data[segv[3]]); output_bit(PIN_B3,1);//3桁表示開始 delay_ms (5); //表示期間(ミリ秒) output_bit(PIN_B3,0);//表示を消す delay_ms(1); } if(digit== 2){ output_a(segment_data[segv[2]]); output_bit(PIN_B2,1); delay_ms (5); output_bit(PIN_B2,0); delay_ms(1); } if(digit == 1){ output_a(segment_data[segv[1]]); output_bit(PIN_B0,1); delay_ms (5); output_bit(PIN_B0,0); delay_ms(1); } digit ++;//表示桁を変更 if(digit ==4 ) digit=1; /*ct++; if(ct>100){ ct=0; //segv[3]++; //if(segv[3]==9) segv[3]=0; }*/ }//while }