ドットマトリクスからOLEDスクリーンへ—ダイナミックスキャンディスプレイの原理

私たちがコンピューター、携帯電話、テレビを購入するとき、メーカーは多くの場合、製品がどのような種類の画面を使用しているか、2K または 4K の解像度、色の明るさ、リフレッシュ レートの高さを宣伝します。

これらのパラメータは正確には何を意味するのでしょうか? 必要なテキスト、写真、ビデオはどのようにして画面に表示されるのでしょうか? この記事では、LED ドットマトリックスから始めて、上記のパラメーターとその動作原理を説明します。

まず最初に、画面の種類、解像度、色の解像度、リフレッシュ レートなど、画面に関するいくつかの重要なパラメータを理解する必要があります。

画面の種類: 携帯電話のパラメータに注意を払ったことがあるなら、初期の携帯電話の画面は主に LCD または TFT 画面であったことがわかりますが、現在では携帯電話の画面のほとんどは OLED と AMOLED を使用しており、コンピュータも使用されています。 IPS スクリーン (TFT のアップグレード バージョン) も使用します。スクリーンの種類が異なれば、発光原理も異なります。

たとえば、LCD 画面表示の原理は、 2 枚の平行平板の間に液晶材料を充填し、電圧によって液晶材料内の分子の配列を変化させ、画像を表示するための遮光と光透過の目的を達成することです。カラー画像を表示できます。要約すると、シェーディングであるため、画像を表示するには LCD 画面にバックライトが必要です。

OLEDは、有機半導体材料と発光材料を介して電場によって駆動され、キャリアの注入と再結合によって発光する自発光型であるため、バックライトなしでも画像を表示することができます。OLED または AMOLED 携帯電話の常時オン画面ディスプレイは、この機能を利用しています。

他のタイプの画面は、基本的にこれら 2 つの画面から派生したものです。ここでは紹介はありません。

解像度:解像度は画面のピクセル構成を反映します。携帯電話の画面を顕微鏡で観察したり、古いテレビの画面をよく見ると、画面内に小さな色の点が均等に配置されていることがわかります。この小さな点がピクセルです。

白黒画面 (インク スクリーンなど) の場合、各ピクセルは小さな白色光とみなすことができます。各ピクセルには 1 または 0 の 2 つの状態のみがあり、それぞれピクセルがオンかオフかを表します。

カラー画面の場合、ピクセルは赤、緑、青(RGB)の 3 つの色の光で構成されます。それぞれの小さな光は光の強さに応じて何段階にも分かれており(n種類あるとします)、3つの小さな光を組み合わせるとn*n*n色になります(赤、緑、青ならどの色でも構いません)。 、など) 3 つの色が比例して混合されます)。小さなライトが 3 つありますが、それらは互いに「結びついて」おり、互いに協力してピクセルを形成します。

解像度はピクセルの配置を反映します。私たちが通常 1080P、2K、4K 解像度と呼んでいるものは、実際には略語です。たとえば、解像度 1080P の画面 (現在、ほとんどのローエンドおよびミッドエンドの携帯電話はこの解像度の画面を使用しています) の場合、ピクセル配列の標準は 1920x1080 です (現在のフルスクリーン携帯電話の解像度は通常 2340*) 1080)、つまり、画面全体は合計 1920 ピクセル、列、1080 行、合計 2073600 ピクセルです。2Kの画素配列規格は2048x1080で、2Kの画素数は1080Pよりも高いため、1080Pよりも2Kの解像度が高く、4K(UHDTV規格は3840x2160)の解像度が高いことがわかります。ピクセル数が多いほど画面に表示できるものが増えるため、解像度が高いほど画面が鮮明に見えます。

