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