Last active
May 20, 2021 23:00
-
-
Save Red0214/e26a50fc64ae2ec7e4df4ad4a18a78f2 to your computer and use it in GitHub Desktop.
Multiplexacion de dos displays 7 segmentos
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* MULTIPLEXACION DE DOS DISPLAYS 7 SEGMENTOS - CONTEO ASCENDENTE Y DESCENDENTE | |
| Por: Jonathan Rivas. | |
| En este codigo se explica detalladamente como realizar la multiplexacion para dos | |
| dos displays 7 segmentos catodo comun, realizando un conteo ascendente de 0 a 99 y descendente | |
| de 99 a 0. | |
| No es necesario el uso de librerias, ya que el proposito de este codigo es hacerlo lo mas | |
| simple posible para el usuario. El codigo sin lineas de texto, ocupa un espacio aproximado | |
| de 60 lineas de codigo. | |
| IMPORTANTE: Este programa fue probado con la placa Arduino UNO, si usted desea utilizar algun otro | |
| modelo de la placa, deberá de configurar las conexiones del array "numeros", y los registros "DDRD" | |
| y "PORTD" al puerto a utilizar en su respectiva placa. */ | |
| /* Se configura el vector para poder mostrar los numeros en el display | |
| de siete segmentos. En este caso utilizare el puerto D de Arduino UNO.*/ | |
| byte numeros[10] = { | |
| /* Conexiones para diplay 7 segmentos: | |
| gfedcab*/ | |
| 0b01111110, // Numero 0 | |
| 0b00001010, // Numero 1 | |
| 0b10110110, // Numero 2 | |
| 0b10011110, // Numero 3 | |
| 0b11001010, // Numero 4 | |
| 0b11011100, // Numero 5 | |
| 0b11111100, // Numero 6 | |
| 0b00001110, // Numero 7 | |
| 0b11111110, // Numero 8 | |
| 0b11011110}; // Numero 9 | |
| // Creamos las variables que seran utiles para el programa. | |
| #define NPNU 15 // Transistor NPN para display de las unidades. | |
| #define NPND 14 // Transistor NPN para display de las decenas. | |
| #define ASCENDENTE 9 // Pulsador para conteo ascendente. | |
| #define DESCENDENTE 8 // Pulsador para conteo descendente. | |
| int conteouni = 0; // Numero que se mostrara en el display de unidades. | |
| int conteodec = 0; // Numero que se mostrara en el display de decenas. | |
| int estasc, estdesc; // Variables para almacenar las lecturas digitales de los pulsadores. | |
| int tiempo = 0; // Ya que no podemos usar libremente la funcion "delay()" en este codigo, usaremos una variable. | |
| // Declaramos los pines como entradas o salidas. | |
| void setup(){ | |
| DDRD = 0b11111110; // Declaramos los pines como salidas, excepto por uno, que sera el sobrante del puerto D. | |
| pinMode(NPNU, OUTPUT); // Transistor NPN para display de unidades como salida. | |
| pinMode(NPND, OUTPUT); // Transistor NPN para display de decenas como salida. | |
| pinMode(ASCENDENTE, INPUT); // Pulsador para conteo ascendente como entrada. | |
| pinMode(DESCENDENTE, INPUT); // Pulsador para conteo descendente como entrada. | |
| } | |
| // Aqui inicia la parte del funcionamiento del programa | |
| void loop(){ | |
| estasc = digitalRead(ASCENDENTE); // Guardamos en la variable la lectura digital de "ASCENDENTE". | |
| estdesc = digitalRead(DESCENDENTE); // Guardamos en la variable la lectura digital de "DESCENDENTE". | |
| // Si ambos pulsadores estan presionados la condicion es invalida. No aumenta ni disminuye. | |
| if(estasc == 1 && estdesc == 1){ | |
| PORTD = 0b00000000; | |
| delay(1000); | |
| // Si "estasc" esta en nivel alto, el conteo de unidades aumenta en 1. | |
| }if(estasc == 1){ | |
| conteouni++; | |
| /* Si el conteo de unidades es mayor que 9, el conteo de unidades se reinicia a 0 de nuevo y el | |
| conteo de decenas aumenta en 1. */ | |
| if(conteouni > 9){ | |
| conteouni = 0; | |
| conteodec++; | |
| // Si el conteo de decenas es mayor que 9, se reinicia y vuelve a 0. | |
| if(conteodec > 9){ | |
| conteodec = 0; | |
| } | |
| } | |
| // Si "estdesc" esta en nivel alto, el conteo de unidades disminuye en 1. | |
| }if(estdesc == 1){ | |
| conteouni--; | |
| /* Si el conteo de unidades es menor que 0, el conteo de unidades se reinicia a 0 de nuevo y el | |
| conteo de decenas disminuye en 1. */ | |
| if(conteouni < 0){ | |
| conteouni = 9; | |
| conteodec--; | |
| // Si el conteo de decenas es menor que 0, se reinicia y vuelve a 9. | |
| if(conteodec < 0){ | |
| conteodec = 9; | |
| } | |
| } | |
| /* Ya que la funcion "delay()" afecta de manera significativa la visualizacion de la multiplexacion | |
| se utiliza un ciclo while para poder controlar el tiempo en que es posible cambiar de digito al | |
| presionar uno de los pulsadores. | |
| Para poder calcular este tiempo, se suman los dos tiempos de "delay()" dentro del ciclo while y se | |
| multiplican por el tiempo en la condicion del while. | |
| Formula: tiempo = 2 * delay * tiempo en condicion de while | |
| En este caso: tiempo = 2 * 10 * 20 = 400 milisegundos*/ | |
| }while(tiempo < 20){ // Se puede cambiar de digito cada 400 milisegundos. | |
| // Se activa el transistor de unidades y se desactiva en de decenas durante 10 milisegundos. | |
| digitalWrite(NPNU, HIGH); | |
| digitalWrite(NPND, LOW); | |
| PORTD = numeros[conteouni]; | |
| delay(10); | |
| // Se activa el transistor de decenas y se desactiva el de unidades durante 10 milisegundos. | |
| digitalWrite(NPNU, LOW); | |
| digitalWrite(NPND, HIGH); | |
| PORTD = numeros[conteodec]; | |
| delay(10); | |
| tiempo++; | |
| // Al salir del while, el tiempo debe de igualarse a 0 de nuevo para evitar un error visual. | |
| }tiempo = 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
si sirve