カラー解像度:カラー解像度はカラー画面を対象としていますが、白黒画面には色がありません。または、解像度は 2 (白黒のみ) です。前述したように、カラー画面のピクセルは赤、緑、青(RGB)の 3 つの小さな色の光で構成されており、それぞれの小さな光は異なる光度に応じて多くの状態に分割されます。色の解像度は、小さな光の光の強さを何段階に分割できるかによって決まります。各色のスモールライトの光度が 256 段階 (2^8) であるとすると、3 つのライトの組み合わせは 256*256*256=16777216 色になります。色数は 2^24 であるため、この色規格は 24 ビット トゥルー カラーであり、色構成比の観点から RGB888 とも呼ばれます。この種の色解像度は高い基準に属し、ほとんどの携帯電話の画面はこの基準を満たすことができません。通常の携帯電話の画面は約 1,600 万色しかありませんが、これでもニーズを満たすことができます。色の要件が特に高い場合 (たとえば、画像処理として) 24 ビットの True Color スクリーンが使用されます。

24 ビット トゥルー カラーに加えて、わずかに低いカラー解像度標準、16 ビット トゥルー カラーもあります。こちらも赤、緑、青の3色で構成されるピクセルですが、各色が256レベルある24ビットとは異なり、赤、緑、青の色分類は32(2^5)、64(2^6)となります。 ) それぞれ 32 (2^5)、この比率標準は RGB565 と呼ばれます。色は 65535 色 (2^16) しかありません。

したがって、24 ビット トゥルー カラー スクリーンのすべての色を表示できるようにするには、ピクセルに 24 ビット、つまり 3 バイトのデータが必要ですが、16 ビット トゥルー カラー スクリーンには 16 ビット、つまり 2 バイトのデータしか必要ありません。

リフレッシュ レート: リフレッシュ レートは画面が更新される速度であり、単位はフレームまたは Hz です。画面表示は本来 1 フレームごとの静止画であり、それを連続的に更新することで動画が得られますが、1 秒以内に静止画を数回更新してリフレッシュ レートを示します。通常の携帯電話やコンピュータの画面のリフレッシュ レートは一般的にわずか 60 フレームですが、わずかに優れた携帯電話の画面では 90 フレーム、さらには 120 フレームを超えるものもあります。ゲーム画面はすでに 144Hz や 240Hz に達する可能性があります。高いリフレッシュ レートの最も直感的な感覚は、画像がより滑らかになることです。

次に、画面リフレッシュ原理(ダイナミックスキャン)について詳しく説明する。

前回の記事でデジタル管のダイナミックスキャンについて触れましたが、原理は同じです。ただ、画面が少し複雑になっています。

ASCII コード文字を表示する 8*8 LED ドットマトリックスから始めましょう (すべての ASCII 文字を明確に表示するために必要な最小ピクセルは 8*6 です)。以下は、マイクロコントローラーを調べるときに見る LED ドットマトリックスです。

この種のドット マトリクスは生活の中でも非常に一般的で、銀行やホテルの入り口にあるローリング ディスプレイ看板はこの種の小さなドット マトリクスの接合で作られています。

 特定の位置の LED を点灯させることで、表示したい文字パターンを取得します。

8x8 LED ドット マトリクスは、実際には最も単純な画面です。そのパラメータは次のとおりです: 解像度 8x8、色解像度 2、リフレッシュ レートはドライバーに依存し、その各ピクセルは小さな LED ライトです。

各 LED ランプには 2 つのピンがあります。ここでは共通カソード接続方法が使用されると仮定しています。すべての LED のカソードは一緒に接続され、接地されています。対応するポートが電圧を印加している限り、LED のアノードは 1 つのポートによって制御されます。アノードに接続するとLEDライトが点灯します。この LED ドットマトリックスでは、すべての LED を個別に制御するために 8x8=64 個のピンが必要になります。

シングルチップマイコンで制御する場合、シングルチップマイコンのIOポートでは足りない場合があります。ドット マトリクスが 10*10 のように大きい場合、100 個のドットが必要になりますが、これを達成することは不可能であり、ましてやより高い解像度の画面を実現することは不可能です。

このとき、ダイナミックスキャンが必要になります。

ダイナミックスキャンとは何ですか? それも静的ですか?

上記の表示方法には特徴があり、表示したい文字や模様が変化しない場合、制御ポートの状態も変化しない、つまり静的な表示方法です。先ほど計算したところ、画素数が増加すると必要なIOポートも増加し、明らかに高解像度画面のリフレッシュを満足できなくなります。

