martes, 12 de julio de 2022

El display de 7 segmentos I (IDE Arduino)

Se trata de un display de cuatro dígitos en el que, principalmente, podemos visualizar números y también algunas letras y símbolos. Cada uno de los dígitos está compuesto por 8 diodos LED, los 7 segmentos y el punto decimal. Estos diodos se encienden con un "0" y permanecen apagados cuando se les suministra un "1".

En la figura adjunta podemos apreciar el nombre de los segmentos, su orden y los códigos binarios de 7 segmentos correspondientes a algunos números y letras. 

   a b c d e f g p
2  0 0 1 0 0 1 1 0
8  0 0 0 0 0 0 0 0
L  1 1 1 0 0 0 1 0
A  0 0 0 1 0 0 0 0


Para encender el número "2". en el dígito más a la izquierda del shield multifunción, Arduino debe enviar dos códigos binarios, el de 7 segmentos del número "2" (00100101) y otro para indicar cual es el dígito que se enciende, en este caso, el situado a la izquierda (10000000). Estos códigos se envían en serie, un bit tras otro, a través del pin 8, utilizando la instrucción "siftOut" que se encarga de hacer todo el proceso. Además son necesarios dos pines más, el pin 4, (una especie de permiso que se activa cuando está en "0", tenemos que hacerlo nosotros) y el pin 7 (unos pulsos de reloj para indicar cuando son válidos cada uno de los bit); de este pin y de generar esos pulsos se encarga la propia instrucción "siftOut". En la imagen podemos ver este proceso:


En definitiva, el programa para visualizar el número 2 en el display de la izquierda quedaría de la siguiente manera:
/*
 * display2.ino
 * Visualiza el número 2 en el dígito más a la izquierda del display
 * de 7 segmentos.
 * Los leds del display se encienden con un cero y se apagan con un 1. 
 * El código del numero 2 sería: a b c d e f g p
 *                               0 0 1 0 0 1 0 1
 * Arduino envía los datos (DATA) al shield multifunción en serie, usando
 * el pin 7. A través del pin 8 manda unos pulsos de "reloj" (CLOCK)para 
 * indicar la validez de los datos presentes en el pin 7. Por último, el
 * pin 4 sirve de cerrojo (LATCH), para que el shield multifunción sepa
 * cuando empieza y termina la transmisión de datos.
 * Hay que enviar dos números: el primero se corresponde con el código
 * 7 segmentos que queremos visualizar, el segundo indica (con un 1) el
 * dígito que estará encendido.
 */

void setup (){
  pinMode(4,OUTPUT);     //LATCH, habilita recepción de datos
  pinMode(7,OUTPUT);     //DATA, para enviar los datos
  pinMode(8,OUTPUT);     //CLOK, indica cuando los datos son válidos
}
void loop(){
  digitalWrite(4,LOW);                   //Un 0 habilita la llegada de datos
  shiftOut(8, 7, LSBFIRST, B00100101);   //envía el código 7 segmentos
  shiftOut(8, 7, LSBFIRST, B10000000);   //envía el dígito que se enciende
  digitalWrite(4,HIGH);                  //Un 1 deshabilita la transmisión
}

Ahora vamos a mostrar el número "0134"; primero dígito a dígito y, posteriormente, con una pequeña modificación, los veremos los cuatro a la vez.

/*
 * display0134.ino
 * Vemos en el display los números 0, 1, 3 y 4, de uno en uno
 * a intervalos de 1 segundo. Cada número aparece en un dígito
 * diferente, el 0 en el más a la izquierda.
 * Para ver el número completo 0134 a la vez, tenemos que quitar
 * los retardos (delay) de 1 segundo. Se sigue encendiendo un solo
 * dígito, pero al no haber retardos y estar en un bucle que se
 * repite rapidísimamente nuestros ojos los ven todos encendidos.
 */

void setup (){
  pinMode(4,OUTPUT);     //LATCH
  pinMode(7,OUTPUT);     //DATA
  pinMode(8,OUTPUT);     //CLOCK
}

void loop(){
  digitalWrite(4,LOW); 
  shiftOut(8, 7, LSBFIRST, B00000011);    //el 0
  shiftOut(8, 7, LSBFIRST, B10000000);    //en el dígito de la izquierda
  digitalWrite(4,HIGH);
  delay(1000);
  digitalWrite(4,LOW); 
  shiftOut(8, 7, LSBFIRST, B10011111);    //el 1
  shiftOut(8, 7, LSBFIRST, B01000000);    //en el siguiente dígito
  digitalWrite(4,HIGH);
  delay(1000);
  digitalWrite(4,LOW); 
  shiftOut(8, 7, LSBFIRST, B00001101);    //el 3
  shiftOut(8, 7, LSBFIRST, B00100000);    //en el siguiente dígito
  digitalWrite(4,HIGH);
  delay(1000);
  digitalWrite(4,LOW); 
  shiftOut(8, 7, LSBFIRST, B10011001);    //el 4
  shiftOut(8, 7, LSBFIRST, B00010000);    //en el último de la derecha
  digitalWrite(4,HIGH);
  delay(1000);                            //quitar todos los delay
                                          //para ver los cuatro a la vez
}

Ejercicios propuestos:

1.- Escribir un programa que haga aparecer en el display (en el dígito más a la derecha) los números del 0 al 5 a intervalos de un segundo.

2.- Mostrar en el display la palabra "HOLA".

3.- Hacer un programa que vaya encendiendo y apagando de uno en uno los segmentos exteriores del display, dándole la vuelta completa: