Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

AVR: Display 7 Segmentos

Compartilhe:

Mais um projeto envolvendo o ATMEGA328P. Desta vez iremos criar um simples contador de 0 até 99 acionado por um botão.

O projeto utiliza um display de 7 segmentos de 2 dígitos com catodo comum (cada segmento tem em comum um pino GND, são os pinos 1 e 2, um para cada dígito). Um segmento é aceso quando aplicamos uma corrente em seu pino de entrada (pinos A ao G).

Se vocês perceberam, não dá pra exibir dois números ao mesmo tempo, já que compartilham os mesmos pinos de entrada. Por isso precisamos intercalar a exibição de um dígito. Nós setamos os pinos de entrada para que possa exibir algo e habilitamos o primeiro dígito e desabilitamos o segundo digito. Algum tempo depois, nós setamos os pinos de entrada para o segundo dígito e desabilitamos o primeiro e habilitamos o segundo dígito. E o ciclo se repete. Todo o tempo de transição de um digito para o outro deve ser feito de modo que nossos olhos não perceba essa mudança.

Código

/*
Demonstração do uso de um display de 7 segmentos com ATMEGA328P.
Autor: Tiago Melo
Blog: Microcontrolandos
Compilador: MikroC PRO AVR
Bibliotecas:
*/
//Mascara de bits usado para escrever um digito no display
char DisplayCatodoComum[] = { 63, 6, 91, 79, 102, 109, 125, 7, 127, 111 };
char contador = 1; //conta de 0 até 99.
char flags = 0; //usado para salvar o estado do botao
char digitoDasUnidades; //usado para guardar o digito das unidades ( 0...9 )
char digitoDasDezenas; //usado para guardar o digito das dezanas ( 0...9 )
void main()
{
//Inicializa os pinos do Display
DDRD = 255; //PORTB como saída
PORTD = 0; //inicializa a PORTB com o valor 0.
DDRB.B0 = 1; //pino PB0 como saída
PORTB.B0 = 1; //valor inicial do pino PB0 ( 1 = display desligado )
DDRB.B1 = 1; //pino PB1 como saída
PORTB.B1 = 1; //valor inicial do pino PB1 ( 1 = display desligado )
DDRB.B4 = 0; //pino do botao como entrada
PORTB.B4 = 1; //habilita o resistor de pull-up do pino do botao
while(1)
{
//botão foi pressionado? Sim!!! Vamos então, salvar seu estado na flag.
if( !PINB.B4 ) flags.B0 = 1;
if( PINB.B4 && flags.B0 ) //O botão foi solto e anteriormente estava pressionado? Sim!!!
{
flags.B0 = 0; //limpa a flag
contador++; //acrescenta +1 à variável 'contador'
//display com dois segmentos conta até 99.
if( contador > 99 ) //'contador' é maior que 99? Sim!!!
contador = 0;
}
//recupera os digitos das unidades e dezenas
//10 porque estamos contando na base decimal!
//E se quisessemos contar na base hexadecimal ou octal?
digitoDasUnidades = contador % 10;
digitoDasDezenas = ( contador / 10 ) % 10;
//desativa todos os displays
PORTB.B0 = 1;
PORTB.B1 = 1;
//Escreve o digito num display
PORTD = DisplayCatodoComum[ digitoDasUnidades ];
//habilita o display 2
PORTB.B0 = 0;
Delay_ms( 1 );
//desativa todos os displays
PORTB.B0 = 1;
PORTB.B1 = 1;
//Escreve o digito num display
PORTD = DisplayCatodoComum[ digitoDasDezenas ];
//habilita o display 1
PORTB.B1 = 0;
Delay_ms( 1 );
}
}

Escreva um comentário

5 comentários: