Ir ao conteúdo
  • Cadastre-se

Pic e display 7 seg


Lucas Menezes

Posts recomendados

Olá !

Estou com uma duvida de como usar um display anodo comum no pic...

com o catodo comum a ligação era:

pino do pic -> resistor -> pino do segmento --> catodo comum -> coletor transistor -> emissor transistor -> terra.

e assim, você tendo nível alto no pino do pic e e transistor saturado, o segmento do display acendia.

Tentei inverter a logica.. ou seja colocando:

positivo -> anodo comum -> pino do segmento -> resistor -> pino do pic. (ligação em anexo)

e assim, enviando nível baixo no pino do pic, o segmento acenderia...

porém nao aconteceu...

ai a duvida eé se o pic consegue drenar essa corrente quando coloco o nivel baixo...

pois lembro que utilizava o 8051 dessa forma para ligar um led...

Link para o comentário
Compartilhar em outros sites

Opa.. to doidão heim...

vou fazer uns testes aqui... e conferir a ligação...

Mas então hamdan, o pic aceita esse tipo de ligagação certo ? ou seja, aterrar a carga a uma saida com nivel baixo... verificando e claro a corrente a ser drenada... ok ?

Alias hamdan... acho que você entendeu errado...

no circuito acima, eu quero que quando o pino B6=0 e C7=1 o segmento "g" ligue.

Link para o comentário
Compartilhar em outros sites




#include<16F876A.h>
#device adc=10;
#fuses HS, NOWDT, PROTECT
#use delay(clock = 20000000)
#use fast_io(

#define Disp_1 pin_c7
#define Disp_2 pin_c6
#define Disp_3 pin_c5

byte const dig[] = { 0b01000000, // 0 Define cada segmento
0b01111001, // 1 dos valores mostrados
0b00100100, // 2 no display de LEDs
0b00110000, // 3 em binário para ficar
0b00011001, // 4 mais fácil de codificar
0b00010010, // 5 cada dígito dos valores
0b00000010, // 6 mostrados no display.
0b01111000, // 7
0b00000000, // 8
0b00011000}; // 9


void main(){
long int ANL_0, ANL_1, ANL_3;
long int fase_R, fase_S, fase_T, tensao_RS, tensao_ST, tensao_TR;

setup_adc_ports (AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
set_tris_b(0x00); //Prepara o PORTB...configura o portc como saida
// port_b_pullups(true); //liga os pull ups do portb, para não ser necessário colocar fisicamente no circuito.
delay_us (20);
trata_eeprom ();

// Loop principal
while (true){
// calcula tensões entre as três fases
tensao_RS = (fase_R + fase_S) / 1.15; // calcula tensão entre fase R e S na primeira linha do lcd
tensao_ST = (fase_S + fase_T) / 1.15; // calcula tensão entre fase S e T na primeira linha do lcd
tensao_TR = (fase_T + fase_R) / 1.15; // calcula tensão entre fase T e R na primeira linha do lcd


desmembrar_numero ( tensao_RS );
escreve (dig[cent], dig[deze], dig[unid]);
trata_menu ();
escreve (dig[cent], dig[deze], dig[unid]);


desmembrar_numero ( tensao_ST );
escreve (dig[cent], dig[deze], dig[unid]);
trata_menu ();
escreve (dig[cent], dig[deze], dig[unid]);


desmembrar_numero ( tensao_TR );
escreve (dig[cent], dig[deze], dig[unid]);
trata_menu ();
escreve (dig[cent], dig[deze], dig[unid]);
}
}
/*---------------------------------------------------------------------------------------------------
FUNÇÃO PARA ESCREVER NO DISPLAY
---------------------------------------------------------------------------------------------------*/


void escreve (int Display1,int Display2,int Display3) // (centena,dezena,unidade)
{
int contador = 0; //
for (contador=0;contador<3;contador++){
output_b (Display1); // Apresenta Digito no primeiro display (centena)
output_high (Disp_1); // Habilita display 1
delay_ms (50); // Aguarda 20ms para dar uma pausa no PIC
output_low (Disp_1); // Desabilita display 1
// delay_us (10);

output_b (Display2); // Apresenta Digito no segundo display (dezena)
output_high (Disp_2); // Habilita display 2
delay_ms (50); // Aguarda 20ms para dar uma pausa no PIC
output_low (Disp_2); // Desabilita display 2
// delay_us (10);

output_b (Display3); // Apresenta Digito no terceiro display (unidade)
output_high (Disp_3); // Habilita display 3
delay_ms (50); // Aguarda 20ms para dar uma pausa no PIC
output_low (Disp_3); // Desabilita display 3
// delay_us (10);
}
}



/*---------------------------------------------------------------------------------------------------
FUNÇÃO PARA DESMEMBRAR UM NUMERO INTEIRO
---------------------------------------------------------------------------------------------------*/

void desmembrar_numero ( long int numero )
{
cent=0, deze=0, unid=0;
cent = numero / 100;
deze = ( numero - ( cent * 100 ) ) / 10;
unid = numero - ( ( cent * 100 ) + ( deze * 10 ) );
}



Este codigo funcionava com display catodo normalmente, unica coisa que fiz foi inverter o "byte const dig", então onde era 1 coloquei 0 e onde era 0 coloquei 1.

Link para o comentário
Compartilhar em outros sites

amigo, ontem eu passei mau e nao deu pra continuar a tentar ajudar. hoje etntei compilar seu codigo aqui e deu erro.

que uma solução simples?

volte o código para o que estava funcionando e coloque um transistor npn em cada saida ai. com o coletor para o display e o emissor ao terra.

obs: se voce for usar os transistores, naop esqueça de colocar um resistor de base, e um no coletor.

Link para o comentário
Compartilhar em outros sites

Opa hamdan, obrigado pela ajuda...

mas se é pra colocar 7 transistor... eu teria que "destruir" a placa toda...

vou correr atrás do display de 3 dígitos catodo comum mesmo,

obs: no proteus essa configuração e esse código funcionaram... mas na pratica não...

creio que é pelo fato da saída não conseguir drenar a corrente do led do segmento...

Mas de qualquer forma, obrigado pela ajuda !!!

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!