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);
}
}
}
}