#include <16f648A.h>
#fuses HS,NOWDT,PROTECT
#use delay(clock=10000000)

void main()
 {
  int data[32]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
         0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
         0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,
         0x80,0x90,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0};
  int *ptr=&data;
  int atai,i;
  set_tris_b(0x00);
  set_tris_a(0x00);
  output_b(0x00);
  output_a(0x00);
  while(1){
       ptr=data;
       for(i=0;i<=31;i++)
        {
         if(i<15){
            output_bit(PIN_A2,0);
            output_bit(PIN_A3,1);
            }
         if(i>15){
            output_bit(PIN_A2,1);
            output_bit(PIN_A3,0);
            }
        atai=*ptr;
        output_b(atai);
        delay_ms(100);
        ptr++;
       }
     }
 }

32個のLEDフロー
ソースリスト

 HC154の最大出力電流は25mAです。ここでは青のLEDを使い,15mA程度にするため抵抗値は100Ωにしました。この回路図には記していませんが、HC154に2SA1015をエミッタ接地でバッファとしていれて,パワーLEDも駆動できるようにしています。コレクタの最大電流は100mAで、日亜の白LED NSPW510BSを3個パラ接続して実験しました。フラッシュのように点灯しました。Dutyが低いダイナミック点灯にすればより高輝度で使えます。

トップページへ戻る

 回路はPIC16F648AとHC154を2個の構成になっています。LEDは全部で32個あります。ポートはA,BポートありますがLEDの点灯はBポートだけ使います。Bポートは8ビット分ありますが、これを2グループに分け各々のグループで4to16のHC154を使い最大32個のLEDを制御します。HC154はABCDの4ビットのアドレス指定により、0から15の指定された出力ラインに取り出すデマルチプレクサで、入出力ともLowActiveです。

 LEDを32個一列に並べ、1個ずつ順次点灯していきます。PICのBポートの8ビットだけを使って、32個のLEDを制御します。LEDは74HC154Aのポートに直接つなぎ、ダイナミック点灯させています。

 BポートのRB0からRB3の4ビットをHC154に入力します。4ビットの16進数の値に応じて、HC154のポートをLowにしてLEDを点灯させます。Bポートの残りのRB4からRB7は、もう一つのHC154に同じようにつながります。今回は順次フローとしてLEDを点灯させるので、点灯させるLEDのヘキサ値は、1次の配列としてその配列のデータをポインタで読み出していきます。0x00は2個のHC154で存在するため,一方のHC154の値を読むときは、他方のHC154はPICのRA2,RA3でディスエーブルしています。int*ptr=&dataはdataのアドレスをポインタに入れます。atai=*ptrはアドレスが示す場所のデータを読みます。ポートは全て出力に設定します。後は、While文を実行し続けていくことになります。

ソフトの説明
回路構成