El circuito de conducción de 7 segmentos no funciona como se esperaba

0

He diseñado y construido el siguiente circuito de conducción de 7 segmentos utilizando un Arduino Micro para intentar comprender mejor el diseño del circuito electrónico:

simular este circuito : esquema creado usando CircuitLab

Al encenderlo y aplicar una tensión HIGH a las entradas \ $ \ text {LT} \ $ y \ $ \ text {BI} \ $ y una tensión LOW a la \ $ \ text {LE } \ $ input, independientemente del código BCD que suministre al CD4511BE BCD al controlador de pantalla de 7 segmentos, la pantalla LED parpadea mientras se muestra \ $ 0 \ $. Si configuro la entrada \ $ \ text {LE} \ $ en HIGH , entonces la pantalla LED ya no parpadea, sino que solo muestra \ $ 0 \ $.

Aquí está el código de prueba para el Arduino que estoy usando:

void setup()
{
  pinMode( 2, OUTPUT );
  pinMode( 3, OUTPUT );
  pinMode( 4, OUTPUT );
  pinMode( 5, OUTPUT );
  pinMode( 6, OUTPUT );
  pinMode( 7, OUTPUT );
  pinMode( 8, OUTPUT );
}

void loop()
{
  digitalWrite( 6, HIGH );
  digitalWrite( 7, HIGH );  

  for( int i = 0; i < 10; ++i )
  {
    digitalWrite( 8, LOW );
    digitalWrite( 2, i & 0x0001 != 0 ? HIGH : LOW );
    digitalWrite( 3, i & 0x0002 != 0 ? HIGH : LOW );
    digitalWrite( 4, i & 0x0004 != 0 ? HIGH : LOW );
    digitalWrite( 5, i & 0x0008 != 0 ? HIGH : LOW );
    digitalWrite( 8, HIGH );
    delay( 1000 );
  }

}

Más información: el siguiente código funciona como se esperaba:

void setup()
{
  pinMode( 2, OUTPUT );
  pinMode( 3, OUTPUT );
  pinMode( 4, OUTPUT );
  pinMode( 5, OUTPUT );
  pinMode( 6, OUTPUT );
  pinMode( 7, OUTPUT );
  pinMode( 8, OUTPUT );
}

void loop()
{
  digitalWrite( 6, HIGH );
  digitalWrite( 7, HIGH );

  digitalWrite( 2, HIGH );
  digitalWrite( 3, HIGH );
  digitalWrite( 4, LOW );
  digitalWrite( 5, LOW );
  digitalWrite( 8, HIGH );
  delay( 1000 );

  digitalWrite( 8, LOW );
  digitalWrite( 2, HIGH );
  digitalWrite( 3, LOW );
  digitalWrite( 4, HIGH );
  digitalWrite( 5, LOW );
  digitalWrite( 8, HIGH );
  delay( 1000 );
}
    
pregunta Thomas Russell

1 respuesta

3

Desde el primer vistazo y una mirada a la hoja de datos, en general, esto parece estar bien. Pero el Arduino no es exactamente ágil al cambiar esas salidas y mientras están cambiando (con LE bajo), las salidas también estarán cambiando. ¿Podría ser eso lo que quiere decir con pantalla "parpadeante"? Supongo que la pantalla no es realmente intermitente, solo está cambiando lo suficientemente lentamente como para que la veas como un gran desastre.

Para empezar, sugiero que se establezca el pin 8 ALTO, lo que bloqueará cualquier cambio de los pines BCD, luego cambiará todas las salidas BCD y finalmente se configurará el pin 8 LOW para reflejar esos cambios. Luego demora y repite. Algo como esto tal vez:

Nota importante de su código: al menos en C, & tiene menor precedencia que! =. Así que la expresión:

i & 0x1 != 0

resuelto como si hubieras escrito:

i & (0x1 != 0)

que es:

i & 1

Esa es una trampa que he visto antes. Use corchetes para indicar claramente lo que quiere decir y siempre hágalo donde & y | está preocupado, especialmente si hay un == o! = cerca. Lo he cambiado a continuación:

  ...
  for( int i = 0; i < 10; ++i )
  {
    digitalWrite( 8, HIGH );
    digitalWrite( 2, ((i & 0x0001) != 0) ? HIGH : LOW );
    digitalWrite( 3, ((i & 0x0002) != 0) ? HIGH : LOW );
    digitalWrite( 4, ((i & 0x0004) != 0) ? HIGH : LOW );
    digitalWrite( 5, ((i & 0x0008) != 0) ? HIGH : LOW );
    digitalWrite( 8, LOW );
    delay( 1000 );
  }
    
respondido por el carveone

Lea otras preguntas en las etiquetas