PIC do Zero

Programação em C para Microcontroladores PIC

Aula 06 - Estruturas de Repetição (while, for e do while)

Nesta aula vamos estudar as estruturas de repetição da linguagem C. Elas permitem que um trecho do programa seja executado várias vezes, de forma controlada ou contínua.

Em microcontroladores PIC, estruturas de repetição são fundamentais porque o programa normalmente precisa ficar rodando o tempo todo, lendo entradas, acionando saídas e verificando sensores.

1. O que é uma repetição?

Uma repetição, também chamada de laço ou loop, faz o programa executar o mesmo bloco de código mais de uma vez.

Exemplo prático:

  • Ler um botão continuamente.
  • Piscar um LED várias vezes.
  • Contar pulsos de um sensor.
  • Atualizar uma saída enquanto uma condição for verdadeira.

2. Estrutura while

O comando while executa um bloco de código enquanto uma condição for verdadeira.

while(condicao)
{
    // Comandos executados enquanto a condição for verdadeira
}

Exemplo:

int contador = 0;

while(contador < 10)
{
    contador++;
}

Nesse exemplo, o contador começa em zero e vai aumentando até chegar a 10.

3. while(1) no PIC

Em programação de microcontroladores, é muito comum usar while(1). Esse comando cria um laço infinito.

while(1)
{
    // Programa principal
}
O número 1 representa uma condição sempre verdadeira. Por isso, o programa nunca sai desse laço.

Esse é o funcionamento normal de um PIC: depois da configuração inicial, ele entra no laço principal e fica executando o programa continuamente.

4. Exemplo com leitura de botão

#include <xc.h>

void main()
{
    TRISA = 0xFF;  // PORTA como entrada
    TRISB = 0x00;  // PORTB como saída

    while(1)
    {
        if(PORTAbits.RA0 == 1)
        {
            PORTBbits.RB0 = 1;
        }
        else
        {
            PORTBbits.RB0 = 0;
        }
    }
}

O programa fica verificando continuamente o botão ligado ao pino RA0. Se o botão for acionado, o LED no RB0 acende. Caso contrário, o LED apaga.

5. Estrutura for

O comando for é usado quando sabemos quantas vezes queremos repetir uma ação.

for(inicio; condicao; incremento)
{
    // Comandos repetidos
}

Exemplo:

int i;

for(i = 0; i < 10; i++)
{
    // Executa 10 vezes
}

Explicação:

  • i = 0: valor inicial.
  • i < 10: condição para continuar repetindo.
  • i++: incrementa a variável a cada repetição.

6. Exemplo de repetição com for

int i;

for(i = 0; i < 5; i++)
{
    PORTBbits.RB0 = 1;
    __delay_ms(500);
    PORTBbits.RB0 = 0;
    __delay_ms(500);
}

Esse exemplo pisca o LED conectado ao RB0 cinco vezes.

Para usar __delay_ms(), o projeto precisa ter a frequência do oscilador definida com #define _XTAL_FREQ.

7. Exemplo com _XTAL_FREQ

#include <xc.h>
#define _XTAL_FREQ 4000000

void main()
{
    TRISB = 0x00;

    while(1)
    {
        PORTBbits.RB0 = 1;
        __delay_ms(500);
        PORTBbits.RB0 = 0;
        __delay_ms(500);
    }
}

Nesse código, o LED fica piscando continuamente com intervalo de 500 milissegundos.

8. Estrutura do while

O comando do while executa o bloco de código pelo menos uma vez antes de testar a condição.

do
{
    // Comandos executados pelo menos uma vez
}
while(condicao);

Exemplo:

int contador = 0;

do
{
    contador++;
}
while(contador < 10);

A diferença principal é que o teste da condição acontece no final da estrutura.

9. Comparando while, for e do while

  • while: usado quando a repetição depende de uma condição.
  • for: usado quando sabemos a quantidade de repetições.
  • do while: usado quando o bloco precisa executar pelo menos uma vez.

10. Erros comuns

Erro 1: esquecer de alterar a variável dentro do while.

int contador = 0;

while(contador < 10)
{
    // contador nunca muda
}

Esse erro cria um laço infinito sem intenção.

Correção:

int contador = 0;

while(contador < 10)
{
    contador++;
}

Erro 2: ponto e vírgula após o for.

for(i = 0; i < 10; i++);
{
    PORTBbits.RB0 = 1;
}

O ponto e vírgula encerra o comando for antes do bloco.

11. Exercício prático

Complete mentalmente o que acontece no código abaixo:

int contador = 0;

while(contador < 3)
{
    contador++;
}

Resposta: o contador começa em 0, passa para 1, depois 2, depois 3. Quando chega a 3, a condição deixa de ser verdadeira e o laço termina.

Resumo da Aula

  • Estruturas de repetição executam comandos várias vezes.
  • while repete enquanto a condição for verdadeira.
  • while(1) cria o laço principal infinito do PIC.
  • for é ideal para repetições com quantidade definida.
  • do while executa primeiro e testa a condição depois.
A partir desta aula, já podemos montar exemplos práticos mais próximos do PIC real, como LED piscante, contador de eventos e leitura contínua de entradas digitais.