Advertisement
Guest User

Main.c

a guest
May 29th, 2016
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.53 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4.  
  5. int conta0; //Contador do timer
  6.  
  7. /*
  8.  * Configuração de pinos do display 7 segmentos
  9.  */
  10. #define pinApb (1 << 0)
  11. #define pinBpb (1 << 1)
  12. #define pinCpd (1 << 5)
  13. #define pinDpd (1 << 7)
  14. #define pinEpd (1 << 6)
  15. #define pinFpb (1 << 2)
  16. #define pinGpb (1 << 3)
  17. #define pinDPpd (1 << 4);
  18.  
  19. void rst(void) { //Reseta todas as saídas configuradas, deixando tudo em HIGH, desligando o display;
  20.     PORTB |= (pinApb | pinBpb | pinFpb | pinGpb);
  21.     PORTD |= (pinCpd | pinDpd | pinEpd);
  22. }
  23.  
  24. void set(int i) { //Mostra um número de 0 a 9 no display
  25.     rst();
  26.     switch (i) {
  27.         case 0:
  28.             PORTB &= ~(pinApb | pinBpb | pinFpb);
  29.             PORTD &= ~(pinCpd | pinDpd | pinEpd);
  30.             break;
  31.         case 1:
  32.             PORTB &= ~pinBpb;
  33.             PORTD &= ~pinCpd;
  34.             break;
  35.         case 2:
  36.             PORTB &= ~(pinApb | pinBpb | pinGpb);
  37.             PORTD &= ~(pinDpd | pinEpd);
  38.             break;
  39.         case 3:
  40.             PORTB &= ~(pinApb | pinBpb | pinGpb);
  41.             PORTD &= ~(pinCpd | pinDpd);
  42.             break;
  43.         case 4:
  44.             PORTB &= ~(pinBpb | pinFpb | pinGpb);
  45.             PORTD &= ~pinCpd;
  46.             break;
  47.         case 5:
  48.             PORTB &= ~(pinApb | pinFpb | pinGpb);
  49.             PORTD &= ~(pinCpd | pinDpd);
  50.             break;
  51.         case 6:
  52.             PORTB &= ~(pinApb | pinFpb | pinGpb);
  53.             PORTD &= ~(pinCpd | pinDpd | pinEpd);
  54.             break;
  55.         case 7:
  56.             PORTB &= ~(pinApb | pinBpb);
  57.             PORTD &= ~pinCpd;
  58.             break;
  59.         case 8:
  60.             PORTB &= ~(pinApb | pinBpb | pinFpb | pinGpb);
  61.             PORTD &= ~(pinCpd | pinDpd | pinEpd);
  62.             break;
  63.         case 9:
  64.             PORTB &= ~(pinApb | pinBpb | pinFpb | pinGpb);
  65.             PORTD &= ~pinCpd;
  66.             break;
  67.         default:
  68.             break;
  69.     }
  70. }
  71.  
  72. //Overflow do timer0
  73. ISR(TIMER0_OVF_vect) {
  74.     conta0++;
  75.     //Inverte o estado do ponto do display
  76.     if (conta0 == 49) {
  77.         PORTD ^= pinDPpd;
  78.         conta0 = 0;
  79.     }
  80. }
  81.  
  82. //Metodo principal
  83. int main(void) {
  84.  
  85.     //Define pinos usadas como saída
  86.     DDRB = 0b00001111;
  87.     DDRD = 0b11110000;
  88.  
  89.     //Coloca todos os pinos em valor baixo, ligando todo o display
  90.     PORTB = 0b00000000;
  91.     PORTD = 0b00000000;
  92.  
  93.     _delay_ms(200);
  94.  
  95.     //Colota todos os pinos em valor alto, desligando todo o display;
  96.     PORTB = 0b00001111;
  97.     PORTD = 0b11110000;
  98.  
  99.     cli(); // Desabilita a interrupção global
  100.  
  101.     TCNT0 = 0x00; //Inicia o timer em 0
  102.     TCCR0B = 0x04; //Configura o prescaler para 1:256
  103.     TIMSK0 = 0x001; //Liga a interrupção por overflow do timer0;
  104.  
  105.     sei(); //Habilita a interrupção global
  106.  
  107.     //Loop principal
  108.     while (1) {
  109.  
  110.         // Fica mostrando todos os números de 1 a 9 no display
  111.         for (int i = 0; i <= 9; i++) {
  112.             set(i);
  113.             _delay_ms(500);
  114.         }
  115.     }
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement