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.
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
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.