今回は7セグメントディスプレイ(ウィキペディア)1桁の制御です。7セグメントディスプレイとはデジタル時計などでよく使われている数字を表現するディスプレイです。一般的に8個の発光ダイオード(LED)がついているだけです。
7セグメントディスプレイでは沢山のIOを使用するため、今まで使用していた「PIC12F1822」では制御できません。そこで今回は「PIC16F1829」を使用します。基本的な使い方はPIC12F1822とそれほど変わりません。
1桁の7セグメントディスプレイの制御とは、簡単に言ってしまうとIOの制御です。どの部分の発光ダイオード(LED)を点灯・消灯させるかだけですので、プログラム自体は非常に簡単です。
1.今回使用するPICについて
今回使用するPICは「PIC16F1829」です。
2.回路
2.1 電子回路図
2.2 電子回路の写真
2.3 回路説明
2.3.1 今回使用する7セグメントディスプレイ
今回使用する7セグメントディスプレイはアノードコモンタイプです。PICからローの信号を出力すると対応した発光ダイオード(LED)が点灯します。またアノードコモンタイプは電源に接続する必要があります。
注:アノードコモンとカソードコモンがあり、接続および制御の方法が変わるので注意してください。
2.3.2 PICと7セグメントディスプレイとの接続関係
PICと7セグメントディスプレイは以下のように接続しています。
PIC | 7セグメントディスプレイ |
RA0 | g |
RA1 | f |
RA2 | a |
RC0 | b |
RC3 | e |
RC6 | d |
RC7 | c |
RB7 | dp |
電源:PICと7セグメントディスプレイのアノードコモンに5[V]電源を接続
3.プログラム
3.1 初期設定
OSCCON = 0b01110000 ; // 内部クロック8MHz ANSELA = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISA = 0b00001000 ; // ピンは全て出力に割当てる(RA3は入力のみとなる) PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) ANSELB = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISB = 0b00000000 ; // ピンは全て出力に割当てる PORTB = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) ANSELC = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISC = 0b00000000 ; // ピンは全て出力に割当てる PORTC = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
PIC16F1829でも初期設定は基本的にPIC12F1822と同様です。ただ、ピンの数が多くなっているため、設定する量が増えています。
内部クロックは8[MHz]に設定します。
OSCCON = 0b01110000;
ポートAグループの設定をします。すべてのポートをデジタル出力に設定し、出力をLowにします。ただし、RA3は入力専用なので入力に設定しています。
ANSELA = 0b00000000;
TRISA = 0b00001000;
PORTA = 0b00000000;
ポートBグループの設定をします。すべてのポートをデジタル出力に設定し、出力をLowにします。
ANSELB = 0b00000000;
TRISB = 0b00000000;
PORTB = 0b00000000;
ポートCグループの設定をします。すべてのポートをデジタル出力に設定し、出力をLowにします
ANSELC = 0b00000000;
TRISC = 0b00000000;
PORTC = 0b00000000;
3.2 IOの組み合わせ設定
7セグメントディスプレイのピンと対応するように、それぞれの組み合わせを設定します。
3.2.1 7セグメントディスプレイのそれぞれ1つ
7セグメントディスプレイの発光ダイオード(LED)それぞれ1つだけを点灯させる組み合わせです。
PIC | 7セグメントディスプレイ |
0b00000001 | a ピン |
0b00000010 | b ピン |
0b00000100 | c ピン |
0b00001000 | d ピン |
0b00010000 | e ピン |
0b00100000 | f ピン |
0b01000000 | g ピン |
0b10000000 | dp ピン |
3.2.2 7セグメントディスプレイで数字の表現
7セグメントディスプレイで数字を表現するための組み合わせです。同時に複数の発光ダイオード(LED)を点灯させます。例えば、0を表現したい場合、中心とドット以外を光らせればいいので、0b00111111となります。
PIC | 7セグメントディスプレイ |
0b00111111 | 0 |
0b00000110 | 1 |
0b01011011 | 2 |
0b01001111 | 3 |
0b01100110 | 4 |
0b01101101 | 5 |
0b01111101 | 6 |
0b00100111 | 7 |
0b01111111 | 8 |
0b01100111 | 9 |
3.3 7セグメントディスプレイの制御
「3.2.2 7セグメントディスプレイで数字の表現」 で作成した組み合わせを利用します。0の場合、0b00111111となります。今回はアノードコモンタイプなので、PICからの出力はローで点灯です。なので、1が入っている場合はローを出力、0の場合はハイを出力するようにします。
例えば7セグメントディスプレイの「a」を光らせるかの判定は以下のようになります。
if( (対象のビットデータ & 0x01) != 0 ) RA2 = 0; else RA2 = 1;
1ビット目が1の場合、RA2に対してローを出力し点灯させます。1ビット目が0の場合、ハイを出力し消灯させます。
補足:対象のビットデータとは、「0」の場合「0b00111111」です。
以上の判定を7セグメントディスプレイに接続しているピン全てに行います。ここでは長くなるので省略しますので、プログラムを見て確認してください。
3.4 ソースコード
プログラムの全文を掲載します。
<注意>
本サイトの注意事項を確認してください。
ソースコードや回路図などを使用する場合、上記注意とともに、自己責任でお願いします。
4.動作確認
動画撮影後に気づいたのですが、9を点灯時に下の発光ダイオード(LED)を点灯させていませんでした。もしプログラムを利用する場合、その部分を修正して使ってください。
<更新履歴>
新規作成:2015年6月15日