I2C接続3桁数字表示
(ブレッドボード)


  1. 7素子文字表示

    1. 文字表示器
      3メタの7素子文字表示素子として C-533SR を利用します。これは、数字表示する7素子用の信号と、桁を切り替える信号(3,2,1)が端子として利用できます。桁の信号は7個のLEDの共通のカソード(ー側)端子になるため、数十mAの電流引き抜きに対応する必要があります。



    2. その他の端子
       外部からのプログラムに対する端子(ICSP)と、I2Cの信号用の端子が必要です。

  2. 回路設計

    1. 回路



  3. プログラム

    1. スレーブプログラム

      /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
      
      
      }