You are on page 1of 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 -

You might also like