Você está na página 1de 14

Tutorial – Multiplexando Displays de Sete Segmentos

com PIC 16F628A


Introdução

Mostrarei neste tutorial, com enfoque no programa, em C, através da técnica de


multiplexação como exibir um número de três algarismos em displays de sete
segmentos com um PIC 16F628A.

-2-
1. MOTIVAÇÃO

A iniciativa de construir o projeto foi apartir de uma dúvida anunciada em um


fórum de robótica apresentando algo como: “Como exibir um número com três ou mais
dígitos em um PIC16F628A com 18 pinos, sendo que cada display utiliza sete pinos?”,
duvida comum entre vários iniciantes. Havia no momento duas soluções para a
proposta, a primeira era de utilizar, para cada display, um circuito integrado que
convertesse o código BCD8421 para os sete segmentos, ou seja, seriam utilizados doze
pinos, quatro para cada display, a segunda solução, mais interessante e prática era
utilizar a técnica da multiplexação, que será abordada no decorrer do tutorial.
O circuito eletrônico e a parte mais simples deste projeto, diferente da primeira
solução proposta esta utiliza dez pinos, e esta técnica torna se mais vantajosa a medida
que o número de display aumenta.

2. CIRCUITO

O circuito abaixo que será utilizado para exibir os números.

-3-
Observa se a simplicidade do circuito em questão, lembrando que este está sem o
circuito oscilador, e a fonte de alimentação, sendo o praticante da montagem o
responsável por sua elaboração. Foram utilizados displays de cátodo comum e
transistores NPN de uso geral.

3. PROGRAMA

A essência deste projeto é seu programa, este deve ser provido com a lógica de
funcionamento a seguir: para exibição dos três dígitos cada display deve ser acionado
individualmente e em seqüência, exemplificando: para exibir o numero 456 deve ser
acionado o primeiro display contendo o numero quatro, após deve ser acionado o
numero cinco no segundo display e por fim deve ser exibido no terceiro display o
numero seis, todo este procedimento deve ser feito na maior velocidade possível, isso
faz com que haja sensação de que todos os displays estão acesos ao mesmo tempo.
O acionamento individual de cada dígito deve ser feito configurando o programa
de modo que se deve escolher o numero a ser exibido e escolher o display
correspondente a ele. Para acender o primeiro display, escolhe-se o número e coloca em
condução seu respectivo transistor, isto deve ser feito também com os outros dois
displays.
Após testes foi percebido que deveria ser desligado o número em exibição antes
de passar a exibir o próximo algarismo no display seguinte, pois não se obtinha um
grande contraste de cada dígito dificultando a visualização de todo o número.
Qualquer e apenas numero inteiros de no máximo três algarismos podem ser
exibidos com o programa a seguir, que será desenvolvido em partes para então serem
agrupadas.
Queremos encontrar o valor absoluto de todos os algarismos para então em
conjunto formar o número por completo.

Display das Unidades

Ao dividir um numero dentro do conjunto dos números inteiros por dez o resto da
divisão será o valor absoluto do seu algarismo menos significativo, utilizando esta
técnica elaboramos seguinte função:

-4-
////////// DISPLAY DAS UNIDADES
display_unidade(){
porta.b1 = 1;
uni = num%10;
switch(uni){
case 0:
portb = 63;
break;
case 1:
portb = 6;
break;
case 2:
portb = 91;
break;
case 3:
portb = 79;
break;
case 4:
portb = 102;
break;
case 5:
portb = 109;
break;
case 6:
portb = 125;
break;
case 7:
portb = 7;
break;
case 8:
portb = 127;
break;
case 9:
portb = 111;
break;
}
delay_ms(1);
porta.b1 = 0;
portb = 0;
}

-5-
ou seja, deve se ligar o primeiro display, encontrar com lógica matemática o algarismo
da unidade, depois através da execução do comando switch comparar o valor da
variável uni e exibir este número no display logo após zerar, ou seja não exibir numero
algum e desligar o display.

Display das Dezenas

O procedimento será semelhante neste display, com diferença no modo de


encontrar o valor para as dezenas, será utilizado o seguinte enunciado:

////////// DISPLAY DAS DEZENAS


display_dezena(){
porta.b0 = 1;
dez = (num%100);
dez = (dez/10) - ((dez%10)/10);
switch(dez){
.
.
.
}
}

Display das Centenas

Novamente o que mudará é o modo de encontrar o valor do algarismo

////////// DISPLAY DAS CENTENAS


