PICで数字表示(1桁)

  1. 目的

     LEDによる2進数による数字表示は、わかりやすい方法ではありません。ここでは、7素子表示器を利用して、1桁の10進文字表示を行います。

  2. 7素子数字表示器

    1. 7素子数字表示素子

        7素子表示は、電卓などでおなじみの数字表示機です。棒状の発光体を7本を 日 の字型に組み合せ、適当に点滅させると、0から9の数字を表示することができます。下の図は5と9を表示した例です。5では、a,c,d,f,g の素子を点灯します。

      問題1

      0,3,7 を表示するには、どの素子を点灯させますか?

    2. C-533SR

      C-533SRは 7素子表示素子が3個内臓されています。ここでは、まず、1桁の表示のみを行い、次の項で3桁の表示法を紹介します。
       横線が、a,..,g の各素子に接続されます。各7素子は共通に接続されており、dig3,dig2,dig1の各信号線をGND(0V)に接続すると対応する7素子が発光します。例えば、dig1 の端子をグランド(0V)に接続し、b,c の端子に抵抗を通して電源5Vを接続すれば、1桁に”1”が発光します。

    3. 発光パターン

       表示したい数字に対し、a,..,g の各素子の発光パターンを決めるにはどうしたらよいでしょうか?ここで、プログラムの出番です。まず、以下の配列パターンを用意します。各データは、16進定数で指定されています。

      int segment_data[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xCE};

      16進定数は、4ビットの2進数に対し、0,1,2、.. 、7,8,9、A,B,C,D,E,F の文字を対応させます。

      16進数 0 1 2 3 4 5 6 7 8 9 A B C D E F
      2進数 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

      16進文字が2文字で、8ビットの2進数を表現できます。たとえば、0xB6 は 1101 0110 に相当します。最下位の0を無視すると、1101 011 は 数字 2 を表示するパターンです。したがって、

       segment_data[2]

      は数字 2 を表示するパターンとなります。一般に、segment_data[i] は数字 i のパターンを表示します。ここで、配列の最後(第0)のビットを無視したのは、PIC のBポート の B1、..,B7 に 7素子表示の a,..,g を接続するからです。B0 は特殊な目的に利用できますから、ここでは、この端子を使用しないで空けておきます。
       segment_data[2]
      をポートBに送ると、最後(第0)ビットは7素子表示器にはおくられず、第1から第7ビットが segment_data[2] に送られ数字の"2"を表示します。

  3. #fuses、#delay

    1. コンピュータのクロックと#fuses

       コンピュータが規則正しく動作をするには、クロックと呼ばれる一定間隔で0,1を繰り返す信号が必要です。1秒間に0,1を繰り返す回数(周波数)をHz(ヘルツ)の単位で表記します。これをクロック信号といいます。最近のパソコンのプロセッサのクロックは数GHzになります。G(ギガ)は 109 を意味します。
       PICのクロックは4MHzから20MHz程度です。M(メガ)は 106 を意味します。ここで使用するPIC:16F684 は 4MHz のクロックを内蔵しています。また、外部に振動子を接続すれば、20MHz のクロックで動作させることもできます。
       ここでは、それほど高速に動作させる必要はないので、内部発振子を利用します。この指定を、ここでは、

      #fuses INTRC_IO
       
      で、指定します。fuses はPICの特別な場所に記録する設定で、プログラムでは設定できない内容を指定します。ここでは、詳しく述べませんが、

       NOWDT,NOLVP,NOMCLR
      も、プログラムでは指定できないため、#fuses で設定します。

    2. クロックの指定とdelay_ms()

      fuses INTRC_IO は内部発振を利用することだけを指定しており、クロックの周波数を指定していません。クロックの周波数をコンパイラに指定するには

      #use delay(CLOCK=4000000)

      を利用します。この設定をしないと、先に利用した遅延関数

      delay_ms (500);

      を利用できません。この、delay_ms (500); は、実際は何もしない多重の繰り返しをして、時間つぶしをしています。 #use delay(CLOCK=4000000)で、使用するクロックを設定しないと、delay()関数でループを回す回数が定まりません。

  4. 回路

    1. 構成

      PICと7素子表示器の構成です。7素子表示器の各セグメントは RB1-RB7 に接続します。この間には7素子数字表示のLEDの電流制限のため、抵抗が必要です。ここでは、3桁のみ点灯します。したがって C533 の8ピンのみをクランドに接続し、他の桁を表示する 12,9 ピンは空けておきます。

    2. 配線

      ここでは、パッチボードを2枚利用します。上の1枚にPICのコントローラを、下の1枚に7素子表示を実装します。7素子のボードには後で3桁表示用のランジスタを実装しますから、右側を10ピン分空けておいてください。7素子の横に抵抗を7本 a..g の順に配置します。各抵抗とLEDを接続します。
       7素子表示(以後LED)は片側6ピンですから、11ピンは上側左から2番目になります。LEDの両端にはピンがありませんから、ピン位置を間違えないよう注意して下さい。数左下が1ピンになります。LEDの8ピン(dig1)をGNDに接続します。これで、第1桁の表示が可能になります。

       次にPIC側の配線をします。PICの5ピン(下中央)をGND(下)バー、14ピン(上中央)を電源の+(上)バーに接続します(PICの電源)。PICの7,8,9ピンと抵抗のa,b,c、を接続します。次に、10,11,12,13 ピンと d,e,f,g を接続します。
      ここまで配線したら、電源バーに電源を接続し動作を確認します。LEDの第3桁のセグメントが数字の順に光ればOKです。

      注意
      PICのPA3(2ピン)を5Vに接続してください。これは、後の3桁表示のプログラムを共通にするためで、これをしないと、表示が不安定になります。

  5. プログラム

    1. ソース

      以下のプログラムは、0.5秒間隔で、0から9までの数字を順に点灯します。

      #include <16f648a.h>
      
      #fuses INTRC_IO,NOWDT,NOLVP,NOMCLR//内部クロック、WDT,LVPなし
      #use delay(CLOCK=4000000) //クロック4MHz
      
      long val;
      int segment_data[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xCE};
              
      void main(){
      
        set_tris_b(0x00);//Bポート出力
        val=0;
      
        while(1){
           output_b(segment_data[val]);
           delay_ms (500);
           val++;
           if (val == 10) val =0;
       }
      }
    2. プログラムの説明

      segment_data[] に、数字0から9までの点灯パターンを設定しておきます。main() の、

       output_b(segment_data[val])
      で、val に相当する数字のパターン: segment_data[val] をBポートに送ります。

      delay_ms (500);
      で、500ミリ秒待ちます。val を増し、val の値が10になったら 0 に戻します。