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
さて次ぎは使い方のノウハウチップ集です。