32*16ドットLEDマトリックス表示

  1. 構造

    1. 構造
      16*16 のLEDマトリックスを二つ並べて、シリアルインタフェースを付加したモジュールが市販されています(秋月電子)。下は2進数を表示しているテストプログラムによる表示です。


    2. 接続コネクタ
      接続コネクタは4個あり、二つは入力用、他の二つは出力用です。二つの入力コネクタ(CN1A,CN1B)は内部で接続されていますから、どちらか一方を利用します。います。3本のシリアルデータ、3本の制御線、4本の信号線から構成されます。
       CN1A(CN2A)の端子は以下のようです。
      ピン番号 信号名 意味 ピン番号 信号名 意味
      LED_PWR LED用電源 LATCH データ保持
      SIN1 行選択信号 STROBE LでLED点灯
      SIN2 左LEDデータ IC_PWR 制御用電源
      SIN3 右LEDデータ GND 電源GND
      CLOCK データ用クロック 10 GND 電源GND

    3. インタフェース
      SIN1に点灯する行の選択、SIN2に左LEDの点灯データ、SIN3に右LEDの点灯データをCLOCKにあわせてシリアルに送ります。データは1で点灯し、CLOCKの立ち上がりで右シフトします。16回シフトしたら、LATCHを下げて値を保持します。ここで、しばらく(2mS程度)停止して表示を行った後、次の行のデータを送り込み、表示します。
       記憶は1行(32ビット)のみですから、動的な点灯をする必要があります。

  2. 回路

    1. 接続
       CS1,CS2,CS3をPICのC5,C6,C7に接続し、STROBE、LATCH,CLOCKをB0,B1,B2に接続します。3本づつ連続したピンヘッダに接続しすれば、そのまま、パッチボードに差し込むことが出来ます。
       他に、電源+(LED_PWR、IC_PWR)と電源-(GND)を接続します。LED_PWRの電流は多い(LED電流を10mAソすると最大で0.5A程度)ので、別のコネクタ(CN1A)の1番ピンにも分散して接続するとよいでしょう。

    2. 回路図


  3. プログラム

    1. 関数
       16ビットの操作はシリアル演算より、bittest(P1,i) 関数のほうが速いようです。これは、P1 の第iビットを取り出します。i を0から順に操作すると右シフトを行うことができます。ただし、

    2. プログラムソース
      ここでは、行番号に対応する2進数を左右の表示データとしています。一つのLEDのデータは32バイトですからこれを配列で作成しておけば、表示可能です。873Aのデータメモリは192バイトが限度ですから最大でも4画面しか記録できません。static を付加して配列を作成すると、プログラムメモリを利用できます。こちらは、プログラムを合計で2Kまで利用できます。漢字文字などをスクロール表示するには、外付けのメモリ(I2C参照)が必要です。
      #include <16F873A.h>
      
      #fuses HS,NOWDT,NOLVP,NOPROTECT
      #use delay(CLOCK=20000000) //クロック20MHz
      
      //主要なピン 回路を変えたらここも書き換えること
      
      #define cs1 PIN_C5
      #define cs2 PIN_C6
      #define cs3 PIN_C7
      
      #define strobe PIN_B0
      #define latch PIN_B1
      #define clock PIN_B2
      
      //R4,R5に1kの抵抗
      //R1,R2は短絡
      
      //CN1A、CN2A端子表
      //1 LED_PWR 電源
      //2 SIN1 縦(行選択)データ
      //3 SIN2 LED1行データ
      //4 SIN3 LED2行データ
      
      //5 CLOCK 立ち上がりでSIN1,2,3のデータ取り込み
      //6 LATCH 0で出力、1で保持
      //7 STROBE 0で点灯
      //8 IC_PWR IC電源
      //9 GND
      //10 GND
      
      unsigned int16 OP1 = 0x8000;//左表示データ
      //long OP2 = 0xCC01;
      unsigned int16 OP3 = 0xF0C3;//右表示データ
      unsigned int16 OP2 =0xC3A5;
      int i,j,k;
      long lc;
      long li;
      
      unsigned int16 P0,P1,P2,P3;
      
      void main(){
      
      //クロック初期化
       P3=0;
       output_low(clock);
       output_low(strobe);
       output_high(latch);
        P2=P3=0;
      
        while(1){
      
        lc=0;
      
         for(i = 0; i < 16; i++){
          P1 = 0;
          bit_set(P1,i);
      
           li=i;
           P2 = i+(li<<4)+(li<<8)+(li<<12);
           P3 = i+(li<<4)+(li<<8)+(li<<12);
      
      
      //1行を送る
          for(j = 0; j < 16; j++){
           output_bit(cs1,bit_test(P1, j));
           output_bit(cs2,bit_test(P2, j));
           output_bit(cs3,bit_test(P3, j));
           output_high(clock);
           output_low(clock);
      
          }//for j
      
      //latch
          output_toggle(PIN_C0);
          output_low(latch);
          output_high(latch);
      
          //OP1= OP1>>1; 
          delay_ms(1);
      
         }//for i
      
      //   delay_ms(100);
      
        }//while
      }