You are on page 1of 6

2.

5 MANEJO DE DISPLAY DE 7 SEGMENTOS


Para visualizar los datos en un display de 7 segmentos, existen dos
posibilidades.

Conectar un decodificador de BCD a 7 segmentos,


Conectar el display directamente al puerto.

2.5.1 Conexin de un decodificador de BCD a 7 segmentos


Un decodificador de BCD a 7 segmentos tiene cuatro lneas de entrada y siete
salidas, el cdigo binario generado por el microcontrolador es transformado a 7
segmentos para ser visualizado en el display. Si el display es de nodo comn se utiliza
el decodificador TTL 7447, para un display ctodo comn el decodificador TTL 7448.
La figura 2.7, muestra las conexiones de un decodificador 7447 y un display nodo
comn. Se debe tener en cuenta de limitar la corriente de los segmentos mediante
resistencias. El uso de resistencias de valores entre 220 y 330 garantiza el
funcionamiento normal del display.
Figura 2.7. Conexin de display de 7 segmentos tipo nodo comn

Ejercicio 2.9. Contador de 0 a 9 utilizando un decodificador y display.

En este caso los datos de un contador realizado en un bucle FOR, se pueden


sacar directamente al puerto y el decodificador se encarga de convertirlos en 7
segmentos. La variable i se incrementa en 1 cada 500 ms y este valor es asignado al
puerto b (port_b= i;)

PROGRAMA:

#include <18f4550.h> //Librera para usar el PIC18F4550.


#fuses HS,WDT,NOPROTECT,PUT, NOPBADEN //Configuracin de fusibles.
#use delay (clock=12000000) // FOSC = 12MHz.
#BYTE port_b= 0xF81 //Identificador para el puerto b en la localidad 0xF81.
int i; //Variable i para el bucle FOR.

void main(void) //Funcin principal main.


{
set_tris_b(0x00); //Define port_b como salida
disable_interrupts(GLOBAL); //Todas las interrupciones desactivadas.
port_b = 0; //Puerto b = 0.

while(TRUE) //Bucle infinito.


{ //Inicio del bucle.

for (i=0; i<=9;++i){ //Repite mientras i sea menor o igual a 9.


delay_ms(500); //Retardo de 500 ms.
port_b= i; //El valor de i se saca al Puerto B. i varia de 0 a 9.
}
} //Fin del bucle de inicio.
} //Fin del bucle main.

2.5.2 Manejo directo de display de 7 segmentos


En ciertas aplicaciones donde se disponen de suficientes lneas del puerto del
microcontrolador y reducir el espacio fsico es la prioridad, el display se puede conectar
directamente a cualquier puerto.

En la figura 2.8, se muestra el circuito del display conectado al puerto B del


microcontrolador. Se utiliza un display de nodo comn por lo que el terminal comn
del display se conecta a VCC. Tambin se podra utilizar un display ctodo comn.

As mismo, como cuando se utiliza un driver decodificador de 7 segmentos, se


debe tener cuidado de utilizar las resistencias limitadores de corriente para conectar los
segmentos del display al puerto y evitar que se produzcan posibles sobrecorrientes que
puedan afectar al puerto o al segmento del display. Resistencias con valores entre 220
y 330, son comunes utilizar para activar los segmentos del display.
Figura 2.8. Conexin directa del display de 7 segmentos al microcontrolador.

Ahora considerando que los datos que salen al puerto deben estar decodificados
en 7 segmentos, se debe elaborar la tabla de datos decodificados para manejar por
software y obtener los nmeros respectivos.

La tabla 2.8, muestra los valores para activar los segmentos de un display nodo
comn, recuerde que el display de nodo comn con un nivel alto (1) el segmento se
desactiva y con un nivel bajo (0) el segmento se activa.

g F e d c b a Equivalencia decimal Nmero en el display


1 0 0 0 0 0 0 64 0
1 1 1 1 0 0 1 121 1
0 1 0 0 1 0 0 36 2
0 1 1 0 0 0 0 48 3
0 0 1 1 0 0 1 25 4
0 0 1 0 0 1 0 18 5
0 0 0 0 0 1 1 3 6
1 1 1 1 0 0 0 120 7
0 0 0 0 0 0 0 0 8
0 0 1 1 0 0 0 24 9

Tabla 2.8. Datos decodificados para activar al display de 7 segmentos.

Ejercicio 2.10. Contador MOD 10, manejando directamente el display de 7

segmentos con el microcontrolador.

Los datos mostrados en la tabla 2.8 deben ser enviados directamente al puerto
para activar los segmentos segn el nmero indicado. Para esto en el programa en una
constante tipo array se almacenan los valores codificados:

const int x[]= {64,121,36,48,25,18,2,120,0,16};


Mediante el lazo for se van sacando los valores desde el 0 hasta el 9. La variable
i del bucle for va asignando al puerto el valor que ocupa en el vector const. As, por
ejemplo si i vale 3, el puerto tendr el valor de 48 que corresponde al nmero 3.
Observe la instruccin port_d= x[i].

PROGRAMA:

#include <18f4550.h> //Librera para usar el PIC18F4550


