発光ダイオードのダイナミック点灯制御法

1.7セグメント発光ダイオードとは?

 7セグメント発光ダイオードはどんなものかというと、下図に示す様な配列で
発光ダイオードが並んでおり、a〜gまでの各発光ダイオードの適当なものだけを
光らせると数字が表示できるようになっています。
つまり、例えば「2」の表示をするには「a,b,g,e,d」に相当する発光ダイオード
を点灯すれば良いことになります。
この「a〜g」までの発光ダイオードをセグメントを呼び、7個のセグメントが
あることから7セグメント発光ダイオードと呼ばれています。
実際に点灯させるためには、common端子にマイナスを、必要なセグメントの端子
に抵抗を通してプラスの電圧をかけて、10mA程度の電流を流すと点灯します。    
 (実際には上図はカソードコモンというタイプですが、ほかにアノードコモン
 というタイプもあり、この場合にはプラス、マイナスが逆になります。カソード
 コモンタイプでは、上記のようにcommon端子にマイナスを各セグメント(a〜g)
 にプラスを接続すると、そのセグメントの発光ダイオード(LED)が点灯すること
 になります。)


2.ダイナミック点灯制御とは?

 上記の様に、1個だけすなわち1桁の数字だけの表示であればことは簡単です。
問題になるのは多桁の表示をする時です。全ての桁のセグメントを独立に制御
すれば、ダイナミック点灯制御は必要ありませんが、それでは制御ポートが全部
で桁数x7個も必要になってしまい実用的ではありません。
そこでダイナミック点灯制御方式という方式が出てきます。つまり、7セグメント
の制御の方は全桁共通にして1桁x7だけにしてしまい、どの桁を点灯させるかを
commonの切替えを行うことで制御します。
 そうしておいて短時間の間一つの桁を光らせたら、すぐ次の桁を光らせるという
ことを高速で繰り返します。
こうするとある瞬間では1個の桁だけが点灯していることになりますが、人間の目
には残像現象があり、一度光を見ると、約100msec程度その光を連続して見て
いるように錯覚します。
そこで、上記点灯の繰り返しを数10msecの速さで繰り返すと、あたかも連続して
各桁が連続して点灯しているように見えてしまいます。
これがダイナミック点灯制御の原理です。


3.PICによる制御方法は?

ダイナミック制御をするための、7セグメントLEDとPICの接続は、
まずPORT B側に全桁共通の7セグメントの制御信号を接続し、ポートのビットに
"High"が出力されると点灯するようにします。
こうすると、数字表示をするためには、必要なセグメント、例えば「2」の表示を
するには、「a,b,g,e,d」のセグメントに相当するPORT Bのビットに"High"を出力
する、つまり”1”をセットすれば良いことになります。
 さらに各桁の表示制御をPORT Aで行うことにします。このためには各セグメント
LEDのcommon端子をPORT Aの各ビット毎に接続すれば良いのですが、各桁の
全セグメントが同時に点灯すると、70mA以上の電流が流れますので、PICで直接
制御するとポートの最大定格を超えてしまいます。
そこで電流増幅用として各桁毎に、すなわちPORT Aの各ビット毎にトランジスタを
1個づつ追加します。
結果として、PORTAが"1"になったところの桁で、かつPORTBが"1"になった所の
セグメントだけが点灯することになります。
これを実際の回路図にすると下図となります。  

4.サンプルプログラム例

 さて、それでは、実際のダイナミック点灯制御のサンプルプログラムを作って
みます。内容は下記のような動きをします。
 ・5桁の16進数の表示を約1秒間隔で繰り返す。
 ・表示する数字は桁毎に+1し、かつ1秒毎の繰り返し時にも全ての桁が
  +1する。
 ・16進数は0からFまで繰り返す。
  これを実現するためのプログラムの全体の流れは下記となります。

    初期化        全ポートを出力に指定
     ↓
-----→ 繰り返し回数セット  同じ表示を1秒間保つための繰り返し回数
|     ↓
| --→ 最初の桁にセット   ダイナミック制御の初期化
| |    ↓
| | → 表示データ+1    16進数の+1
| | |  ↓
| | | 表示出力       セグメントデータへの変換含む
| | |  ↓
| | | 次の桁へ移る     5msec毎     
| | |  ↓
| | ---5桁終了?
| |    ↓
| ---- 繰り返し終了?
|     ↓
|___ 最初から繰り返し  

5.プログラムリスト

下記実際のプログラムリストとその説明をします。
MPLABで使用可能なソースファイルは下記です。ダウンロードしてお使い下さい。

   セグメントLED制御プログラムソースファイル

【ソースファイル解説】
 ここでは日本語のコメントでプログラムの解説をします。
 もとのソースファイルは英文になっています。
;**************************************************************
; これは標準的な7セグメントLEDのダイナミック点灯制御例です。
;  5桁のLEDに16進数の数字が、1秒周期で更新表示されます。
;  表示更新時に数字が+1されます。また桁毎にも数字が+1されます。
;***************************************************************
     LIST   P=PIC16F84    ;CPUチップの種類を指定します
     INCLUDE "P16F84.INC"   ;各種の定数ラベルの標準ファイル
                   ;を結合しておきます。
