数字の3桁表示

  1. 目的


     7素子表示器で3桁の数字を動的表示する方法を紹介します。液晶を用いて数字だけでなく、英字やカナを表示する例はこちらにあります。液晶は複数の画素を比較的簡単に表示できますが、LEDのように発光する方式でないため、遠くからの視認性が悪くなります。

  2. 動的表示


    1. 3桁の動的表示

       先に1桁の数字表示を紹介しましたが、この方法で3桁を表示すると1桁当たり7本の信号が必要ですから、3*7本の接続が必要になってしまいます。ここでは、動的表示を利用して、7本+3本で3桁の表示が可能にする方法を紹介します。

    2. 手法

       3桁の7素子表示器 C533 は数字を表示する7素子の端子以外に、桁を指定する dig3,dig2,dig1の信号線があります。この信号をGND(0V)に接続すると対応する桁の7素子が発光します。 dig3,dig2,dig1 の信号を切替えながら、7素子に表示パターンを設定することで、「動的」に表示を行うことができます。

       しかし、 dig3,dig2,dig1 の信号を直接PICに接続するには無理があります。その理由は、dig3/2/1 の端子には、7素子の電源のオン/オフを行うため、最大、1素子の7倍の電流(LED当たり10mAの場合、計70mA)が流れ、これはPICのポート出力の許容値(20mA)を超えるためです。この問題の対策として、トランジスタを利用します。

    3. カソードコモンとアノードコモン

       ここで利用する数字表示は、ー側(カソード)が各素子共通になりこれをトランジスタでスイッチしています。表示素子には、+側が共通になっているタイプもありアノードコモン型といいます。アノードコモン型は、制御の極性が逆になります。アノードコモンの4桁の表示例はここにあります。

    4. トランジスタスイッチ

       PICの出力は20mA程度の電流しか流せません。したがって、7素子の桁信号(dig2,1)をPICの端子に直接接続することはできません。トランジスタをスイッチとして利用すると、100mA〜1A 程度の電流をスイッチできます。(ただし、LEDの接続抵抗を670Ω以上にすると直接接続することも可能です)
       下図はここで用いるトランジスタ C1815 の正面図です。左から、E:エミッタ端子、C:コレクタ端子、B:ベース 端子の順です。B端子からE端子に数mAの電流を流すと、C端子からE端子に約百mAの電流を流すことができます。下図右側はトランジスタの記号で、左がB(ベース)端子、右上がC(コレクタ)端子、右下がE(エミッタ)端子になります。
       
        

      PICも同じ半導体(トランジスタ)から構成されていますが、PICの出力端子のトランジスタは面積が小さいのであまり電流を流せないのです。トランジスタ C1815 は大きな面積がありますから、比較的大電流を流すことができます。
      下図は、PICの端子を抵抗を通してB端子に接続しています。PICの端子がHレベルになると、トランジスタのB端子からE端子に電流が流れます。すると、C端子からE端子がオンになり、LEDに電流を流すことができます。PICの端子がLレベルになると、トランジスタのB端子に電流がながれないため、LEDには電流が流れません。

       ここでは、7素子表示器の切替え信号 dig1 をトランジスタのC端子に接続します。PICの桁の切替え信号をトランジスタのベースに抵抗を挟んで接続します。

  3. 構成

    1. 回路図

       トランジスタによる各桁のスイッチを行います。7素子表示の d3,d2,d1,のトランジスタのコレクタを接続します。トランジスタのベースとPICのA2,A1,A0 を抵抗を介して接続します。抵抗は電流の制限が目的です。

      制作例:
       7素子用の抵抗を中央にならべ、トランジスタを上下に配置しています。表示用の部品はボード1枚に配置してください。

    2. 部品

      PIC 16F873 1個
      NPNトランジスタ 2SC1815:3個 
      3桁7素子表示 C-533SR
      抵抗 7素子用 330Ω7本、トランジスタベース用:2.2kΩ 2本  

    3. 配線

      トランジスタは文字面を下に向けたとき、左からE:エミッタ端子、その上に中央のC:コレクタピン、左にB:ベースピンとなります。エミッタをグランド、コレクタをLEDのdig3,dig2,dig1 に接続します。ベースピンは抵抗を通して、PICのPA2,PA1,PA0に接続します。

      注意・1桁の表示と同じプログラムにしたため、両者を区別する信号が必要です。PA3(2ピン)をグランドに接続してください。

  4. プログラム

    1. 10進数変換

       計算機は内部では2進数で計算するため10進数で表示するには、2進数から10進数への変換が必要です。ここでは、以下のように、val の値を10進数に対応する3桁の数字に変換します。
      st[2]=val/100; 
      st[1]=val/10-st[2]*10; 
      st[0]=val%10;
      たとえば、val の値が385のとき、これを100で割り3桁目の値 3 を計算します。これを、st[2]に記録します。次に2桁目の計算をします。385/10 を行うと 38 になります。最初の 3 を消すために、3桁目の値 3 を10倍して38 から引きます。これで、38-3*10 で8が残ります。  1桁目は 385を10で割った「あまり」で5 となります。「あまり」はC言語では % 演算を利用します。
    2. プログラムの流れ

       プログラムでは、まず、val,ct,digit を初期化します。繰り返しのなかで、各桁の表示と表示する数字の更新を行います。
       まず、val の値を10進数に分解し配列 st[] に記録します。digit が2の場合、3桁目の表示です。
       output_b( segment_data[st[2]]);
      で、3桁目の数字のパターンをBポートに送り、output_bit(PIN_A2,1) でPA2を1にし、3桁目を駆動するトランジスタのスイッチをONにして、7素子表示器の3桁目の数値を点灯します。delay_ms (5);で5ミリ秒の間表示を続けた後、output_bit(PIN_A1,0); でトランジスタをオフにして3桁目の表示を消します。
       digit を1だけ増やし繰り返しループで、次の桁を表示します。digitが3になったら0に戻します。
      繰り返しの先頭で、ctを減らし0になったらval の値を増して、表示する値を変更します。

    3. プログラム

      3桁に数字を動的表示するプログラムです。

      #include <16f873a.h>
      
      #fuses HS,NOWDT,NOLVP,NOPROTECT
      #use delay(CLOCK=20000000) //クロック20MHz
      
      //PB7..PB1に7素子のg..aに330Ωを通して接続
      //PA2,PA1,PA0からトランジスタのBの2,2kを通して接続
      //5mS単位で各桁を表示
      //20回表示したら、表示する数値を更新する
      
      int ct;//数字の更新間隔
      long val;//表示する数字
      int digit;//表示する桁
      //表示パターン
      int segment_data[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xCE};
      char st[3];
              
      void main(){
      
        digit=0;
        ct=1;//数字を更新する周期
        val=0;//表示する値
        
        while(1){
       
         ct --;  
         if(ct == 0){//数字の更新
           st[2]=val/100;
           st[1]=val/10-st[2]*10;
           st[0]=val%10;
           
           val++;
           if(val==1000) val=0;
           ct=20;
         }
               
         if(digit== 2){//第3桁の表示
              output_b( segment_data[st[2]]);
              output_bit(PIN_A2,1);//3桁表示開始
              delay_ms (5);        //表示期間(ミリ秒)
              output_bit(PIN_A2,0);//表示を消す
              delay_us(100);
            }
      
          if(digit== 1){
              output_b( segment_data[st[1]]);
              output_bit(PIN_A1,1);
              delay_ms (5);
              output_bit(PIN_A1,0);
              delay_us(100);
            }
      
          if(digit == 0){
              output_b( segment_data[st[0]]);
              output_bit(PIN_A0,1);
              delay_ms (5);
              output_bit(PIN_A0,0);
              delay_us(100);
            }
      
          digit ++;//表示桁を変更
          if(digit ==3 ) digit=0;
        }
      
      }

  5. 問題

    時計の分のように、0から59まで表示し次に0に戻すように、プログラムを変更しなさい。
    遅延時間(点燈5m、消燈0.1m)を変更し、見やすい値を調べなさい。
    スイッチでスタート、ストップを行い、0.1秒単位で時間を計数するストップウオッチを作成してください。