PIC do Zero

Programação em C para Microcontroladores PIC

Aula 07 - Funções em C

Nesta aula vamos estudar as funções em linguagem C. Funções ajudam a organizar o programa, evitar repetição de código e deixar o projeto mais fácil de entender e manter.

Em projetos com microcontroladores PIC, funções são muito usadas para separar tarefas como ligar LED, ler botão, iniciar portas, acionar relé, ler sensor, enviar dados pela serial e controlar alarmes.

1. O que é uma função?

Uma função é um bloco de código que executa uma tarefa específica. Depois de criada, ela pode ser chamada várias vezes dentro do programa.

Exemplo simples:

void ligar_led()
{
    PORTBbits.RB0 = 1;
}

Nesse exemplo, a função ligar_led() foi criada para ligar o LED conectado ao pino RB0.

2. Por que usar funções?

As funções deixam o código mais organizado e facilitam a manutenção do projeto.

  • Evita repetir o mesmo código várias vezes.
  • Facilita a leitura do programa.
  • Divide o projeto em partes menores.
  • Permite reutilizar comandos em vários pontos do código.

3. Estrutura básica de uma função

tipo_de_retorno nome_da_funcao(parametros)
{
    // Comandos da função
}

Uma função pode ter:

  • Tipo de retorno: informa se a função devolve algum valor.
  • Nome: identifica a função.
  • Parâmetros: valores recebidos pela função.
  • Bloco: comandos executados pela função.

4. Função sem retorno e sem parâmetro

Esse é o tipo mais simples de função. Ela executa uma tarefa, mas não recebe valor e não retorna resultado.

void desligar_led()
{
    PORTBbits.RB0 = 0;
}

A palavra void indica que a função não retorna nenhum valor.

5. Chamando uma função

Depois que uma função é criada, podemos chamá-la pelo nome.

ligar_led();
desligar_led();

Quando o programa encontra essa chamada, ele executa os comandos que estão dentro da função.

6. Exemplo completo com PIC

#include <xc.h>
#define _XTAL_FREQ 4000000

void ligar_led()
{
    PORTBbits.RB0 = 1;
}

void desligar_led()
{
    PORTBbits.RB0 = 0;
}

void main()
{
    TRISB = 0x00;

    while(1)
    {
        ligar_led();
        __delay_ms(500);

        desligar_led();
        __delay_ms(500);
    }
}

Nesse exemplo, o LED pisca continuamente. Em vez de escrever diretamente PORTBbits.RB0 = 1 e PORTBbits.RB0 = 0 dentro do laço principal, usamos funções para deixar o código mais claro.

7. Função com parâmetro

Uma função com parâmetro recebe um valor para ser usado internamente.

void controlar_led(unsigned char estado)
{
    PORTBbits.RB0 = estado;
}

Agora podemos chamar a função passando o valor desejado:

controlar_led(1);  // Liga o LED
controlar_led(0);  // Desliga o LED
O parâmetro funciona como uma variável local da função. Nesse exemplo, estado recebe 1 para ligar ou 0 para desligar o LED.

8. Função com retorno

Uma função com retorno executa uma tarefa e devolve um valor para o programa.

unsigned char ler_botao()
{
    return PORTAbits.RA0;
}

A palavra return devolve o valor lido no pino RA0.

Exemplo de uso:

if(ler_botao() == 1)
{
    PORTBbits.RB0 = 1;
}
else
{
    PORTBbits.RB0 = 0;
}

9. Exemplo prático: botão controlando LED

#include <xc.h>

unsigned char ler_botao()
{
    return PORTAbits.RA0;
}

void ligar_led()
{
    PORTBbits.RB0 = 1;
}

void desligar_led()
{
    PORTBbits.RB0 = 0;
}

void main()
{
    TRISA = 0xFF;
    TRISB = 0x00;

    while(1)
    {
        if(ler_botao() == 1)
        {
            ligar_led();
        }
        else
        {
            desligar_led();
        }
    }
}

O programa lê o botão através da função ler_botao(). Se o botão estiver acionado, chama ligar_led(). Caso contrário, chama desligar_led().

10. Função para configurar o PIC

Uma boa prática é criar uma função somente para configurar as portas do microcontrolador.

void configurar_pic()
{
    TRISA = 0xFF;  // PORTA como entrada
    TRISB = 0x00;  // PORTB como saída
    PORTB = 0x00;  // Inicia saídas desligadas
}

Depois, chamamos essa função no início do programa principal:

void main()
{
    configurar_pic();

    while(1)
    {
        // Programa principal
    }
}

11. Variáveis locais

Variáveis declaradas dentro de uma função só existem dentro daquela função.

void exemplo()
{
    int contador = 0;
    contador++;
}

A variável contador só pode ser usada dentro da função exemplo().

12. Variáveis globais

Variáveis globais são declaradas fora das funções e podem ser usadas em várias partes do programa.

unsigned char alarme = 0;

void ligar_alarme()
{
    alarme = 1;
}
Use variáveis globais com cuidado. Elas são úteis em sistemas embarcados, mas o excesso pode dificultar a manutenção do programa.

13. Protótipos de função

Em C, quando uma função é escrita depois da função main(), é recomendado declarar seu protótipo antes.

void ligar_led();

void main()
{
    ligar_led();

    while(1)
    {
    }
}

void ligar_led()
{
    PORTBbits.RB0 = 1;
}

O protótipo avisa ao compilador que a função existe, mesmo que o código dela apareça mais abaixo.

14. Erros comuns

Erro 1: esquecer os parênteses ao chamar a função.

ligar_led;

Correto:

ligar_led();

Erro 2: esquecer o ponto e vírgula na chamada.

ligar_led()

Correto:

ligar_led();

Erro 3: criar função dentro de outra função.

void main()
{
    void ligar_led()
    {
        PORTBbits.RB0 = 1;
    }
}

Em C, as funções devem ser criadas separadamente, fora da função main().

15. Exercício prático

Crie três funções:

  • ligar_rele(): liga RB1.
  • desligar_rele(): desliga RB1.
  • ler_sensor(): retorna o estado de RA1.

Resposta sugerida:

void ligar_rele()
{
    PORTBbits.RB1 = 1;
}

void desligar_rele()
{
    PORTBbits.RB1 = 0;
}

unsigned char ler_sensor()
{
    return PORTAbits.RA1;
}

Resumo da Aula

  • Funções organizam o programa em blocos menores.
  • void indica função sem retorno.
  • Funções podem receber parâmetros.
  • Funções podem retornar valores com return.
  • Funções são muito usadas para controlar entradas, saídas, sensores e alarmes no PIC.
A partir desta aula, os exemplos do curso ficarão mais organizados, separando configuração, leitura de entradas, controle de saídas e lógica principal em funções diferentes.