- 7セグメントおよび4桁の7セグメントディスプレイモジュール:
- 4桁の7セグメントモジュールをPICマイクロコントローラーに接続する:
- PIC16F877Aを使用したプログラミング:
- ハードウェアのセットアップとテスト:
これは、MPLABとXC8を使用してPICマイクロコントローラを学習する8番目のチュートリアルです。MPLABXのインストールからPICMCUでのLCDの使用まで、私たちはずっと思いついた。ここが初めての場合は、タイマー、LEDの点滅、LCDのインターフェースなどを学ぶことができる以前のチュートリアルをご覧ください。すべてのPICチュートリアルはここにあります。前回のチュートリアルでは、16 * 2 LCDディスプレイを使用してカスタム文字を生成する方法を説明しました。次に、7セグメントディスプレイと呼ばれる別のタイプのディスプレイモジュールを装備し、PICマイクロコントローラーとインターフェイスさせます。
16x2 LCDは7セグメントディスプレイよりもはるかに快適ですが、7セグメントディスプレイがLCDディスプレイよりも便利になるシナリオはほとんどありません。LCDには文字サイズが小さいという欠点があり、数値を表示するだけの場合はプロジェクトにとってやり過ぎになります。7セグメントは、照明条件の悪さに対しても利点があり、通常のLCD画面よりも大きな角度から見ることができます。それで、それを知り始めましょう。
7セグメントおよび4桁の7セグメントディスプレイモジュール:
7セグメントディスプレイには7つのセグメントがあり、各セグメントには1つのLEDがあり、対応するセグメントを点灯して番号を表示します。7セグメントに番号「5」を表示させたい場合と同様に、対応するピンを高くして、セグメントa、f、g、c、およびdをグローする必要があります。7セグメントディスプレイには、CommonCathodeとCommonAnodeの2種類があります。ここでは、CommonCathodeの7セグメントディスプレイを使用しています。7セグメントディスプレイの詳細については、こちらをご覧ください。
これで、1つの7セグメントディスプレイに目的の数字を表示する方法がわかりました。しかし、1桁を超える情報を伝達するには、複数の7セグメントディスプレイが必要になることは明らかです。したがって、このチュートリアルでは、以下に示すように4桁の7セグメントディスプレイモジュールを使用します。
ご覧のとおり、4つの7セグメントディスプレイが相互に接続されています。各7セグメントモジュールには10ピンがあり、4つの7セグメントディスプレイには合計40ピンがあり、ドットボードにはんだ付けするのは面倒なので、モジュールを購入することを強くお勧めします。または、4桁の7セグメントディスプレイを使用するための独自のPCBを作成します。同じものの接続回路図を以下に示します。
4桁の7セグメントモジュールがどのように機能するかを理解するには、上記の回路図を調べる必要があります。図に示すように、4つのディスプレイすべてのAピンが接続されて1つのAとして集まり、B、C….からDPまで同じです。したがって、基本的にトリガーAがオンの場合、4つのAすべてが高くなるはずです。
しかし、それは起こりません。D0からD3(D0、D1、D2、およびD3)までの追加の4つのピンがあり、4つのうちどのディスプレイをハイにするかを制御するために使用できます。例:出力を2番目のディスプレイにのみ表示する必要がある場合は、他のピン(D0、D2、およびD3)をローに保ちながら、D1のみをハイにする必要があります。D0からD3のピンを使用してアクティブにする必要のあるディスプレイと、AからDPのピンを使用して表示する文字を選択するだけです。
4桁の7セグメントモジュールをPICマイクロコントローラーに接続する:
ここではPICマイクロコントローラPIC16F877Aを使用しました。回路の回路図を以下に示します。
モジュールからの12個の出力ピンがあり、そのうち8個は文字を表示するために使用され、4個は4個から1個のディスプレイを選択するために使用されます。したがって、8文字のピンはすべてPORTDに割り当てられ、ディスプレイ選択ピンはPORTCの最初の4つのピンに割り当てられます。
注:モジュールのグランドピンも、ここには示されていないMCUのグランドに接続する必要があります。
PIC16F877Aを使用したプログラミング:
このモジュールが実際にどのように機能するかがわかったので、PIC16F877Aをプログラムして4桁の数字を表示する方法を学びましょう。変数を0から1000にインクリメントして、7セグメントディスプレイに出力してみましょう。MPLABXプログラムを起動し、新しいプロジェクトを作成します。構成ビットから始めましょう。
#pragma config FOSC = HS //オシレーター選択ビット(HSオシレーター)#pragma config WDTE = OFF //ウォッチドッグタイマーイネーブルビット(WDT無効)#pragma config PWRTE = ON //パワーアップタイマーイネーブルビット(PWRT有効)# pragma config BOREN = ON //ブラウンアウトリセットイネーブルビット(BOR有効)#pragma config LVP = OFF //低電圧(シングルサプライ)インサーキットシリアルプログラミングイネーブルビット(RB3はデジタルI / O、HVオンプログラミングにはMCLRを使用する必要があります)#pragma config CPD = OFF //データEEPROMメモリコード保護ビット(データEEPROMコード保護オフ)#pragma config WRT = OFF //フラッシュプログラムメモリ書き込みイネーブルビット(書き込み保護オフ;すべてのプログラムメモリEECON制御で書き込むことができます)#pragma config CP = OFF //フラッシュプログラムメモリコード保護ビット(コード保護オフ)
いつものように、設定ビットの設定ウィンドウを使用してこれらのビットを設定します。それらが何を意味するのかわからない場合は、こちらのLED点滅チュートリアルにアクセスしてください。
次に、ディスプレイの各桁を切り替えるための出力ピンを定義しましょう。
// *** 4つのディスプレイすべての信号ピンを定義します*** //#define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // ***定義の終わり** ////
ここでは、ピンRC0、RC1、RC2、およびRC3を使用して、7セグメントディスプレイモジュールの4桁から選択します。これらのピンは、それぞれs1、s2、s3、およびs4として定義されます。
次に、 void main()に ジャンプしましょう 。 その中に、次の変数宣言があります。
int i = 0; //表示される4桁の値intflag = 0; //遅延unsignedint a、b、c、d、e、f、g、hを作成するため; //変数のみunsignedint seg = {0X3F、//数値0 0X06を表示する16進値、//数値1 0X5Bを表示する16進値、//数値2 0X4Fを表示する16進値、//表示する16進値数値30X66、//数値4 0X6Dを表示する16進値、//数値5 0X7Cを表示する16進値、//数値6 0X07を表示する16進値、//数値70X7Fを表示する16進値/ /数値8を表示する16進値0X6F //数値9を表示する16進値}; // 0から9までの数値を表示するための配列の終わり
ここで、変数 i と flag は、それぞれ表示される値を格納し、遅延を作成するために使用されます。 時間の符号なし整数変数は、 (後でここで説明される)単一の数字に4桁の数字を破壊し、それらを格納するために使用されます。
ここで注意すべき重要な点の1つは、 「seg」 配列宣言です。このプログラムでは、Arrayと呼ばれる新しいデータ型を使用しています。配列は、類似したデータ型の値のコレクションに他なりません。ここでは、この配列を使用して、0から9までの数値を表示するための同等の16進値をすべて格納しています。
配列のアドレスは常にゼロから始まります。したがって、この配列のアドレスには、以下に示す数値と同じ数値(0〜9)の16進値が格納されます。
変数: |
セグメント |
セグメント |
セグメント |
セグメント |
セグメント |
セグメント |
セグメント |
セグメント |
セグメント |
セグメント |
16進コード: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
式 数値: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
つまり、7セグメントに0を表示したい場合は 、seg を呼び出すことができます 。 同様に、6を表示したい場合は、 seg を使用する必要があります 。
HEX値が実際にどのように取得されたかを理解するために、以下の表を調べてみましょう。各進数の等価HEX値は、配列に格納され、一つの特定の数を表示するために呼び出すことができるようになっています。
それでは、コードの次の部分であるI / O構成に移りましょう。
// ***** I / O構成**** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; // *** I / O構成の終了** ///
7セグメントのすべてのピンが出力ピンであり、接続が上の回路図に示されているため、I / O構成は単純です。したがって、出力として宣言し、ゼロに初期化するだけです。
ここで、無限ループ (while(1))に ジャンプしましょう 。 ここでは、「i」の値を4桁に分割し、7セグメントに表示する必要があります。まず、「i」の値を分割することから始めましょう
// ***「i」を4桁に分割*** // a = i%10; // 4桁目はここに保存されますb = i / 10; c = b%10; // 3桁目はここに保存されますd = b / 10; e = d%10; // 2桁目はここに保存されますf = d / 10; g = f%10; // 1桁目はここに保存されますh = f / 10; // ***分割の終了*** //
単純なモジュラスと除算演算を使用することにより、4桁の数値(i)は個々の数値に分離されます。この例では、「i」の値が4578である例を取り上げます。次に、このプロセスの最後に、変数g = 4、e = 5、c = 7、およびa = 8を使用します。そのため、変数を使用するだけで各桁を簡単に表示できるようになります。
PORTD = seg; s1 = 1; //ディスプレイ1をオンにして、4桁目を出力します__delay_ms(5); s1 = 0; // 5msの遅延後にディスプレイ1をオフにしますPORTD = seg; s2 = 1; //ディスプレイ2をオンにして、3桁目を出力します__delay_ms(5); s2 = 0; // 5msの遅延後にディスプレイ2をオフにしますPORTD = seg; s3 = 1; //ディスプレイ3をオンにして、2桁目を出力します__delay_ms(5); s3 = 0; // 5msの遅延後にディスプレイ3をオフにしますPORTD = seg; s4 = 1; //ディスプレイ4をオンにして、1桁目を出力します__delay_ms(5); s4 = 0; // 5msの遅延後にディスプレイ4をオフにします
これは、MCUが7セグメントと通信する実際の場所です。ご存知のとおり、一度に表示できるのは1桁だけですが、表示するのは4桁で、4桁すべてがオンの場合にのみ4桁の数字がユーザーに表示されます。
では、これをどのように処理するのでしょうか。
私たちにとって幸運なことに、MCUは人間の目よりもはるかに高速なので、実際に行うことは、一度に1桁ずつ表示しますが、上記のように非常に高速です。
MCUと7セグメントがそれを処理できるように5ms待機する1桁のディスプレイを選択し、次にその桁をオフにして次の桁に移動し、最後の桁に到達するまで同じことを行います。この5msの遅延は人間の目では観察できず、4桁すべてが同時にオンになっているように見えました。
これで、最後に、以下に示すように、遅延を使用して表示された桁の値をインクリメントするだけです。
if(flag> = 100)//フラグが100に達するまで待つ{i ++; flag = 0; //フラグが100の場合のみ "i"がインクリメントされます} flag ++; //各フラッシュのフラグをインクリメントします
遅延は、ある数値から別の数値への変更にかかる時間が、変更に気付くのに十分な長さになるように使用されます。
完全なコードは、以下に示され、プロセスはまた、説明されているビデオの終わりに。
ハードウェアのセットアップとテスト:
いつものように、実際にハードウェアを使用する前に、Proteusを使用してプログラムをシミュレートしましょう。シミュレーションが成功すると、次のように表示されます。
このプロジェクトには複雑なハードウェア設定はありません。ここでも、LED点滅チュートリアルで作成したものと同じPICマイクロコントローラーボードを使用しています。接続図に従って、7セグメントモジュールをPICマイクロコントローラボードに接続するだけです。接続が完了したら、PicKit 3プログラマーを使用してコードをダンプするだけで、出力を楽しむことができます。