51 シングルチップマイコン入門 2デジタル管ダイナミックスキャン

ニキシー管は生活の中で非常に一般的であり、シングルチップマイコンの表示方法としてよく使用されます。今回はデジタル管の原理とワンチップマイコンによる制御についてご紹介します。

デジタル管はシンプルですが、原理をよく知っていればちょっとした工夫もできます。

 

デジタル管のパッケージは1ビットしかないもの、2ビットのものまでいろいろありますが、構造は基本的に同じです。ここでは、4 桁デジタル管 3461BS を例に挙げます。

3461BS は一般的な陽極デジタル管で、12 ピンがあり、そのうち 4 ピンはビットを制御し、8 ピンはセグメントを制御します。下の写真は内部構造です(上が3461ASコモンカソード、下が3461BSコモンアノード)

まずデジタル管のユニットを見てみましょう。「8.」という単語が8つのセグメントに分かれており、それぞれが小さなLEDライトであり、各セグメントにはそれぞれ「a、b、c」と呼ばれる名前が付いていることがわかります。 、d,e,f,g,dp」の場合、図のような配置になります。まずデジタル管を見てみましょう。8 つの小さな LED ライトのアノードが一緒に接続されており (これを共通のアノード端と呼び、共通端と呼びます)、カソードは 8 つのピンを介して引き出されていることがわかります。 。数字の「1」を表示したい場合は、まず共通端子にハイレベルを加えてから(ここでのハイレベルとはLEDランプが正常に動作する電圧を指します)、次にbとcのカソードピンを接地します。 8 つの LED ライトのうち、セクション b とセクション c だけが点灯し、デジタル管に数字の 1 が表示されることがわかりました。

同様に、「E、L、F、H、S、C、b、n、p、d」などの他の数字や文字や記号も表示できます。カソード接地ピン。

ここで、カソードの 8 ピンを順にシングルチップマイコンの I/O ポートに接続すると、ワンチップマイコンを介して 8 セグメント LED を制御して特定の文字を表示できるとします。

P0 ポートを選択し、a、b、c、d、e、f、g をそれぞれ P0.0 ~ P0.7 に順番に接続すると、P0 ポートが特定の 8 桁の 2 進数を出力する限り、ポートを制御できます。デジタル管表示アップ。このようにして、デジタル管のコードテーブルを取得します。

ここからは 4 つのデジタル真空管について説明します。

4 桁デジタル管は、並列接続された 4 つの 1 ビット デジタル管で構成されます。ただし、ここでの並列接続はカソードの同じ名前のポートを並列接続するだけです。(例えば、4本のデジタル管のaセグメントのカソードが接続されている)、その状況は1ビットの場合よりも複雑です。

静的表示: 最初のデジタル管に数字「1」を表示したい場合は、最初のデジタル管の共通端子に高電位を加えるだけでよく、他のデジタル管の共通陽極は停止されます。このようにして、2番目、3番目、4番目のデジタル管はアノードの電位が高くないため電源を入れることができず、最初のデジタル管のabセクションが点灯します。最終的な結果は次のとおりです: 最初の桁が表示されます 数字「1」は他のデジタル管では表示されません。

同様に、デジタル管に特定の数値を表示したい場合は、まずデジタル管のアノードに高電位を加え、次にカソードの対応するセグメントに低電位を加えます。ただし、この表示方法の欠点は、4 桁で異なる数字を同時に表示できず、そのような数字しか表示できないことです。たとえば、1___、_2__、333_、4444 (_ は表示なしを表します)。

1234 という数字を表示したい場合、静的な表示は実現できません。このとき、ダイナミックスキャンが必要です。

ダイナミック スキャン: この表示方法は、昔ながらのテレビの表示原理に似ており、人間の目の持続視覚効果を利用します。
前の質問に戻りますが、デジタル管に 1234 を表示したいと考えています。4 つのデジタル チューブにはすべてディスプレイがあるため、4 つのデジタル チューブのアノードはすべて高電位にし、対応するセグメントのカソードを接地する必要があります。ここで問題が発生します。4 つのデジタル管で表示される数字は異なります。数字「1」に対応するセグメントが接地されている場合、4 つのデジタル管は 1 を表示し、「2」に対応するセグメントが接地されている場合、デジタル管は 1 を表示します。 tube 表示されるのはすべて2で、1234を同時に表示することは不可能で、デッドロックしているようです。
解決策は次のとおりです。まず、最初の桁のアノードに高電位を追加し、次にカソード番号「1」に対応するセグメントに低電位を追加します。その結果、最初の桁には「1」が表示され、他の桁は表示されません; アノードの高電位を削除し、次に 2 番目のアノードに高電位を追加し、同時にカソード番号「2」に対応するセグメントに低電位を追加します。 2桁目は「2」が表示され、他の桁は表示されません、同様に3桁目は「3」、4桁目は「4」が表示され、1桁目に戻ります、 等々。

