4-stellige digitale Röhren-Dynamikanzeige im Arduino-Clock-Interrupt-Modus

    Im Allgemeinen zeigen wir Zahlen auf der Arduino-Entwicklungsplatine an und verwenden normalerweise mehrstellige digitale Röhren zur Anzeige, aber mehrstellige digitale Röhren verwenden tatsächlich die Methode der „dynamischen Scan-Anzeige“ zur Anzeige, dh die ersten digitalen Röhren und Die zweite digitale Röhre wird nacheinander angezeigt. Röhre, die dritte digitale Röhre, die vierte digitale Röhre ... Diese Methode besteht darin, den visuellen Rest des menschlichen Auges zu nutzen. Wenn die Scan-Anzeigefrequenz größer als 25 Bilder pro Sekunde ist, was Wir sehen, dass jede digitale Röhre gleichzeitig angezeigt wird. Derzeit werden die meisten Arduino-Beispielprogramme kontinuierlich in der Hauptschleife angezeigt, es gibt jedoch ein großes Problem bei diesem Ansatz. Wenn eine Schleife in der Hauptschleife längere Zeit laufen muss (mehr als 40 ms), liegt die Anzeigefrequenz unter 25 Bildern pro Sekunde, sodass die angezeigte Anzeige ruckelt und selbst der Inhalt springt.

    Um sicherzustellen, dass die Anzeigefrequenz größer als 25 Bilder pro Sekunde ist, können wir den Taktinterrupt von Arduino verwenden, um eine „dynamische Scananzeige“ durchzuführen. Zunächst muss ein geeignetes Taktunterbrechungsintervall eingestellt werden, jede Unterbrechung zeigt eine digitale Röhre an und die Mindestanzeigeanforderung beträgt 25 Bilder pro Sekunde. Das Unterbrechungszeitintervall muss weniger als 10 ms (1000 ms/4/25) betragen. Um die Anzeigequalität zu verbessern, verwendet dieses Programm Das Interrupt-Intervall beträgt 5 ms.

    Dieses Experiment verwendet Arduino UNO und die verwendete 4-stellige digitale Röhre ist eine gemeinsame Kathode 3641AS. Das Folgende ist das Pin-Diagramm der Röhre:

    (Ich habe das Bild eine halbe Stunde lang hochgeladen und es ist noch nicht fertig. Bitte gehen Sie online, um das Pin-Diagramm der Röhre zu finden.)

   Zur Vereinfachung der Verkabelung verbinden Sie nacheinander die Pins 1 bis 12 des 3641AS mit D2 bis D13 des Arduino. Der tatsächliche Verdrahtungsplan sieht wie folgt aus:

    (Ich habe das Bild eine halbe Stunde lang hochgeladen und bin immer noch nicht fertig. Sie müssen nur die 1 bis 12 Pins von 3641AS mit den 12 IO-Ports D2 bis D13 von Arduino UNO verbinden.)

    Das vollständige Programm (das getestet wurde) lautet wie folgt:

#include<MsTimer2.h> //die Bibliotheksdatei des Timers T2 aufrufen

/*

  Mithilfe der Clock-Interrupt-Methode zeigt die 4-stellige digitale Röhre dynamisch das Programm 0-9999 an

  Vorteil: Die Verzögerungsfunktion kann in der Hauptschleife beliebig verwendet werden

  

  Der Port treibt direkt die 4-Bit-Digitalröhre mit gemeinsamer Kathode an, und im Allgemeinen ist kein externer Strombegrenzungswiderstand erforderlich.

  Da der Ausgangsstrom des Ports begrenzt ist und im Allgemeinen nicht mehr als 20 mA beträgt, wird für den Langzeitgebrauch empfohlen, einen Strombegrenzungswiderstand hinzuzufügen.

*/

int ledCount=8;//8-Segment-Digitalröhre

int segCount=4;//4 digitale Röhre

//long previousMillis = 0;

// Definieren Sie den Segmentcode. Hier ist der übliche negative Segmentcode. Mit der Segmentcode-Software für digitale Röhren können Sie den Array-Wert ändern oder eine beliebige Form anzeigen

const unsigned char dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