そのためダイナミックスキャンは利用できません まずはダイナミックスキャンの原理を理解しましょう。

下図はダイナミックスキャンを実現するための配線図です。

 同じ行の LED は共通のアノードを持ち、合計 8 つのピンが左につながっており、同じ列の LED は共通のカソードを持ち、上につながっており、合計 8 つのピンがあります。ピンは合計 16 個あり、ダイナミック スキャン後、16 ポートだけで 64 個の LED を制御できることがわかります。

では、それはどのように制御されているのでしょうか?

ここではドットマトリクスの制御にSTM32マイコンを使用しており、PA1~PA8は1行目から8行目のラインに順番に接続され、PB1~PB8は1列目から8列目のラインに順番に接続されています。

ダイナミックスキャンは行スキャンと列スキャンに分けられますが、ここでは列スキャンを例に挙げます。列スキャンとは、左から右または右から左 (通常は左から右) にスキャンすることを意味します。

ASCII で「H」を表示したい場合、点灯する LED は下図のようになります。

列スキャンのロジックによれば、上記の文字は列ごとに 8 つの部分に分割され、各部分はまさに各列でスキャンされるパターンになります。

LED の点灯状態から判断して、どの列をスキャンするかは、対応する PB ポートをロー レベルに設定し、他の PB ポートをハイ レベルに設定する必要があります。PA ポートはカラムのパターンに従って、点灯する必要がある LED ランプのアノードをハイ レベルに設定し、点灯する必要のない LED ランプのアノードをロー レベルに設定します。

点灯する必要のある LED を 1、点灯する必要のない LED を 0 とすると、文字コードは「H」となります。

0x00、0x7F、0x08、0x08、0x08、0x7F、// H

(C言語ではブール変数を直接定義できないため、各列の8個のLEDをByteとみなし、上位を下位ビット、下位を上位ビットとします。メカニズムは0x7Fです)

ここで、文字「H」のダイナミック スキャン スローモーション分解を実行します。

1. 列 1 をスキャンします。

PB: PB1 は 0 に設定され、その他は 1 (0xFE) に設定されます。

PA: 最初の列には点灯する LED がないため、すべて 0 (0x00) に設定されます。

短い遅延 (1ms)

 2. カラム 2 をスキャンします。

PB: PB2 は 0 に設定され、その他は 1 (0xFD) に設定されます。

PA: 2 列目の PA1 ~ PA7 を点灯する必要があるため、PA1 ~ PA7 を 1 に設定し、PA8 を 0 (0x7F) に設定します。

 短い遅延 (1ms)

3. 列 3 をスキャンします。

PB: PB3 は 0 に設定され、その他は 1 (0xFB) に設定されます。

PA: 3 列目で PA4 のみを点灯する必要があるため、PA4 を 1 に設定し、その他は 0 (0x08) に設定します。

 短い遅延 (1ms)

4. 列 4 をスキャンします。

PB: PB4 は 0 に設定され、その他は 1 (0xF7) に設定されます。

PA: 列 4 で PA4 のみを点灯する必要があるため、PA4 は 1 に設定され、その他は 0 (0x08) に設定されます。

 短い遅延 (1ms) 

5. 列 5 をスキャンします。

PB: PB5 は 0 に設定され、その他は 1 (0xEF) に設定されます。

PA: 列 5 で PA4 のみを点灯する必要があるため、PA4 は 1 に設定され、その他は 0 (0x08) に設定されます。

 短い遅延 (1ms)

6. 列 6 をスキャンします。

PB: PB6 は 0 に設定され、その他は 1 (0xDF) に設定されます。

PA: 6 列目の PA1 ~ PA7 を点灯する必要があるため、PA1 ~ PA7 を 1、PA8 を 0 (0x7F) に設定します。

 短い遅延 (1ms) 

(ASCII 文字を表示するには 6 列だけで十分なので、後の 2 列はすべてスキャンせずにスキャンできます)

6 列目のスキャンが完了すると、1ms 遅れてすぐに 1 列目のスキャンに戻ります。そして、上記のプロセスを常に繰り返します。

高速なスキャン速度と人間の目の視覚効果の持続性により、最終的な結果は 6 つのスキャンされた画像、つまり「H」の文字の重ね合わせになります。視覚効果の持続については、デジタル管に関する私の記事を参照してください。詳細な紹介が記載されています。

「H」の文字を表示する過程で 16 個のポートのハイレベルとローレベルが変化するため、この表示モードをダイナミック スキャンと呼びます。

他の文字を表示したい場合は、フォントに応じて対応するコードを取り出すことができます。

ここでは、次のようにすべての ASCII 文字をエンコードし、127*6 配列に入れます。

unsigned char Dictionary_ASCII8x6[127][6]=
{
	0,0,0,0,0,0,//0	
	0,0,0,0,0,0,//1	
	0,0,0,0,0,0,//2	
	0,0,0,0,0,0,//3	
	0,0,0,0,0,0,//4	
	0,0,0,0,0,0,//5	
	0,0,0,0,0,0,//6	
	0,0,0,0,0,0,//7	
	0,0,0,0,0,0,//8	
	0,0,0,0,0,0,//9	
	0,0,0,0,0,0,//10	
	0,0,0,0,0,0,//11	
	0,0,0,0,0,0,//12	
	0,0,0,0,0,0,//13	
	0,0,0,0,0,0,//14	
	0,0,0,0,0,0,//15	
	0,0,0,0,0,0,//16	
	0,0,0,0,0,0,//17	
	0,0,0,0,0,0,//18	
	0,0,0,0,0,0,//19	
	0,0,0,0,0,0,//20	
	0,0,0,0,0,0,//21	
	0,0,0,0,0,0,//22	
	0,0,0,0,0,0,//23	
	0,0,0,0,0,0,//24	
	0,0,0,0,0,0,//25	
	0,0,0,0,0,0,//26	
	0,0,0,0,0,0,//27	
	0,0,0,0,0,0,//28	
    0,0,0,0,0,0,//29	
	0,0,0,0,0,0,//30	
	0,0,0,0,0,0,//31   //0-31为回车、换行等特殊功能

	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//32	空格
	0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,//33 !	
	0x00, 0x00, 0x07, 0x00, 0x07, 0x00,//34 "	
	0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,//35 #	
	0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,//36 $	
	0x00, 0x23, 0x13, 0x08, 0x64, 0x62,//37 %	
	0x00, 0x36, 0x49, 0x55, 0x22, 0x50,//38 &	
	0x00, 0x00, 0x05, 0x03, 0x00, 0x00,//39 '	
	0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,//40 (	
	0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,//41 )	
	0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,//42 *	
	0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,//43 +	
	0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,//44 ,	
	0x00, 0x08, 0x08, 0x08, 0x08, 0x08,//45 -	
	0x00, 0x00, 0x60, 0x60, 0x00, 0x00,//46 .	
	0x00, 0x20, 0x10, 0x08, 0x04, 0x02,//47 /	
	0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,//48 0
	0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,//49 1	
	0x00, 0x42, 0x61, 0x51, 0x49, 0x46,//50 2	
	0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,//51 3	
	0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,//52 4	
	0x00, 0x27, 0x45, 0x45, 0x45, 0x39,//53 5	
	0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,//54 6	
	0x00, 0x01, 0x71, 0x09, 0x05, 0x03,//55 7	
	0x00, 0x36, 0x49, 0x49, 0x49, 0x36,//56 8	
	0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,//57 9	
	0x00, 0x00, 0x36, 0x36, 0x00, 0x00,//58 :	
	0x00, 0x00, 0x56, 0x36, 0x00, 0x00,//59 ;	
	0x00, 0x08, 0x14, 0x22, 0x41, 0x00,//60 <	
	0x00, 0x14, 0x14, 0x14, 0x14, 0x14,//61 =	
	0x00, 0x00, 0x41, 0x22, 0x14, 0x08,//62 >	
	0x00, 0x02, 0x01, 0x51, 0x09, 0x06,//63 ?	
	0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,//64 @	
	0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,//65 A	
	0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,//66 B	
	0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,//67 C	
	0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,//68 D	
	0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,//69 E	
	0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,//70 F	
	0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,//71 G	
	0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,//72 H	
	0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,//73 I	
	0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,//74 J	
	0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,//75 K	
	0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,//76 L	
	0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,//77 M	
	0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,//78 N	
	0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,//79 O	
	0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,//80 P	
	0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,//81 Q	
	0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,//82 R	
	0x00, 0x46, 0x49, 0x49, 0x49, 0x31,//83 S	
	0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,//84 T	
	0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,//85 U	
	0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,//86 V	
	0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,//87 W	
	0x00, 0x63, 0x14, 0x08, 0x14, 0x63,//88 X	
	0x00, 0x07, 0x08, 0x70, 0x08, 0x07,//89 Y	
	0x00, 0x61, 0x51, 0x49, 0x45, 0x43,//90 Z	
	0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,//91 [	
	0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,/*92 \	*/
	0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,//93 ]	
	0x00, 0x04, 0x02, 0x01, 0x02, 0x04,//94 ^	
	0x00, 0x40, 0x40, 0x40, 0x40, 0x40,//95 _	
	0x00, 0x00, 0x01, 0x02, 0x04, 0x00,//96 '	
	0x00, 0x20, 0x54, 0x54, 0x54, 0x78,//97 a	
	0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,//98 b	
	0x00, 0x38, 0x44, 0x44, 0x44, 0x20,//99 c	
	0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,//100 d	
	0x00, 0x38, 0x54, 0x54, 0x54, 0x18,//101 e	
	0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,//102 f	
	0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,//103 g	
	0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,//104 h	
	0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,//105 i	
	0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,//106 j	
	0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,//107 k	
	0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,//108 l	
	0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,//109 m	
	0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,//110 n	
	0x00, 0x38, 0x44, 0x44, 0x44, 0x38,//111 o	
	0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,//112 p	
	0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,//113 q	
	0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,//114 r	
	0x00, 0x48, 0x54, 0x54, 0x54, 0x20,//115 s	
	0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,//116 t	
	0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,//117 u	
	0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,//118 v	
	0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,//119 w	
	0x00, 0x44, 0x28, 0x10, 0x28, 0x44,//120 x	
	0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,//121 y	
	0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,//122 z	
	0x00,	0x08,	0x77,	0x41,	0x00,	0x00,//123	{
	0x00,	0x08,	0x7F,	0x00,	0x00,	0x00,//124	|
	0x00,	0x41,	0x77,	0x08,	0x00,	0x00,//125	}
	0x00,	0x08,	0x04,	0x08,	0x10,	0x08 //126	~
};

