Você está na página 1de 14

Tutorial Multiplexando Displays de Sete Segmentos

com PIC 16F628A

Introduo

Mostrarei neste tutorial, com enfoque no programa, em C, atravs da tcnica de


multiplexao como exibir um nmero de trs algarismos em displays de sete
segmentos com um PIC 16F628A.

-2-

1. MOTIVAO

A iniciativa de construir o projeto foi apartir de uma dvida anunciada em um


frum de robtica apresentando algo como: Como exibir um nmero com trs ou mais
dgitos em um PIC16F628A com 18 pinos, sendo que cada display utiliza sete pinos?,
duvida comum entre vrios iniciantes. Havia no momento duas solues para a
proposta, a primeira era de utilizar, para cada display, um circuito integrado que
convertesse o cdigo BCD8421 para os sete segmentos, ou seja, seriam utilizados doze
pinos, quatro para cada display, a segunda soluo, mais interessante e prtica era
utilizar a tcnica da multiplexao, que ser abordada no decorrer do tutorial.
O circuito eletrnico e a parte mais simples deste projeto, diferente da primeira
soluo proposta esta utiliza dez pinos, e esta tcnica torna se mais vantajosa a medida
que o nmero de display aumenta.

2. CIRCUITO

O circuito abaixo que ser utilizado para exibir os nmeros.

-3-

Observa se a simplicidade do circuito em questo, lembrando que este est sem o


circuito oscilador, e a fonte de alimentao, sendo o praticante da montagem o
responsvel por sua elaborao. Foram utilizados displays de ctodo comum e
transistores NPN de uso geral.

3. PROGRAMA

A essncia deste projeto seu programa, este deve ser provido com a lgica de
funcionamento a seguir: para exibio dos trs dgitos cada display deve ser acionado
individualmente e em seqncia, exemplificando: para exibir o numero 456 deve ser
acionado o primeiro display contendo o numero quatro, aps 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 possvel, isso
faz com que haja sensao de que todos os displays esto acesos ao mesmo tempo.
O acionamento individual de cada dgito 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 nmero e coloca em
conduo seu respectivo transistor, isto deve ser feito tambm com os outros dois
displays.
Aps testes foi percebido que deveria ser desligado o nmero em exibio antes
de passar a exibir o prximo algarismo no display seguinte, pois no se obtinha um
grande contraste de cada dgito dificultando a visualizao de todo o nmero.
Qualquer e apenas numero inteiros de no mximo trs algarismos podem ser
exibidos com o programa a seguir, que ser desenvolvido em partes para ento serem
agrupadas.
Queremos encontrar o valor absoluto de todos os algarismos para ento em
conjunto formar o nmero por completo.

Display das Unidades

Ao dividir um numero dentro do conjunto dos nmeros inteiros por dez o resto da
diviso ser o valor absoluto do seu algarismo menos significativo, utilizando esta
tcnica elaboramos seguinte funo:

-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 lgica matemtica o algarismo
da unidade, depois atravs da execuo do comando switch comparar o valor da
varivel uni e exibir este nmero no display logo aps zerar, ou seja no exibir numero
algum e desligar o display.

Display das Dezenas

O procedimento ser semelhante neste display, com diferena 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 varivel num.

4. MONTAGEM

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

- 10 -

- 11 -

Na montagem eu adicionei um anexo ao circuito sendo este um boto que ao


pressionado soma uma unidade varivel num. Foi feita apenas uma modificao
na funo void main(), e a adio de uma varivel 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 lgica do tutorial pode ser aplicada para construir outro projeto com mais
displays.

- 12 -

No tenho responsabilidade pelo mau funcionamento do projeto, danos, at


mesmo de sanar dvidas se este for alterado.
Caso este for usado como base em algum trabalho acadmico, favor citar a
fonte como incentivo e contribuio para repercusso deste tutorial.
Caso no tenha descoberto este documento em um frum, as dvidas 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