TC4040Bで7SEG-LED接続(解説)                       nobcha(c)2010、2011

 PIC試作で数値表示を出したいときは7セグメントLEDを使いダイナミック表示にしたくなりますね。1桁、2桁、3桁・・のLEDが売られています。

 7セグメントLEDに数字を出すには7セグメントLEDドライバICなどもありますが、ここはPICを使ってプログラムで4ビットのBCDから7つのセグメントにデコードしたくなります。次にセグメントをパラレルで制御すると信号は各桁で最低でも7本が必要です。小数点も点けたいし、桁駆動用に更に必要。8ピンPICではIO出力は最大5本ですからとうていパラレル駆動は無理ですね。でもでもちょいと簡単に電圧計・温度計をPIC12F675など使ってLEFD表示したいものです。最小PICのPIC10F200系だと更にIOが減り、合計4本、うち出力3本ですので、2本駆動で表示できるのは魅力的アイテムです。

 という必要性を元に制御信号2 本で7セグメントLEDを駆動表示するというのがこの「TC4040Bで7SEG-LED接続」というプロジェクトなのです。

 きっかけはEDN誌読者アイデア欄の内容を目にしたのが始まりです。(EDN JAPAN2010.6 P49)

 

1. TC4040BはCMOSの16ピンICで内容は12段リップルキャリーバイナリーカウンタです。次のようなブロックとなっています。データシート。

     

2. このバイナリーカウンターをシフトレジスタとして使おうというアイデアです。たとえばQ1の出力を1にしたければ、リセット後にCLKを1個出せばよいし、Q2を1にするなら、CLKを2個という具合です。PICはシフトレジスタ動作させるため、TC4040Bの出力に設定したい値をQn重みに従ってCLK数として積算してCLKから出力すればよいということになります。

 このプログラムの中にはBCDコードをもらってLEDのセグメントデコードの変換する機能も含まれて居ます。

 次にPICからどうやって出力を制御するかのプログラムを示します。該当部分を抜き出し。

ーーーーーーーーーーーー88seg_disp.Cから抜き出しましたーーーーーーーーー

#define clk_pulse (RB0=1, RB0=0 )  // PIC16F88でRB0をCLK出力に指定

#define seg_a 1   // ここではセグメントを光らせるためのカウント数値の定義です
#define seg_b 2
#define seg_c 4
#define seg_d 8
#define seg_e 16
#define seg_f 32
#define seg_g 64
#define seg_dp 128
#define digit3 256
#define digit2 512
#define digit1 1024

       // 関数で入力されてくるBCDからどのセグメントを駆動するかのデコードです
#define code_0 ( seg_a + seg_b + seg_c + seg_d + seg_e + seg_f ) 
#define code_1 ( seg_b + seg_c ) 
#define code_2 ( seg_a + seg_b + seg_d + seg_e + seg_g ) 
#define code_3 ( seg_a + seg_b + seg_c + seg_d + seg_g ) 
#define code_4 ( seg_b + seg_c + seg_f + seg_g ) 
#define code_5 ( seg_a + seg_c + seg_d + seg_f + seg_g ) 
#define code_6 ( seg_a + seg_c + seg_d + seg_e + seg_f + seg_g ) 
#define code_7 ( seg_a + seg_b + seg_c ) 
#define code_8 ( seg_a + seg_b + seg_c + seg_d + seg_e + seg_f + seg_g ) 
#define code_9 ( seg_a + seg_b + seg_c + seg_f + seg_g ) 
#define code_off 0

       // PICのポート指定はここにまとめています
#define seg_rst ( RB0 = 1 , _delay(500) , RB0 = 0 ,_delay(250) )
#define seg_on RB1=1
#define seg_off RB1=0

void disp_off (){
seg_off;
}

void disp_seg (unsigned char code, char digit, char minus , char dp){
unsigned char time=0 ;
short pulse=0;
seg_rst ;
switch(code){
case 0x0: pulse=code_0; // if 0 then seg a b c d e f
time = 6;
if(digit==0){
pulse = code_off; // Digit:0 zero suppress
}
break;
case 0x1: pulse=code_1;
time = 2;
break;
case 2: pulse=code_2; // if 2 then seg a b d e f
time = 5;
break;
case 3: pulse=code_3;
time = 5;
break;
case 4: pulse=code_4; // if 4 then seg b c f g
time = 4;
break;
case 5: pulse=code_5;
time = 5;
break;
case 6: pulse=code_6; // if 6 then seg a c d e f g
time = 6;
break;
case 7: pulse=code_7;
time = 3;
break;
case 8: pulse=code_8; // if 8 then seg a b c d e f g
time = 7;
break;
case 9: pulse=code_9;
time = 5;
break;
default: pulse=seg_g;
}
if( minus ){     // 
pulse=seg_g;    // segment g lighted means minus value
}
switch(digit){
case 1: pulse=pulse+digit1;
break;
case 2: pulse=pulse+digit2;
break;
case 3: pulse=pulse+digit3;
break;
default: pulse=pulse+digit1+digit2+digit3;
}
if(dp){
pulse=pulse+seg_dp;
}
pulse=pulse;
while(pulse>0){
clk_pulse;      // put pulse count to 4040B
pulse--;
}
seg_on;
}
ーーーーーーーーーーーーーーーー以上引用終わりーーーーーーーーーーー

3.タイミングチャート 

 TC4040Bをシフトレジスタ的に使用するには、指定のQ1〜Q12をON/OFFするために必要なパルスを足し算しCLK端子から入力します。7でグメントLEDはカソードコモン型を使うことにして、光らせたいセグメントにつなぐQnを1にします。桁駆動はNPNトランジスタを通じてLEDの桁駆動端子をGNDに引きます。表示駆動信号ではNch-MOSでTRのエミッタをGNDに落とします。
 RST端子はCLK端子から10kΩ/0.01μFの積分回路でつながれ、CLK端子を100μS以上1状態にするとリセットされます。

       

        

4.回路図例

 PIC16F88で実験をやってみました。3桁カソードコモンの7セグメントLEDを使っております。

         

 

5.実験

 3桁でやってみましたが、2桁表示ぐらいまではまだちらつきは目立ちませんが、3桁目を出すとちょっとチカチカします。Qnの重みが高い出力をOnするにはどうしてもパルスの数を増やす必要があり、カウントアップ時間が増えて、表示している時間が相対的に減るという欠点があります。ご承知の上、実験を進めてください。

 

全体目次に戻る 

アイコンは「牛飼いとアイコンの部屋」からの提供。ありがとうございます。

inserted by FC2 system