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
}