;****************************
; プログラム中で使う変数の定義
;****************************
CNT1   EQU   0DH       ;タイマー用のカウンタ
CNT2   EQU   0EH       ; 〃
CNT3   EQU   0FH       ;1秒間の繰り返し用のカウンタ
COLUM   EQU   10H       ;Display Digit Position
NUMBER  EQU   11H       ;Test Display Data
TEMP   EQU   12H       ;Work
;****************************
; 割り込みのベクトル(未使用)
;****************************
     ORG    0
     GOTO    MAIN      ;RESET時のスタート
     ORG    4
     GOTO    INT_      ;割り込み飛び先(未使用)
     ORG    8H       ;プログラム開始番地指定

;********************************
; メインプログラム
;********************************
MAIN
     BCF    INTCON,GIE   ;割り込みすべて禁止
     CLRF   NUMBER     ;表示データ0セット
; 入出力ポート初期化
     BSF    STATUS,RP0   ;ページ1を指定
     CLRF   TRISA      ;ポートA全て出力
     CLRF   TRISB      ;ポートB全て出力
     BCF    STATUS,RP0   ;ページ0に戻す
MAINLP
     MOVLW   28H       ;繰り返し回数セット(1秒)
     MOVWF   CNT3      ;カウンタへ
LOOP                ;桁繰り返しループ
     MOVLW   10H       ;最初の桁を指定
     MOVWF   COLUM      ;保存
     MOVF   NUMBER,W    ;表示する数字データ取り出し
     MOVWF   TEMP       ;一時保管
NEXT                ;各桁表示
     MOVF   TEMP,W     ;表示データ取り出し
     CALL   DISP      ;セグメント表示出力、5msec待ち
     INCF   TEMP,F     ;表示データ+1
     BCF    STATUS,C    ;シフト時に1が入らないように
     RRF    COLUM,F     ;桁ビットシフト
     MOVF   COLUM,W     ;桁データ取り出し
     ANDLW   1FH       ;5桁完了チェック
     BTFSS   STATUS,Z    ;完了したか?
     GOTO   NEXT      ;まだのとき次の桁へ
     DECFSZ  CNT3,F     ;繰り返し完了か?
     GOTO   LOOP      ;まだの時同じ表示繰り返し
INCF
     NUMBER,F         ;表示データ+1
     GOTO   MAINLP     ;最初から繰り返し

;********************************
; 表示制御サブルーチン
; 5msec待ち
;********************************
DISP
     CALL   GET_7SEG    ;数字データをセグメントデータに変換
     MOVWF   PORTB      ;ポートBへセグメントデータ出力
     MOVF   COLUM,W     ;桁データ取り出し
     MOVWF   PORTA      ;ポートAへ桁データ出力
     CALL   TIME5M     ;5msec待ちタイマー
     CLRF   PORTB      ;次の桁に移る時のちらつき防止
     RETURN

;*************************************************
; 16進数をセグメントデータに変換する
; セグメントデータはPORTB1〜PORTB7用になっている
; つまり0ビット目は使わない
;*************************************************
GET_7SEG
     ANDLW   0FH       ;下位4ビットのみ取り出し
     ADDWF   PCL,F      ;PCレジスタに数字を加えてジャンプ
     RETLW   B'01111110'   ;Code 0
     RETLW   B'00001100'   ;Code 1 
     RETLW   B'10110110'   ;Code 2 ここのデータを持って 
     RETLW   B'10011110'   ;Code 3 リターン
     RETLW   B'11001100'   ;Code 4
     RETLW   B'11011010'   ;Code 5
     RETLW   B'11111010'   ;Code 6
     RETLW   B'00001110'   ;Code 7
     RETLW   B'11111110'   ;Code 8
     RETLW   B'11001110'   ;Code 9
     RETLW   B'11101110'   ;Code A
     RETLW   B'11111000'   ;Code b
     RETLW   B'01110010'   ;Code C
     RETLW   B'10111100'   ;Code d
     RETLW   B'11110010'   ;Code E
     RETLW   B'11100010'   ;Code F

;**************************************
; Timer Routine
; TIM5M:5msec
;**************************************
TIME5M
     MOVLW   9H        ;About 5msec
     MOVWF   CNT2       ;
TIMLP2
     CLRF   CNT1       ;
TIMLP1
     NOP            ;dumy nop
     NOP
     DECFSZ  CNT1,F
     GOTO   TIMLP1      ;5*256-1
     DECFSZ  CNT2,F
     GOTO   TIMLP2      ;10*((5*256-1)+3)-1
     RETURN           ;+3=12822*0.4usec=5.1msec
;****************************************************
; INT Interrupt Dumy Routine (ignored)
;****************************************************
INT_ RETURN 
     END

さて次ぎは使い方のノウハウチップ集です。


次へ       目次ページへ