Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h>
- #include <util/delay.h>
- #include <avr/interrupt.h>
- int conta0; //Contador do timer
- /*
- * Configuração de pinos do display 7 segmentos
- */
- #define pinApb (1 << 0)
- #define pinBpb (1 << 1)
- #define pinCpd (1 << 5)
- #define pinDpd (1 << 7)
- #define pinEpd (1 << 6)
- #define pinFpb (1 << 2)
- #define pinGpb (1 << 3)
- #define pinDPpd (1 << 4);
- void rst(void) { //Reseta todas as saídas configuradas, deixando tudo em HIGH, desligando o display;
- PORTB |= (pinApb | pinBpb | pinFpb | pinGpb);
- PORTD |= (pinCpd | pinDpd | pinEpd);
- }
- void set(int i) { //Mostra um número de 0 a 9 no display
- rst();
- switch (i) {
- case 0:
- PORTB &= ~(pinApb | pinBpb | pinFpb);
- PORTD &= ~(pinCpd | pinDpd | pinEpd);
- break;
- case 1:
- PORTB &= ~pinBpb;
- PORTD &= ~pinCpd;
- break;
- case 2:
- PORTB &= ~(pinApb | pinBpb | pinGpb);
- PORTD &= ~(pinDpd | pinEpd);
- break;
- case 3:
- PORTB &= ~(pinApb | pinBpb | pinGpb);
- PORTD &= ~(pinCpd | pinDpd);
- break;
- case 4:
- PORTB &= ~(pinBpb | pinFpb | pinGpb);
- PORTD &= ~pinCpd;
- break;
- case 5:
- PORTB &= ~(pinApb | pinFpb | pinGpb);
- PORTD &= ~(pinCpd | pinDpd);
- break;
- case 6:
- PORTB &= ~(pinApb | pinFpb | pinGpb);
- PORTD &= ~(pinCpd | pinDpd | pinEpd);
- break;
- case 7:
- PORTB &= ~(pinApb | pinBpb);
- PORTD &= ~pinCpd;
- break;
- case 8:
- PORTB &= ~(pinApb | pinBpb | pinFpb | pinGpb);
- PORTD &= ~(pinCpd | pinDpd | pinEpd);
- break;
- case 9:
- PORTB &= ~(pinApb | pinBpb | pinFpb | pinGpb);
- PORTD &= ~pinCpd;
- break;
- default:
- break;
- }
- }
- //Overflow do timer0
- ISR(TIMER0_OVF_vect) {
- conta0++;
- //Inverte o estado do ponto do display
- if (conta0 == 49) {
- PORTD ^= pinDPpd;
- conta0 = 0;
- }
- }
- //Metodo principal
- int main(void) {
- //Define pinos usadas como saída
- DDRB = 0b00001111;
- DDRD = 0b11110000;
- //Coloca todos os pinos em valor baixo, ligando todo o display
- PORTB = 0b00000000;
- PORTD = 0b00000000;
- _delay_ms(200);
- //Colota todos os pinos em valor alto, desligando todo o display;
- PORTB = 0b00001111;
- PORTD = 0b11110000;
- cli(); // Desabilita a interrupção global
- TCNT0 = 0x00; //Inicia o timer em 0
- TCCR0B = 0x04; //Configura o prescaler para 1:256
- TIMSK0 = 0x001; //Liga a interrupção por overflow do timer0;
- sei(); //Habilita a interrupção global
- //Loop principal
- while (1) {
- // Fica mostrando todos os números de 1 a 9 no display
- for (int i = 0; i <= 9; i++) {
- set(i);
- _delay_ms(500);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement