質問: 共通のアノード7セグメント、4桁ディスプレイの使い方は? この疑問を例として、以下の(私自身の)答えにしてください。 私は7セグメント、4桁のLEDディスプレイを持っていますが、どのように配線するのかは分かりません。 私は共通の陽極/陰極の違いを理解していない、と私は奇妙なLEDごとに2つのピンがありません。 かなり最近、「7セグメント4桁の共通アノード」に関する質問が削除されました。 その瞬間、私は答えをタイプしていました。 しかし、私はまだあなたやあなたにそれを尋ねた人と答えを分けたいと思っています。 詳細は私の回答を確認/更新してください。 具体的に言えば、誰かが作業コードを追加できますか、現時点ではできません。
回答: ポールの答えを補うように、私は短いプログラムを書いて どのように彼の図の7セグメント4桁のディスプレイを駆動する: !wiring schematic これは実際には一般的な陰極ディスプレイであるため、プログラムでは、 図の特定の配線だけでなく、興味深い部分は 定期的に呼び出される `refresh_display()`関数です。 アルゴリズムは次のとおりです。 * 数字の1つに適切な信号を入力して7つのアノードを駆動します 我々は * `HIGH` を設定すると、 NPNトランジスタ * 2.5ミリ秒間待つ(100 Hzのリフレッシュレートの場合) * カソード制御出力を `LOW` に設定します * 次の桁に移動します。 待機はCPUをブロックすることなく、 吹き飛ばしに記載されている技術を使用して 遅延 Arduino チュートリアル。ここにプログラムがあります: ``` const int NB_DIGITS = 4; //4-digit display const int FIRST_ANODE = 2; //anodes a..g on pins 2..8 const int FIRST_CATHODE = 9; //cathodes, right to left, on pins 9..12 // Digits to display, from right to left. uint8_t digits[NB_DIGITS]; // Set all the used pins as outputs. void init_display() { for (int i = 0; i < 7; i++) pinMode(FIRST_ANODE + i, OUTPUT); for (int i = 0; i < NB_DIGITS; i++) pinMode(FIRST_CATHODE + i, OUTPUT); } // This should be called periodically. void refresh_display() { //Our 7-segment "font". static const uint8_t font[10] = { //abcdefg 0b1111110,//0 0b0110000,//1 0b1101101,//2 0b1111001,//3 0b0110011,//4 0b1011011,//5 0b1011111,//6 0b1110000,//7 0b1111111,//8 0b1111011 //9 }; //Wait for 2.5 ms before switching digits. static uint32_t last_switch; uint32_t now = micros(); if (now - last_switch < 2500) return; last_switch = now; //Switch off the current digit. static uint8_t pos; digitalWrite(FIRST_CATHODE + pos, LOW); //Set the anodes for the next digit. pos = (pos + 1) % NB_DIGITS; uint8_t glyph = font[digits[pos]]; for (int i = 0; i < 7; i++) digitalWrite(FIRST_ANODE + i, glyph & 1 << (6-i)); //Switch digit on. digitalWrite(FIRST_CATHODE + pos, HIGH); } /*********************************************************************** * Example usage. */ void setup() { init_display(); } void loop() { uint32_t now = millis(); //Change the number displayed every second. static uint32_t last_change; if (now - last_change >= 1000) { digits[3] = digits[2]; digits[2] = digits[1]; digits[1] = digits[0]; digits[0] = (digits[0] + 1) % 10; last_change = now; } refresh_display(); } ``` Paulは、チュートリアルに関するリンクを提供しました。 パララックス それは Multiplex7Seg Arduinoライブラリ。そのライブラリは、サンプルコードよりも一般的です これは、使用されるピンについては仮定していないためです。しかし、大きな ライブラリとこのコードの違いはタイミングです 管理されている: * ライブラリはTimer 2のオーバーフロー割り込みによって駆動されます。これはすべきである 1つのタイマーを犠牲にして、非常に安定したタイミングを提供する この仕事に専念しています。 * 上記のコードは、 `refresh_display()`を頻繁に呼び出すユーザに依存しています 十分な。専用のハードウェアリソースは必要ありませんが、 `loop()`に時間がかかりすぎるプログラムではうまくいきません。 あなたが `delay()`を呼び出すのが好きではありません。