#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++;
}
}
}
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文を実行し続けていくことになります。