[PIC] Trabalhando com Display de 7 Segmentos por Varredura sem interrupção

Com esse exemplo simples demonstro uma forma fácil de se trabalhar no método de varredura em displays de 7 segmentos.

Como a varredura acaba sendo muito rápida, visualmente não é percebido que os displays ligam e desligam um por um.

Dessa forma acabamos economizando energia, pois como eles ficam ligados frações de segundos, consomem menos.

Código Fonte

void main(){
   // "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 ucStatus_inc; // Variável de travamento do incremento.
   unsigned char ucStatus_dec; // Variável de travamento do decremento.
   unsigned int uiContador; // Variável de armazenamento do contador.
   unsigned int uiValor; // Variável auxiliar para exibição do contador.

   ADCON1 = 0x0f; // Configura todos canais como Digital.

   TRISB.RB0=1; // Define o pino RB0 do PORTB como entrada.
   TRISB.RB1=1; // Define o pino RB1 Do PORTB como entrada.

   TRISA.RA2=0; // Define o pino RA2 do PORTA como saída(Seleção Display 1).
   TRISA.RA3=0; // Define o pino RA3 do PORTA como saída(Seleção Display 2).
   TRISA.RA4=0; // Define o pino RA4 do PORTA como saída(Seleção Display 3).
   TRISA.RA5=0; // Define o pino RA5 do PORTA como saída(Seleção Display 4).

   TRISD = 0; // Define todos os pinos Do PORTD como saída.

   ucStatus_inc=0; // Inicializa a variável com o valor 0.
   ucStatus_dec=0; // Inicializa a variável com o valor 0.
   uiContador=0; // Inicializa a variável com o valor 0.

   while(1)
   {
      // Aqui definimos uma condição sempre verdadeira como parâmetro, portanto todo o bloco será repetido indefinidamente.
      // Le Tecla E Incrementa Contador.
      if((PORTB.RB0==0)&&(ucStatus_inc==0)){ // Incrementa somente uma vez quando a tecla for pressionada.
         ucStatus_inc=1; // Variável de travamento do incremento.
         uiContador++; // Esse operador aritmético(++) realiza o mesmo que variável = variavel + 1.
         if(uiContador>9999){
            /* Essa comparação é feita pois nosso valor máximo é 9999. */
            uiContador=9999;
         }
      }  
      if((PORTB.RB0==1)&&(ucStatus_inc==1))
      { // Volta a disponibilizar a opção de incremento quando a tecla for solta.
         ucStatus_inc=0;
      }
   
      // Le tecla e decrementa contador.
      if((PORTB.RB1==0)&&(ucStatus_dec==0)){ // Decrementa somente uma vez quando a tecla for pressionada.
         ucStatus_dec=1; // Variável de travamento do decremento.
         uiContador--; // Esse operador aritmético(--) realiza o mesmo que variável = variavel - 1.
         if(uiContador>9999){
            /* Essa comparação é feita pois ao decrementar variáveis sem sinal o valor irá para o valor máximo da variável que no caso é 65535. */
            uiContador=0;
         }
      }
      if((PORTB.RB1==1)&&(ucStatus_dec==1)){ // Volta a disponibilizar a opção de incremento quando a tecla for solta.
         ucStatus_dec=0;
      }

      uiValor = uiContador; // Coloca o conteúdo da variável do contador na variável auxiliar.

      // Mostra valor da unidade.
      PORTD = ucMask[uiValor%10]; // Pega modulo (resto) da divisão por 10 e coloca o valor no PORTD.
      PORTA.RA5 = 1; // Liga o transistor associado ao display 1.
      Delay_ms(2); // Delay para escrita no display.
      PORTA.RA5 = 0; // Desliga o transistor associado ao display 1.
      uiValor/=10; // Divide variável por 10.
      // Mostra valor da dezena.
      PORTD = ucMask[uiValor%10];
      PORTA.RA4 = 1;
      Delay_ms(2);
      PORTA.RA4 = 0;
      uiValor/=10;
      // Mostra valor da centena.
      PORTD = ucMask[uiValor%10];
      PORTA.RA3 = 1;
      Delay_ms(2);
      PORTA.RA3 = 0;
      uiValor/=10;
      // Mostra valor do milhar.
      PORTD = ucMask[uiValor%10];
      PORTA.RA2 = 1;
      Delay_ms(2);
      PORTA.RA2 = 0;
   }
}

Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[PIC] Trabalhando com Display de 7 Segmentos por Varredura sem interrupção
Tags:                             

Deixe uma resposta

%d blogueiros gostam disto: