[PIC] Relógio digital 7 segmentos

Nesse exemplo mostro como criar uma rotina para escrita em display de 7 segmentos baseado em interrupção, também simulando um relógio.

Usar no Proteus 7.10 ou superior.


Fazer o download: [PIC] Relógio digital 7 segmentos 


Segue o código:

/*
DATEK Tecnologia Eletrônica Ltda.
********************************************************************************
PROGRAMA EXEMPLO: Mostrar como utilizar 7 segmentos por interrupção para simulação de RTC.
OBJETIVO: Aprender como utilizar 7 segmentos por interrupção para simulação de RTC
AUTOR: Fabio Mulero.[fabio@datek.com.br]
********************************************************************************
MICROCONTROLADOR: PIC18F4620.
PLACA DE DESENVOLVIMENTO: SIMULAÇÃO NO PROTEUS
SOFTWARE: MikroC PRO for PIC Versão: 6.0
********************************************************************************
*/

// VARIAVEIS GLOBAIS
unsigned int uiValor; // Variável auxiliar para exibição do contador.
// "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
unsigned char ucMask[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
/* Variável do tipo matriz que armazena os valores correspondentes ao numero para ser mostrado no display de 7 segmentos */
unsigned char ucHora; // armazena horas
unsigned char ucMinuto; // armazena minutos
unsigned char ucSegundo; // armazena segundos

void interrupt()
{
   if (TMR0IF_bit)
   {
      TMR0IF_bit = 0;
      TMR0H = 0x0B;
      TMR0L = 0xDB;
      if(++ucSegundo > 59)
      {
         ucSegundo=0;
         if(++ucMinuto>59)
         {
            ucMinuto=0;
            if(++ucHora>23)
            {
               ucHora=0;
            }
         }
      }
   }
   if(TMR3IF_bit==1)
   { // Incrementa somente quando existir o overflow do timer 3.
      // Recarrega o timer3.
      TMR3H = 0x7B; // Carrega o valor alto.
      TMR3L = 0xDC; // Carrega o valor baixo.
      TMR3IF_bit = 0; // Limpa o flag de estouro do timer3 para uma nova contagem de tempo.
      LATA =0;
      uiValor = ucSegundo; // Coloca o conteúdo da variável do contador na variável auxiliar.
      #define Delay 1000
      // Mostra valor da unidade segundo.
      LATD = ucMask[uiValor%10]; // Pega modulo (resto) da divisão por 10 e coloca o valor no PORTD.
      Delay_us(Delay);
      LATA6_bit = 1; // Liga o transistor associado ao display 1.
      Delay_us(Delay); // Delay para escrita no display.
      LATA6_bit = 0; // Desliga o transistor associado ao display 1.
      uiValor/=10; // Divide variável por 10.
      // Mostra valor da dezena segundo.
      LATD = ucMask[uiValor%10];
      Delay_us(Delay);
      LATA5_bit = 1;
      Delay_us(Delay);
      LATA5_bit = 0;
      uiValor = ucMinuto; // Coloca o conteúdo da variável do contador na variável auxiliar.
      // Mostra valor da unidade minuto.
      LATD = ucMask[uiValor%10]+(ucSegundo%2?0X80:0); // PONTO 1 SEGUNDO LIGADO, 1 SEGUNDO DESLIGADO
      Delay_us(Delay);
      LATA3_bit = 1;
      Delay_us(Delay);
      LATA3_bit = 0;
      uiValor/=10;
      // Mostra valor da dezena minuto.
      LATD = ucMask[uiValor%10];
      Delay_us(Delay);
      LATA2_bit = 1;
      Delay_us(Delay);
      LATA2_bit = 0;
      uiValor = ucHora; // Coloca o conteúdo da variável do contador na variável auxiliar.
      // Mostra valor da unidade hora.
      LATD = ucMask[uiValor%10]+(ucSegundo%2?0X80:0); // +0x80, insere o ponto
      Delay_us(Delay);
      LATA1_bit = 1;
      Delay_us(Delay);
      LATA1_bit = 0;
      uiValor/=10;
      // Mostra valor da dezena hora.
      LATD = ucMask[uiValor%10];
      Delay_us(Delay);
      LATA0_bit= 1;
      Delay_us(Delay);
      LATA0_bit = 0;
   }
}

void main()
{
   ADCON1 = 0x0f; // Configura todos canais como Digital.
   TRISA0_bit=0; // Define o pino RA0 do PORTA como saída(Seleção Display 1).
   TRISA1_bit=0; // Define o pino RA1 do PORTA como saída(Seleção Display 2).
   TRISA2_bit=0; // Define o pino RA2 do PORTA como saída(Seleção Display 3).
   TRISA3_bit=0; // Define o pino RA3 do PORTA como saída(Seleção Display 4).
   TRISA5_bit=0; // Define o pino RA5 do PORTA como saída(Seleção Display 5).
   TRISA6_bit=0; // Define o pino RA6 do PORTA como saída(Seleção Display 6).
   TRISD = 0; // Define todos os pinos Do PORTD como saída.// Configuração do Timer3.
// Cristal de 8Mhz, ciclo de máquina: 8MHz / 4 = 2Mhz --> 1/2Mhz = 0,5us.
   RD16_bit = 1; // Habilita a leitura e escrita em um ciclo de 16 bits.
   T3CKPS1_bit = 0; // Define prescaler 1:1.
   T3CKPS0_bit = 0; // Define prescaler 1:1.
   TMR3CS_bit = 0; // Clock interno.
   TMR3H = 0x7B; // Carrega o valor alto.
   TMR3L = 0xDC; // Carrega o valor baixo.
   TMR3IE_bit = 1; // Habilita a interrupção do timer3.
   TMR3IF_bit = 0; // Apaga flag de estouro do timer3, pois é fundamental para a sinalização do estouro.
   TMR3ON_bit = 1; // Liga timer3.
   // Configura timer 0 para interrupção a cada 1 segundo aproximadamente.
   T0CON = 0x84;
   TMR0H = 0x0B;
   TMR0L = 0xDB;
   TMR0IE_bit = 1;
   GIE_bit = 1; // Habilita as interrupções não-mascaradas.
   PEIE_bit = 1; // Habilita as interrupções dos periféricos.
   while(1){}; // Aqui definimos uma condição sempre verdadeira como parâmetro, portanto todo o bloco será repetido indefinidamente.
}
relogio 7 segmentos
relógio 7 segmentos

Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[PIC] Relógio digital 7 segmentos
Tags:                             

Deixe uma resposta

%d blogueiros gostam disto: