Arduinoに接続したシリアル4桁デジタル表示モジュールの動的表示

    以前、Arduino 開発ボードに 4 桁デジタル管を接続してダイナミック表示実験を行ったことがありますが、クロック割り込み方式を採用したところ、満足できるデジタル表示が得られました。4桁デジタル管の価格は非常に安く、表示効果も良好ですが、Arduinoへの接続には大きな弱点があります。つまり、Arduino開発ボードの12個のIOデジタルポートを占有する必要があります。最も一般的に使用されている Arduino UNO 開発ボードには合計 12 個の IO ポートしかなく、D0 から D13 までの 14 個の IO デジタル ポートがあります。

    Arduinoのデジタルポートの占有を減らすために、今回はシリアル4桁デジタルディスプレイモジュールを選択しましたが、このディスプレイモジュールはArduinoとの接続に必要なワイヤが5本だけで済み、そのうち3本がデータ線、2本が電源線なので、実際には占有されているデジタル ポートは 3 つだけです。

    シリアル 4 桁デジタル ディスプレイ モジュールは、2 つの 74HC595 チップを介して 4 桁デジタル チューブを制御します。チップの内部動作原理にあまり注意を払う必要はありません。ディスプレイ モジュールをデジタル ディスプレイに接続するだけで済みます。 Arduinoのポートを正しく接続し、指定されたデジタルチューブに番号を表示します。

    ディスプレイ モジュールには 5 つのピン、つまり VCC、SCLK、RCLK、DIO、GND があり、VCC は 5V 電源に接続され、GND は接地され、SCLK は同期クロックの受信に使用され、RCLK はデータ出力の制御に使用され、DIO はシリアルデータの入力を受け取るために使用されます。ただし、SCLK は 7 セグメントデジタル管のセグメントコードを受信するもの、RCLK はデジタル管の番号またはビットコード (つまりデジタル管の番号) を受信するものと理解すれば十分です。以下に示すように:

    シリアル4桁デジタル表示モジュールは、4桁デジタル管を直接接続する以前の表示原理と同じであり、「ダイナミックスキャン表示」方式を採用して、最初のデジタル管、2番目のデジタル管を表示します。ニキシー管、4 番目のニキシー管、この方法は人間の目の視覚残留物を使用するもので、走査表示周波数が 25 フレーム/秒を超えると、私たちが見ているものは何ですか?それぞれのニキシー管が同時に表示されることです。また、表示異常を引き起こす可能性があるメインループでの表示処理を解決するため、引き続きArduinoのクロック割り込みを利用して「ダイナミックスキャン表示」を行っており、クロック割り込み間隔は5msに設定されています。

    この実験では Arduino UNO 開発ボードを使用し、ディスプレイ モジュールの SCLK、RCLK、DIO ピンを Arduino の D2、D3、D4 に順番に接続します。

    メインループ内で静的変数 num を 0.1 秒間隔で蓄積し、その値をシリアル 4 桁デジタル表示器に表示します。完全なプログラム (テスト済み) は次のとおりです。

#define SCLK 2 //シリアルクロックピン定義

#define RCLK 3 //受信クロックピン定義

#define DIO 4 //データピン定義

#include<MsTimer2.h> //タイマーT2のライブラリファイルを呼び出す

/*

  クロック割り込み方式を使用して、シリアル 4 桁デジタル モジュールが 0 ~ 9999 のプログラムを動的に表示します。

  利点: 遅延関数はメインループ内で任意に使用できます。

*/

int segCount=4;//4 デジタル チューブ

//セグメント コードを定義します。これは一般的なヤン セグメント コードです。デジタル チューブ セグメント コード ソフトウェアを使用して、配列値を変更したり、任意の形状を表示したりできます

const unsigned char dofly_DuanMa[]={// 0 1 2 3 4 5 6 7 8 9 A b C d E F -

  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98,0x8C,0xBF,0xC6,0xA1,0x86,0x8E,0xbf};

// ビットコード

int segPins[] = {

  0x08,0x04,0x02,0x01}; //デジタル管に対応する番号はビットコードで、左から右に 1 番目のデジタル管、2 番目のデジタル管、3 番目のデジタル管、4 番目のデジタル管です。  

unsigned char displayTemp[4];//表示バッファ、表示する 4 ビットのセグメント コードを格納します

void setup() {

// 対応するポートを出力として設定します

  ピンモード(SCLK,出力);

  ピンモード(RCLK,出力);

  ピンモード(DIO,出力);

  MsTimer2::set(5, Timedisp); //Timedisp をクロック割り込みによって呼び出されるサブルーチンとして定義し、5ms ごとにクロック割り込みをトリガーして Timedisp 関数に入ります

  MsTimer2::start(); //クロック割り込みが開始されます

}

// データ処理では、処理対象のバイトデータ(セグメントコード)を対応するポートSCLKに書き込みます。

void deal(unsigned char value){

  for(int i=7;i>=0;i--){

    digitalWrite(DIO,bitRead(value,i));//非常に簡単な bitWrite 関数を使用します

    // !bitRead(value,i)、ここの前に追加してください! (非動作シンボル) は、カソードコモンまたはアノードコモンデジタル管のどちらが使用されているかに応じて異なります。

    デジタル書き込み(SCLK,LOW);

    デジタル書き込み(SCLK,HIGH);

  }

}

// クロック割り込みで呼び出される表示プログラム

//割り込みごとに、displayTemp[0]~displayTemp[3] (つまり静的変数 i) のいずれかのセグメント コード値を 1 回表示します

void Timedisp() {

  静的 int i;

  deal(displayTemp[i]);//対応するセグメントコード値を対応するデジタルチューブに書き込みます

  deal(segPins[i]);//対応するデジタル管番号のセグメントコード値(ビットコード)をDIOポートに書き込む

  digitalWrite(RCLK,LOW);//RCLKをリセット

  DigitalWrite(RCLK,HIGH);//RCLK をトリガーします。つまり、コード番号 i の対応するデジタル チューブを選択します。

  i++;

  if(i==segCount) //4 桁以降はリサイクル

    i=0;

}

//プログラムを表示、数値を4桁で表示、数値が10000未満

void disp(unsigned long num) {

  num=num%10000;//num が 9999 を超えないようにするためのモジュロ演算

  displayTemp[0]=dofly_DuanMa[num/1000]; //num の 1 桁のセグメント コード値を表示バッファに送信します。displayTemp[0]

  displayTemp[1]=dofly_DuanMa[(num%1000)/100]; //num の 10 桁のセグメント コード値を表示バッファに送信します。displayTemp[1]

  displayTemp[2]=dofly_DuanMa[((num%1000)%100)/10]; //num の 100 桁のセグメント コード値を表示バッファに送信します。displayTemp[2]

  displayTemp[3]=dofly_DuanMa[((num%1000)%100)%10]; //num の千桁のセグメント コード値を表示バッファに送信します。displayTemp[3]

}

// メインループ

void ループ() {

    static unsigned int num;//データを定義する

    disp(num);//累積値 num を表示

    数値++;

    late(100); //100ミリ秒の遅延

}

おすすめ

転載: blog.csdn.net/m0_61543203/article/details/126144689