電位の観点から見ると、高電位はアノード位置間を周期的に移動し、「1-2-3-4-1」に従ってアノード サイクルのセグメント間を移動します。接続の結果は次のようになります。最初の桁には「1」が表示され(他の桁は表示されません)、次に 2 桁目は「2」(他の桁は表示されません)が表示され、3 桁目は「3」(他の桁は表示されません)と表示されます。は表示されません)、その後 4 桁目に「4」が表示され(他の桁は表示されません)、サイクルが継続します。

ただし「1234」は同時に表示されないようです。先ほどスローモーションでデモしましたが、速度を上げて人間の目の持続視覚効果を利用すれば、必要な効果を得ることができます。
視覚効果の持続性: 端的に言えば、人間の目のサンプリング レートと反応速度には限界があるため、テーブルに「1」という数字が書かれていて、それを見ているとします。ある時点で数字の「1」が突然消えます(この状態を0として記録します)。実際、視覚的には消えたことにすぐには気づきませんが、目に見えるものはまだ1のままで、それは0.1〜0.4秒続きます。後でそれが消えたことが判明しましたが、短時間 (0.1 秒未満) で突然 1 が再び現れた場合、それが 0 になったことはまったくわかりません。この期間中、この数字は 1-0-1 という動的な過程を経ていますが、皆さんの目には常に「1」である静的な過程に見えます。同様に、陽極の高電位が 1 つのニキシー管から別のニキシー管に移動し、1 サイクル後にこのニキシー管に戻るとき、つまり、このニキシー管は 1 サイクルに 1 回だけ点灯します。理論的には、ニキシー管がオフになってから 0.1 秒以内に再びオンになる限り、視覚的にはニキシー管が常にオンになっている静的なプロセスにあるように感じられます。つまり、周期を0.1秒以下に設定すれば、ダイナミックな表示が得られる。シングルチップマイクロコンピュータは、デジタル管のサイクル周期をマイクロ秒程度にまで制御することができます。
もう 1 つ考慮すべきことは、デジタル管の場合、周期が 0.1 秒に設定されている場合、この期間中はオンまたはオフになり、オンとオフの時間比率を制御することでデジタル管の明るさを制御できます。大きいほどニキシー管は明るくなり、その逆も同様です。これは、OLED スクリーンの PWM 調光に似ています。したがって、デジタル管はソフトウェアレベルで明るさを調整することもできます。

原理はすでにわかっているので、「12345678」と表示される2本の3461BSデジタル管を例にして、その制御プログラムを書きます。
ここでは、P0 ポートをデジタル チューブ セグメント コントロールとして設定し、P2 ポートをデジタル チューブ ポジション コントロールとして設定します。

アイデア:

まず最初のアノードを 1 (P2=0x01) に設定し、セグメントに数値 1 を入力し (P0=cf)、1ms 遅延し、セグメントをクリアします (P0=0xff)。

2 つのアノードを 1 (P2=0x02)、セグメント入力番号 2 (P0=a4)、1ms 遅延、セグメントをクリア (P0=0xff)、に設定します。

3 つのアノードを 1 (P2=0x04)、セグメント入力番号 3 (P0=0xb0)、1ms 遅延、セグメントをクリア (P0=0xff)、に設定します。

4 つのアノードを 1 (P2=0x08) に設定、セグメント入力番号 4 (P0=0x99)、遅延 1ms、セグメントをクリア (P0=0xff)。

……

8 ビット アノードを 1 に設定 (P2=0x80)、セグメント入力番号 8 (P0=0x80)、1ms 遅延、セグメントをクリア (P0=0xff)、

1 つのアノードが 1 (P2=0x01)、セグメント入力番号 1 (P0=0xcf)、遅延 1ms、セグメントのクリア (P0=0xff)、に設定されます。

こんな感じでサイクルします。

include <reg51.h>               //定义头文件
char codeduan[]={0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};//段编码,使用char数据类型可以减少空间占用,除非特别需要,一般使用char类型
char codebie[]={0x01,0x02,0x04,0x10,0x20,0x40,0x80};      //位编码
void Delay1ms()		//1ms延时子函数,其值需要计算得到
{
	unsigned char i, j;
	i = 2;j = 239;
	do
	{
		while (--j);
	} while (--i);
}

void main()//   主函数
{
   char i;
   while(1)           
   {
    for(i=0;i<8;i++)
       {
        P0=codebit[i];         //PO送位
        P2=codeduan[i];        //P2送段
        Delay1ms();           //调用延时1ms函数
        P2=0xff;              //清空段防止串码
         }
   }
}


ここでは、遅延を1ms、周期を4ms、つまり4msに1回画面を更新すると、1秒間に1000/4=250回の更新が可能となり、フレームレート250FPSに相当します(この観点から見ると、多くのゲーム画面を上回っています。リフレッシュ レート)

もちろん、表示するデータは変化しないので、これがデジタル管を使用する最も簡単な方法ですが、変化するデータを表示したい場合は、中間変数を導入する必要があり、その使い方は後ほど紹介します。

 

 

 

上記はあくまで個人的な理解ですので、間違い等ありましたらご指摘ください。

 

 

おすすめ

転載: blog.csdn.net/qq_55203246/article/details/114437044