このようにして、任意の ASCII 文字を表示できます。

ここでは単純な Printf_ASCII() 関数をカプセル化しています。この関数を呼び出すと、括弧内の文字が表示されます (文字は英語の二重引用符で追加する必要があることに注意してください)。

void Printf_ASCII(char Indexes)        //输出ASCII字符函数
{
	int X_axis[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};	
	int x;
	while(1)
    {
        for(x=0;x<6;x++)        //循环按列扫描
	    {
	    	GPIO_Write(GPIOB, X_axis[x]<<1);			//左移一位
		    GPIO_Write(GPIOA, Dictionary_ASCII8x6[Indexes][x]<<1);	// 在ASCII字符数组中寻码
		    Delay_ms(1);
		    GPIO_Write(GPIOA, 0);		//清码,防止串码
	    }
    }   
}

PAとPBはPA0とPB0から開始し、PA1とPB1から配線を開始するため、上記の列と行は左シフト処理になります。GPIO_Write 関数は PA0 ~ PA15 および PB0 ~ PB15 の 16 ビットで動作するため、1 ビット左にシフトした後に PA1 ~ PA8 を整列させるだけです。PA0~PA7、PB0~PB7に接続した場合は1ビット左にシフトする必要はありません。

ドット マトリックスの走査原理を理解すると、OLED またはその他のスクリーンはこれに基づいており、複数の 8*8 ドット マトリックスのつなぎ合わせとして見ることができますが、より多くの列と行を走査します。

以下では、SSD1603 で駆動される 0.96 インチ OLED スクリーンを例として、OLED の使用について説明します。

おすすめ

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