Tutorial Display Multiplexado Com Pic16f628a 133

14
Tutorial – Multiplexando Displays de Sete Segmentos com PIC 16F628A

Transcript of Tutorial Display Multiplexado Com Pic16f628a 133

Page 1: Tutorial Display Multiplexado Com Pic16f628a 133

Tutorial – Multiplexando Displays de Sete Segmentos

com PIC 16F628A

Page 2: Tutorial Display Multiplexado Com Pic16f628a 133

- 2 -

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.

Page 3: Tutorial Display Multiplexado Com Pic16f628a 133

- 3 -

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.

Page 4: Tutorial Display Multiplexado Com Pic16f628a 133

- 4 -

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:

Page 5: Tutorial Display Multiplexado Com Pic16f628a 133

- 5 -

////////// 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;

}

Page 6: Tutorial Display Multiplexado Com Pic16f628a 133

- 6 -

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){

.

.

.

}

}

Page 7: Tutorial Display Multiplexado Com Pic16f628a 133

- 7 -

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;

Page 8: Tutorial Display Multiplexado Com Pic16f628a 133

- 8 -

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;

Page 9: Tutorial Display Multiplexado Com Pic16f628a 133

- 9 -

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;

Page 10: Tutorial Display Multiplexado Com Pic16f628a 133

- 10 -

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.

Page 11: Tutorial Display Multiplexado Com Pic16f628a 133

- 11 -

Page 12: Tutorial Display Multiplexado Com Pic16f628a 133

- 12 -

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.

Page 13: Tutorial Display Multiplexado Com Pic16f628a 133

- 13 -

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

Page 14: Tutorial Display Multiplexado Com Pic16f628a 133

- 14 -

Tutorial desenvolvido e apresentado por:

Luigi Eduardo Sica Nery

[email protected]

18/07/2011