// Bitcode

//unsigned char const dofly_WeiMa[]={0,1,2,3};

int ledPins[] = {

  12,8,5, 3, 2, 11, 6, 4, }; // 11,7,4,2,1,10,5,3 Die tatsächliche Anzahl der Pins der digitalen Röhre entspricht der des Chips , gegen den Uhrzeigersinn zählend

int segPins[] = {

  13,10,9,7}; //12,9,8,6 Die tatsächliche Anzahl der Pins der digitalen Röhre, die gleiche wie der Chip, gegen den Uhrzeigersinn

unsigned char displayTemp[4];//Puffer anzeigen, Segmentcode speichern

void setup() {

// Schleifeneinstellungen, legen Sie die entsprechenden Ports als Ausgang fest

  for (int thisLed = 0; thisLed < ledCount; thisLed++) {

    pinMode(ledPins[thisLed], OUTPUT); }

  for (int thisSeg = 0; thisSeg < segCount; thisSeg++) {

    pinMode(segPins[thisSeg], OUTPUT);

  }

  MsTimer2::set(5, Timedisp); // Definieren Sie Timedisp als Unterroutine, die vom Clock-Interrupt aufgerufen wird, und lösen Sie den Clock-Interrupt alle 5 ms aus, um die Timedisp-Funktion aufzurufen

  MsTimer2::start(); //Der Uhr-Interrupt startet

}

// Datenverarbeitung, schreiben Sie die zu verarbeitenden Bytedaten in den entsprechenden Pin-Port.

void Deal(unsigned char value){

  for(int i=0;i<8;i++)

    digitalWrite(ledPins[i],bitRead(value,i));//Verwenden Sie die BitWrite-Funktion, sehr einfach

    // !bitRead(value,i), hier vorne hinzufügen! (Nicht-Betriebssymbol), abhängig davon, ob die Digitalröhre mit gemeinsamer Kathode oder gemeinsamer Anode verwendet wird.

}

// Das vom Taktinterrupt aufgerufene Anzeigeprogramm

//Bei jedem Interrupt wird einmal ein Segmentcodewert in displayTemp[0]–displayTemp[3] angezeigt

void Timedisp() {

  static int i;

  deal(0);// Den „Geist“ löschen

  for(int a=0;a<segCount;a++) //Zyklus beim Schreiben des Bitcodes, es wird immer nur eine digitale Röhre gestrobt, alle werden vorher geschlossen, und dann wird die erforderliche digitale Röhre angesteuert

    digitalWrite(segPins[a],1);//Alle digitalen Röhren schließen

  digitalWrite(segPins[i],0);//Wählen Sie die entsprechende digitale Röhre aus

  Deal(displayTemp[i]);//Lesen Sie den entsprechenden Segmentcodewert und schreiben Sie ihn in die entsprechende digitale Röhre

  i++;

  if(i==segCount) //recyceln nach 4 Ziffern

    ich=0;

}

//Programm anzeigen, Nummer in 4 Ziffern anzeigen, Nummer ist kleiner als 10000

void disp(unsigned long num) {

  num=num%10000;//Modulo-Operation, um zu verhindern, dass num 9999 überschreitet

  displayTemp[0]=dofly_DuanMa[num/1000]; //Sende den einstelligen Segmentcodewert von num an den Anzeigepuffer displayTemp[0]

  displayTemp[1]=dofly_DuanMa[(num%1000)/100]; //Sende den zehnstelligen Segmentcodewert von num an den Anzeigepuffer displayTemp[1]

  displayTemp[2]=dofly_DuanMa[((num%1000)%100)/10]; //Sende den Hunderter-Segment-Codewert von num an den Anzeigepuffer displayTemp[2]

  displayTemp[3]=dofly_DuanMa[((num%1000)%100)%10]; //Sende den tausendstelligen Segmentcodewert von num an den Anzeigepuffer displayTemp[3]

}

// Hauptschleife

void loop() {

    static unsigned int num;//Daten definieren

    disp(Anzahl);

    num++;

    Verzögerung(100); //Verzögerung 100ms

}

Guess you like

Origin blog.csdn.net/m0_61543203/article/details/126129038