Pantalla dinámica de tubo digital de 4 dígitos en modo de interrupción de reloj arduino

    En general, mostramos números en la placa de desarrollo de arduino y, por lo general, usamos tubos digitales de varios dígitos para mostrarlos, pero los tubos digitales de varios dígitos en realidad usan el método de "visualización de escaneo dinámico" para mostrar, es decir, el primer tubo digital y el segundo tubo digital se muestra en secuencia.tubo, el tercer tubo digital, el cuarto tubo digital... Este método es para utilizar el residuo visual del ojo humano.Cuando la frecuencia de visualización de exploración es superior a 25 fotogramas por segundo, ¿qué lo que vemos es que cada tubo digital se visualiza al mismo tiempo. En la actualidad, la mayoría de los programas de muestra de arduino se muestran continuamente en el bucle principal, pero hay un gran problema con este enfoque. Si un bucle en el bucle principal necesita ejecutarse durante mucho tiempo (más de 40 ms), la frecuencia de visualización será inferior a 25 fotogramas por segundo, por lo que la pantalla mostrada se agita e incluso el contenido salta.

    Para garantizar que la frecuencia de visualización sea superior a 25 fotogramas por segundo, podemos utilizar la interrupción del reloj de arduino para realizar una "visualización de exploración dinámica". En primer lugar, es necesario establecer un intervalo de interrupción de reloj adecuado, cada interrupción muestra un tubo digital y el requisito mínimo de visualización de 25 cuadros por segundo, el intervalo de tiempo de interrupción debe ser inferior a 10 ms (1000 ms/4/25), para mejorar la calidad de visualización, este programa utiliza El intervalo de interrupción es de 5 ms.

    Este experimento utiliza arduino UNO, y el tubo digital de 4 dígitos utilizado es un cátodo común 3641AS. El siguiente es el diagrama de pines del tubo:

    (Subí la imagen durante media hora y aún no está terminada, conéctese en línea para encontrar el diagrama de pines del tubo)

   Para facilitar el cableado, conecte los pines 1 a 12 de 3641AS a D2 a D13 de arduino a su vez. El diagrama de cableado real es el siguiente:

    (La foto la subí durante media hora y aún no la he terminado. Solo necesitas conectar los pines 1 a 12 del 3641AS a los 12 puertos IO D2 a D13 de arduino UNO)

    El programa completo (que fue probado) es el siguiente:

#include<MsTimer2.h> //llama al archivo de biblioteca del temporizador T2

/*

  Usando el método de interrupción del reloj, el tubo digital de 4 dígitos muestra dinámicamente el programa 0-9999

  Ventaja: la función de retardo se puede utilizar arbitrariamente en el bucle principal

  

  El puerto controla directamente el tubo digital de cátodo común de 4 bits y, por lo general, no se necesita una resistencia limitadora de corriente externa.

  Debido a que la corriente de salida del puerto es limitada, generalmente no más de 20 mA, se recomienda agregar una resistencia limitadora de corriente para uso a largo plazo.

*/

int ledCount=8;//tubo digital de 8 segmentos

int segCount=4;//4 tubo digital

//largo anteriorMillis = 0;

//Defina el código de segmento, aquí está el código de segmento negativo común, puede usar el software de código de segmento de tubo digital para cambiar el valor de matriz o mostrar cualquier forma

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

// código de bits

//caracter sin firmar const dofly_WeiMa[]={0,1,2,3};

pines led int[] = {

  12,8,5, 3, 2, 11, 6, 4, }; // 11,7,4,2,1,10,5,3 El número real de pines del tubo digital, igual que el chip , contando en sentido antihorario

int segPins[] = {

  13,10,9,7}; //12,9,8,6 El número real de pines del tubo digital, igual que el chip, en sentido contrario a las agujas del reloj

char sin firmar displayTemp[4];//muestra el búfer, almacena el código del segmento

configuración vacía () {

// Ajustes de bucle, establecer los puertos correspondientes como salida

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

    pinMode(ledPins[esteLed], SALIDA); }

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

    pinMode(segPins[thisSeg], OUTPUT);

  }

  MsTimer2::set(5, Timedisp); //Defina Timedisp como una subrutina llamada por la interrupción del reloj y active la interrupción del reloj cada 5 ms para ingresar a la función Timedisp

  MsTimer2::start(); //La interrupción del reloj comienza

}

// Procesamiento de datos, escriba los datos de bytes que se procesarán en el puerto pin correspondiente.

trato nulo (valor de carácter sin firmar) {

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

    digitalWrite(ledPins[i],bitRead(value,i));//usa la función bitWrite, muy simple

    // !bitRead(valor,i), ¡agregar al frente aquí! (símbolo de no funcionamiento), según se utilice el tubo digital de cátodo común o de ánodo común.

}

// El programa de visualización llamado por la interrupción del reloj

//Cada interrupción, muestra un valor de código de segmento en displayTemp[0]—displayTemp[3] una vez

void Timedisp() {

  int estático i;

  trato(0);// Limpiar el "fantasma"

  for(int a=0;a<segCount;a++) //Ciclo de código de bits de escritura, solo un tubo digital se activa en cualquier momento, todos se cierran antes y luego se activa el tubo digital requerido

    digitalWrite(segPins[a],1);//Cerrar todos los tubos digitales

  digitalWrite(segPins[i],0);//Seleccione el tubo digital correspondiente

  deal(displayTemp[i]);//Lee el valor del código de segmento correspondiente y escribe en el tubo digital correspondiente

  yo++;

  if(i==segCount) //reciclar después de 4 dígitos

    yo=0;

}

//Mostrar programa, mostrar num en 4 dígitos, num es menor que 10000

void disp (número largo sin firmar) {

  num=num%10000;//operación de módulo para evitar que num supere 9999

  displayTemp[0]=dofly_DuanMa[num/1000]; //Envía el valor del código de segmento de un dígito de num para mostrar el búfer displayTemp[0]

  displayTemp[1]=dofly_DuanMa[(num%1000)/100]; //Envía el valor del código de segmento de diez dígitos de num para mostrar el búfer displayTemp[1]

  displayTemp[2]=dofly_DuanMa[((num%1000)%100)/10]; //Envía el valor del código de segmento de cientos de dígitos de num para mostrar el búfer displayTemp[2]

  displayTemp[3]=dofly_DuanMa[((num%1000)%100)%10]; //Envía el valor del código de segmento de miles de dígitos de num para mostrar el búfer displayTemp[3]

}

// bucle principal

bucle vacío () {

    static unsigned int num;//Definir un dato

    disp(número);

    número++;

    retraso(100); //Retraso 100ms

}

Supongo que te gusta

Origin blog.csdn.net/m0_61543203/article/details/126129038
Recomendado
Clasificación