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
}