PIC do Zero

Programação em C para Microcontroladores PIC

Aula 05 - Estruturas de Decisão (if, else e else if)

Nesta aula vamos aprender como o microcontrolador toma decisões. Toda automação utiliza estruturas de decisão para ligar saídas, monitorar sensores e gerar alarmes.

O comando if permite executar uma ação somente quando uma condição for verdadeira.

1. Estrutura IF

if(temperatura > 50) // Se a temperatura for maior que 50
{
    output_high(pin_b0;  // A saída pin_b0 será nível alto
}

Se a temperatura for maior que 50, o código dentro das chaves será executado.

2. Estrutura IF e ELSE

if(temperatura > 50)  // Se a temperatura for maior que 50
{
    output_high(pin_b0;  // A saída pin_b0 será nível alto (1)
}
else
{
    output_low(pin_b0;  // A saída pin_b0 será nível baixo (0)
}

O bloco ELSE é executado quando a condição do IF for falsa.

3. Estrutura ELSE IF

if(temperatura > 80)
{
   // Alarme crítico
}
else if(temperatura > 60)
{
   // Atenção
}
else
{
   // Normal
}

Permite trabalhar com várias condições diferentes.

4. Exemplo com botão e LED

#include <16f628a.h>      // Anexa ao programa o arquivo 16F628A.h
#use delay(clock=4000000) // Utiliza um clock de 4Mhz
#fuses NOPROTECT          // Dispositivo sem proteção para leitura da eeprom
#fuses NOWDT 	         // Watch dog desabilitado
#fuses NOLVP              // Gravação em alta tensão desligada
#fuses HS                 // Opera com cristal acima de 4Mhz
#fuses NOBROWNOUT         // Não reseta o chip se a tensão cair abaixo de 4V

// O programa
void main()

{
    while(1)                        // Loop infinito
    {
        if(input(pin_A3) == 1)      // Se a chave pin_A3 for 1
            output_high(pin_B7);    // A saída pin_B7 será alta (led aceso)
        else
            output_low(pin_B7);    // A saída pin_B7 será baixa (led apagado)
    }
}

Quando o botão ligado ao pino RA7 for pressionado, o LED conectado ao RB7 será acionado.

Ligação

Diagrama do circuito com o PIC16F628A, resistor e LED
As estruturas IF, ELSE e ELSE IF são a base para alarmes, temporizações, monitoramentos e controles industriais.

5. Comando switch

Em alguns casos, como na comparação de uma determinada variável a diversos valores diferentes, o comando if pode torna-se um pouco confuso ou pouco eficiente.

A declaração switch permite a realização de comparações sucessivas como a anterior, de uma forma muito mais elegante, clara e eficiente. Vejamos então o formato geral da declaração switch:

#include <16f628a.h>      // Anexa ao programa o arquivo 16F628A.h
#use delay(clock=4000000) // Utiliza um clock de 4Mhz
#fuses NOPROTECT          // Dispositivo sem proteção para leitura da eeprom
#fuses NOWDT 	         // Watch dog desabilitado
#fuses NOLVP              // Gravação em alta tensão desligada
#fuses HS                 // Opera com cristal acima de 4Mhz
#fuses NOBROWNOUT         // Não reseta o chip se a tensão cair abaixo de 4V

// O programa
void main()

{
    setup_adc_ports (no_analogs);
    while(true)                        // Loop infinito
    {
       output_b(0);
       switch (input_a())
       {
            0 : output_high(pin_b0);
                break;
                1 : output_high(pin_b1);
                break;
                2 : output_high(pin_b2);
                break;
                3 : output_high(pin_b3);
                break;
                defalt :
                    output_high(pin_b4);
       } 
    }
}

Algumas características importantes da declaração switch

  • A declaração switch somente pode testar igualdades. Não são admitidos outros operadores relacionais ou lógicos como em if.
  • Somente dados originais podem ser utilizados como constantes, ou seja, números inteiros de 1, 8, 16 ou 32 bits, ou ainda constates de caractere.
  • Não é permitido que, dentro do mesmo switch, duas case tenham constantes iguai.
  • As cláusulas break e default são opcionais, havendo situações em que a não utilização da cláusa break permite a construção de estruturas switch.