display_centena(){
porta.b2 = 1;
cen = (num/100)-((num%100)/100);
switch(cen){
.
.
.
}
}

-6-
Programa Final

O programa final e já testado ficará do seguinte modo:

///////////////////////////////////////////////////////////
///////// 3 DISPLAY (7-SEGMENTOS) MULTIPLEXADOS ///////////
///////// -------------------------------------- //////////
///////// LUIGI EDUARDO /////// 15/07/2011 ////////////////
///////////////////////////////////////////////////////////

unsigned int cen, dez, uni, num;

////////// DISPLAY DAS CENTENAS

display_centena(){
porta.b2 = 1;
cen = (num/100)-((num%100)/100);
switch(cen){
case 0:
portb = 63;
break;
case 1:
portb = 6;
break;
case 2:
portb = 91;
break;
case 3:
portb = 79;
break;
case 4:
portb = 102;
break;
case 5:
portb = 109;
break;
case 6:
portb = 125;
break;
case 7:
portb = 7;

-7-
break;
case 8:
portb = 127;
break;
case 9:
portb = 111;
break;
}
delay_ms(1);
porta.b2 = 0;
portb = 0;
}

////////// DISPLAY DAS DEZENAS

display_dezena(){
porta.b0 = 1;
dez = (num%100);
dez = (dez/10) - ((dez%10)/10);
switch(dez){
case 0:
portb = 63;
break;
case 1:
portb = 6;
break;
case 2:
portb = 91;
break;
case 3:
portb = 79;
break;
case 4:
portb = 102;
break;
case 5:
portb = 109;
break;
case 6:
portb = 125;
break;

-8-
case 7:
portb = 7;
break;
case 8:
portb = 127;
break;
case 9:
portb = 111;
break;
}
delay_ms(1);
porta.b0 = 0;
portb = 0;
}

////////// DISPLAY DAS UNIDADES

display_unidade(){
porta.b1 = 1;
uni = num%10;
switch(uni){
case 0:
portb = 63;
break;
case 1:
portb = 6;
break;
case 2:
portb = 91;
break;
case 3:
portb = 79;
break;
case 4:
portb = 102;
break;
case 5:
portb = 109;
break;
case 6:
portb = 125;

-9-
break;
case 7:
portb = 7;
break;
case 8:
portb = 127;
break;
case 9:
portb = 111;
break;
}
delay_ms(1);
porta.b1 = 0;
portb = 0;
}

////////// PROGRAMA PRINCIPAL

void main(){
trisa = 0b0;
trisb = 0b10000000;
porta = 0b0;
portb = 0b0;
num = 0;
while(1){
display_centena();
display_dezena();
display_unidade();
}
}
/////////// FIM DO PROGRAMA

O numero exibido nos displays é definido ao atribuir um valor a variável num.

4. MONTAGEM

A montagem, assim como seu circuito, é simples pode ser desenvolvida como
mostrado a seguir ou de modo permanente em placas próprias para circuitos.

- 10 -
- 11 -
Na montagem eu adicionei um anexo ao circuito sendo este um botão que ao
pressionado soma uma unidade à variável num. Foi feita apenas uma modificação
na função void main(), e a adição de uma variável chamada mem.

void main() {
trisa = 0b0;
trisb = 0b10000000;
porta = 0b0;
portb = 0b0;
num = 0;
mem = 0;

while(1){
if(portb.b7 == 0b1 & mem == 0){
num = num + 1;
mem = 1;
if(num == 1000){
num = 0;
}
}
if(portb.b7 == 0b0 & mem == 1){
mem = 0;
}
display_centena();
display_dezena();
display_unidade();
}
}

Toda a lógica do tutorial pode ser aplicada para construir outro projeto com mais
displays.

- 12 -
Não tenho responsabilidade pelo mau funcionamento do projeto, danos, até
mesmo de sanar dúvidas se este for alterado.
Caso este for usado como base em algum trabalho acadêmico, favor citar a
fonte como incentivo e contribuição para repercussão deste tutorial.
Caso não tenha descoberto este documento em um fórum, as dúvidas devem
ser enviadas por e-mail, no campo relacionado ao assunto deve ser colocado o nome
do tutorial.

Grato,
Luigi Eduardo Sica Nery

- 13 -
Tutorial desenvolvido e apresentado por:
Luigi Eduardo Sica Nery
luigiesn@gmail.com

18/07/2011

- 14 -

Você também pode gostar