#fuses HS,WDT,NOPROTECT,PUT, NOPBADEN //Configuracin de fusibles
#use delay (clock=12000000) // FOSC =12MHz
#BYTE port_d= 0xF83 //Identificador para el puerto d en la localidad 0xF83.
int i; //Variable i, contador para el bucle FOR.
const int x[]= {64,121,36,48,25,18,2,120,0,16}; //Tabla de datos decodificados a 7 segmentos.
void main(void) //Funcin principal main.
{
set_tris_d(0x00); //Identificador para el puerto d como salida.
disable_interrupts(GLOBAL); //Todas las interrupciones desactivadas.
port_d = 64; //Asigna el valor de 64 al Puerto para ver el nmero 0.

while(TRUE) //Bucle infinito.


{ //Inicio del bucle.
for (i=0; i<=9;++i) //Repite mientras i sea menor o igual a 9.
{
delay_ms(500); //Retardo de 500 ms. Necesario para mantener el dato en el
// puerto.
port_d= x[i]; //Asigna al puerto el valor apuntado por la variable i en el
//array x.
}
} //Fin del bucle infinito.
} //Fin del main.

2.6 MULTIPLEXACIN DE DISPLAYS DE 7


SEGMENTOS
En ciertos proyectos es necesario el ahorro de las lneas de los puertos para
utilizarlos en otras aplicaciones, en estos casos, se recurre a manejar los displays por el
mismo puerto. Esto se consigue usando el principio de la multiplexacin.

Para el ejemplo se va a disear un contador mdulo 100 (00-99). Los datos de


las unidades se visualizan en el display 1 y las decenas en el display 2. Para controlar
los dos displays simultneamente, el proceso consiste en prender el display 1 y apagar el
display 2 durante un corto tiempo y mostrar los datos de las unidades, luego prender el
display 2 y apagar el display 1 para indicar los datos de las decenas. El encendido y
apagado de los displays se realiza controlando la corriente de la base de dos transistores
que trabajan en corte y saturacin los mismos que manejan a los displays como se
indica en la figura 2.9.
Los datos en binario para los displays son enviados por el puerto RB0:RB3, el
decodificador 7447 convierte de BCD a 7 segmentos. Las dos lneas de control para los
transistores PNP, son del puerto RD0 y RD1 (lneas S1 y S2). Los transistores
permanecen en corte y saturacin durante 20 ms, con lo cual para ojo humano casi es
imperceptible el apagado del display y apenas existir un leve parpadeo. Esta accin se
repite por 50 veces en la funcin display() obteniendo un tiempo de retardo de 1s.

En la figura 2.9, RD0 controla al display de las decenas y RD1 al display de las
unidades, por tanto, cuando se ejecuta la instruccin port_d= 1; RD0=1 y RD1= 0, con
lo cual el transistor Q1 se apaga y el transistor Q2 se prende, los datos del puerto
corresponden a las unidades port_b= unidad. En el caso de port_d= 2; RD0=0 y RD1=
1, en este caso el transistor Q1 se prende y el transistor Q2 se apaga, los datos del
puerto corresponden a las decenas port_b= decenas. Recuerde que en los transistores
PNP con un 0 lgico en la base conduce y con un 1 lgico en la base el transistor est
abierto.

La figura 2.9, muestra las conexiones para manejar por el mismo puerto y un
solo decodificador dos display de 7 segmentos simultneamente.

Ejercicio 2.11. Manejo de dos display por principio de multiplexacin

PROGRAMA:

#include <18f4550.h> //Librera para usar el PIC18F4550.


#fuses HS,WDT,NOPROTECT,PUT, NOPBADEN //Configuracin de fusibles.
#use delay (clock=12000000) //FOSC =12MHz.
#BYTE port_b= 0xF81 //Identificador para el puerto b en la localidad 0xF81.
#BYTE port_d= 0xF83 //Identificador para el puerto d en la localidad 0xF83.

int unidad, decena, x; //Variables.

//Funcin display. Muestra los datos en los display y genera un retardo de 1segundo.
void display()
{
for (x= 1; x<= 25; ++x){ //Repite 25 veces.
port_d = 1; //Habilita display unidad y apaga display decena.
port_b= unidad; //Asigna al Puerto b el dato de unidad.
delay_ms(20); //El dato de unidad permanece el Puerto b 20 ms.
port_d = 2; //Habilita el display decena y apaga display unidad.
port_b= decena; //Asigna al Puerto b el dato de decena.
delay_ms(20); //El dato de decena permanece el Puerto b 20 ms.
}
return; //Retorna al programa principal.
}

void main(void) //Funcin principal main.


{
set_tris_b(0x00); //Define port_b como salida.
set_tris_d(0x00); //Identificador para el puerto d como salida.
disable_interrupts(GLOBAL); //Todas las interrupciones desactivadas.
port_b = 0; //Puerto b =0.
while(TRUE){
for (decena=0; decena<=9;++decena){ //Datos para el display decena 0 a 9.
for (unidad=0; unidad<=9;++unidad){ //Datos para el display unidad 0 a 9.
display(); //Funcin display.
}
}
} //Fin del bucle infinito.
} //Fin del bucle main.

Figura 2.9. Conexin de dos display con el mismo decodificador.

You might also like