Tutorial - Display Multiplexado com PIC16F628A
Transcrição
Tutorial - Display Multiplexado com PIC16F628A
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 [email protected] 18/07/2011 - 14 -