LEDバーアレイ

  1. LEDバー


    1. LEDバー

       LEDバーはLEDを棒状に並べた表示器で、ここで使用するB-1000x(ParaLight社)は、10個のLEDを並べ、2色のLEDを並べて、緑から赤色のトーンで表示します。


      内部はつぎのように、単なるLEDのアレイです。1ピンは、側面に文字が印字されている側になります。
       

    2. シフトレジスタ

      LEDの各端子に直接LEDを接続すると、10本の端子が必要です。8ビットのシフトレジスタを用いると、2本のシリアル端子で8個のLEDを点灯できます。
       シフトレジスタ(74HC164)は74HCファミリーの小型のディジタル回路です。 このファミリのICは電源として、右下(7ピン)にグランド、左上(14ピン)に5Vを接続します。CLR端子を 0 にすると、QA〜QH はすべて0にクリアされます。A,Bを共に1にして、CKにパルスを入れるとQA〜QHの各信号の値が1桁左にシフトし、A & B(A,Bの論理積)の値がQAに入り、元のQAはQBに、.. QGの値がQHに移動します。
       A & B を1にしておけば、パルスの数だけ、QA〜QH が1になります。たとえば、パルスを3個入れると、QA,QB,QCが1になり、QD〜QH は0のままです。パルスの数だけ、右シフトが起こり、A & B の値を取り込みます。
       

       この素子の QA〜QH を LED バーに接続します(LEDバーの残り2本はここでは利用しません)。PICの1本を B5 をCLRに、他の1本 B4 を CK します。B5 を一瞬 0にすると、QA〜QH を0(low)にクリアできます。0にした後、1(high)に戻さないと、クリア状態が続きます。
               output_low(PIN_B5);
               output_high(PIN_B5);
       次に、B4 にht個のパルスを送ります。
              for(i=0;i<ht;i++){
                  output_high(PIN_B4);
                  output_low(PIN_B4);
              }
       これで、QAから順に ht 個の出力を1に設定できます。たとえば、htを3にすると、QA,QB,QC が1になります。

    3. 回路図

      PICの B4,B5 にシフトレジスタを接続した例です。 PCとのシリアル接続部分は省略しています。バーLEDを別の基盤に実装する場合、シフトレジスタを利用すると2本の信号だけで簡単に接続できます。また、PICのポートを節約することができます。
       B0〜B7のポートとC0〜C3を直接バーLEDに接続すると、10本のLEDをすべて点灯できます。


    4. 回路製作

       B4,B5 のみを利用します。LEDバーは上側がグランド側になります。配線がメンドウなので、ここでは、1ピンを上側に向けて挿入します。
       74164(シフトレジスタ) の電源は 7ピンがグランド、14ピンが 5V になります。1,2ピンを 5V(Hレベル) にすることを忘れないようにしてください。


  2. プログラム


    1. 概略

      LEDバーを1レベルから8レベルまで順次点灯します。

    2. ソース

      最初に、B5(CLR)をH,B4(CK)をLに設定します。繰り返し部で、まず、B5(シフトレジスタのクリア)をLにして、シフトレジスタのQA,,QHをすべてL(消燈)にします。次に、HT個のパルスをB4に送り、シフトレジスタをHT個1にします。HTを 1..8 まで変化させながら繰り返します。

      #include <16F873A.h>
      //LED Bar
      //B5:CLR
      //B4:CLK
      
      #fuses HS,NOWDT,NOLVP
      #use delay(clock = 20000000)
      
      
      int ht,i;
      
      void main(){
              
              output_high(PIN_B5);
              output_low(PIN_B4) ; 
        
        while(1){             
      
               for(ht=0;ht<9;ht++){
               //clear all
               output_low(PIN_B5);
               output_high(PIN_B5);
      
               output_low(PIN_B4);
               //set ht bits   
                 for(i=0;i<ht;i++){
                    output_high(PIN_B4);
                    output_low(PIN_B4);
                }
                delay_ms(200);
              }
                          
       }//while
      }
      

  3. 実験


    1. 実験

      回路を制作します。

    2. プログラム作成

       webページからプログラムソースを取り込み、コンパイルして HEX ファイルを作成します。これをマイクロローダで、PICに書き込みます。

    3. 拡張

      PICの残った端子をLEDアレイに接続し、表示レベルを10段階以上にしてみよう。たとえば、B6,B7 をLEDの9,10の端子に接続します。B6,B7 の値は次のようなビット出力関数で設定します。
       output_bit(PIN_B7,1) ;//B7の値を1にする
       output_bit(PIN_B7,0);//B7の値を0にする
      PICの端子に余裕があれば、10本のLEDアレイをPICの10本の端子に直接接続できます。たとえば、PICのB0〜B7とC0〜C1 をLEDに接続します。この場合、ポートBの値は、
       output_b(8bitの値)
      で設定できます。表示する値は、予め配列に設定しておきます。
       pat[8]={ 0x1,0x3,0x7,0xf,0x1f,0x2f,0x3f,0x7f,0xff}
      下位4個のLEDを点灯するには、output_b(pat[3]) とします。

    4. 2次元LEDアレイ

       この方法を2次元に拡張すると、8*8の2次元アレイに拡張できます。16*16の2次元アレイを利用すると、ブロック崩しなどのゲームを実現できます。