Académique Documents
Professionnel Documents
Culture Documents
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
-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.
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.
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){ . . . } }
-6-
Programa Final
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_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_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; }
void main(){ trisa = 0b0; trisb = 0b10000000; porta = 0b0; portb = 0b0; num = 0; while(1){ display_centena(); display_dezena(); display_unidade(); } } /////////// FIM DO PROGRAMA
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.
- 13 -
18/07/2011 - 14 -