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 ); | |
} | |
} |
eta dando este erro
ResponderExcluir'::main' must return 'int'
oq pode ser ?
Qual compilador você usou? Eu uso o MikroC PRO AVR.
Excluirobrigado
ResponderExcluirkuşadası
ResponderExcluirmilas
çeşme
bağcılar
urfa
O4HD
pusulabet
ResponderExcluirsex hattı
https://izmirkizlari.com
rulet siteleri
rexbet
MUZAPW