21
RESUMO Linguagem C para Microcontroladores Prof. Glauber G. O. Brante UTFPR – Universidade Tecnológica Federal do Paraná DAELT – Departamento Acadêmico de Eletrotécnica

RESUMO Linguagem C para Microcontroladores

  • Upload
    others

  • View
    6

  • Download
    1

Embed Size (px)

Citation preview

Page 1: RESUMO Linguagem C para Microcontroladores

RESUMO

Linguagem C para Microcontroladores

Prof. Glauber G. O. Brante

UTFPR – Universidade Tecnológica Federal do ParanáDAELT – Departamento Acadêmico de Eletrotécnica

Page 2: RESUMO Linguagem C para Microcontroladores

Sumário

1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Definições Gerais em Linguagem C . . . . . . . . . . . . . . . . . . . . . 42.1 A Linguagem C é Case Sensitive . . . . . . . . . . . . . . . . . . . . . . . 42.2 Palavras Reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.3 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.4 Representação Numérica . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.5 Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.5.1 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.5.2 Definições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.6 Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.6.1 Variáveis Locais . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.6.2 Variáveis Globais . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.7 Funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.8 Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.1 Operadores Aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.2 Operadores Relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.3 Operadores Booleanos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.4 Operadores Lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.5 Associação de Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Estruturas Condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.1 A Estrutura if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.2 A Estrutura if-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.3 A Estrutura if-else if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.4 A Estrutura switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Estruturas de Repetição . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185.1 O Laço for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5.1.1 O Comando break . . . . . . . . . . . . . . . . . . . . . . . . . . 185.2 O Laço while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

5.2.1 Estrutura de Repetição Infinita . . . . . . . . . . . . . . . . . . . . 195.3 O Laço do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Comentários Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

Page 3: RESUMO Linguagem C para Microcontroladores

1 Introdução 3

1 Introdução

O objetivo desse documento é fornecer um resumo sobre a linguagem C com ênfase emaplicações para microcontroladores. O emprego da linguagem C na programação de mi-crocontroladores não é complicado, mas exige conhecimento mínimo da estrutura de pro-gramação, além de conhecimentos específicos sobre as estruturas internas do microcon-trolador em questão. Este resumo apresentará as estruturas de programação mais comuns,necessárias para se programar microcontroladores. Para os conhecimentos específicos decada microcontrolador, uma leitura do datasheet do componente se faz necessária.

A estrutura básica de um programa em C para microcontroladores é a seguinte:void main(){

// inicializações de hardware e software

while(1) // loop infinito{

/* tarefas a serem executadas pelo microcontroladordurante o funcionamento */

}}

Com o uso inteligente dos comentários e funções, a programação se torna de mais fá-cil compreensão. Programas extensos podem ser divididos em sub-rotinas (funções) queocasionalmente consumirão menos memória do microcontrolador e tornarão o se proces-samento mais rápido.

Page 4: RESUMO Linguagem C para Microcontroladores

2 Definições Gerais em Linguagem C 4

2 Definições Gerais em Linguagem C

2.1 A Linguagem C é Case SensitiveCase sensitive significa que a linguagem C diferencia as letras maiúsculas das minúsculas.Assim, os identificadores CONTADOR, contador e Contador são diferentes entre si. De-vemos prestar bastante atenção a esse fato, pois se criarmos uma variável de uma maneirae escrevermos de outra na hora de utilizá-la teremos um erro de compilação.

Essa regra também se aplica a todos os comandos da linguagem C, que devem serescritos em letras minúsculas, e.g., while, for, if.

2.2 Palavras ReservadasA linguagem C possui um conjunto de palavras reservadas que não podem ser usadas comovariáveis de programa. As palavras reservadas da linguagem C, no padrão ANSI, são:

Tab. 1: Palavras Reservadas em Linguagem Cauto break case char const

continue default do double elseenum extern float for goto

if int long register returnshort signed sizeof static struct

switch typedef union unsigned voidvolatile while main

Como já comentado, uma palavra reservada da linguagem C não pode ser utilizada peloprogramador como variável do programa. A seguir temos um exemplo de erro no empregode variáveis:while = 1;int = 200;

2.3 ComentáriosOs comentários auxiliam na documentação do programa e são fundamentais para enten-dimento futuro de sua funcionalidade, especialmente se quem vai fazer a manutenção dofirmware não é o próprio programador que o criou. Além disso, os comentários tambémsão úteis exclusão de linhas de código durante a compilação, facilitando os testes durante aprogramação.

Em geral, grande parte dos compiladores aceita dois tipos de comentários, os de linhasimples e os de múltiplas linhas. Os comentários de linha simples sempre são iniciadoscom “//” (dupla barra), fazendo com que o compilador ignore tudo o que estiver na mesmalinha depois da dupla barra. Por exemplo:// Este é um comentário de linha simples.

Page 5: RESUMO Linguagem C para Microcontroladores

2 Definições Gerais em Linguagem C 5

Por sua vez, os comentários de múltiplas linhas devem ser sempre iniciados com “/*” eterminados com “*/”. Por exemplo:/* Este é um

comentário demúltiplas linhas.

*/

2.4 Representação NuméricaNessa subseção apresentaremos um resumo das representações numéricas para microcon-troladores PIC, baseados no compilador MikroC Pro. Os tipos numéricos são os mesmospara todos os microcontroladores, porém a representação numérica pode variar entre osdiversos compiladores existentes.

• Decimal:valor_decimal = 125;

• Binário:PORTA = 0b11110001;

• Hexadecimal:valor_hexa = 0xFF;

• Octal:valor_octal = 075;

• Caractere:caracter = ’a’;

2.5 Tipos de DadosToda variável usada em um programa deve ser declarada como de um determinado tipo,que define seu tamanho (em número de bits) e suas características. As variáveis podem ser:

Tab. 2: Tipos de DadosTipo Bytes Mínimo Máximo Representavoid Zero Sem valor Sem valor Valores nuloschar 1 -128 127 Caracteresint 2 -32768 32767 Inteiros

float 4 ±1, 5× 10−45 ±3, 4× 1038 Valores com casas decimais (ponto flutuante)double 8 ±4, 9× 10−324 ±1, 8× 10308 Valores com casas decimais (ponto flutuante)

Page 6: RESUMO Linguagem C para Microcontroladores

2 Definições Gerais em Linguagem C 6

Além disso, temos os seguintes modificadores de tipo:

Tab. 3: Modificadores de Tipos de DadosTipo Modificação

signed Com sinalunsigned Sem sinal

short Inteiro menor que o padrãolong Inteiro maior que o padrão

Portanto, temos os seguintes tipos de dados inteiros:

Tab. 4: Tipos de Dados InteirosTipo Bytes Mínimo Máximochar 1 -128 127

signed char 1 -128 127unsigned char 1 0 255

short int 2 -128 127signed short int 2 -128 127

unsigned short int 2 0 255int 2 -32768 32767

signed int 2 -32768 32767unsigned int 2 0 65535

short 2 -32768 32767signed short 2 -32768 32767

unsigned short 2 0 65535long int 4 −231 231 − 1

signed long int 4 −231 231 − 1unsigned long int 4 0 232 − 1

2.5.1 Constantes

Servem para criar símbolos de valor constante que auxiliam na programação. No momentoda compilação, o compilador se encarrega de atribuir os valores corretos aos símboloscriados. Por exemplo:const LIGADO = 1;const DESLIGADO = 0;const TMAX = 100;

Após definir as constantes, é possível utilizar estas palavras como tendo o mesmo sig-nificado do valor numérico atribuído.

Page 7: RESUMO Linguagem C para Microcontroladores

2 Definições Gerais em Linguagem C 7

2.5.2 Definições

Além de dar nome a valores constantes, também podemos atribuir outros nomes a símbolosjá existentes no microcontrolador. Por exemplo, imagine que você tenha um LED ligadoao bit 0 da porta A do seu microcontrolador, além de um motor DC ligado ao bit 1 dessamesma porta. Para facilitar a programação, pode-se fazer:#define LED PORTA.B0#define MOTOR PORTA.B1

Observe que na Linguagem C os comandos iniciados pelo caractere “#” são os únicosque não recebem ponto-e-vírgula no final da sentença.

Assim, os comandos de definição “#define” e “const” servem para tornar o programamais compreensível. Além disso, estes comandos são sempre eliminados pelo compilador,ou seja, não consomem memória extra do microcontrolador.

Para visualizar sua utilizada, considere o código abaixo utilizando definições e cons-tantes:#define LED PORTA.B0#define MOTOR PORTA.B1

const LIGADO = 1;const DESLIGADO = 0;

void main(){

LED = LIGADO;MOTOR = LIGADO;

}

2.6 VariáveisUma variável sempre deve ser declarada da seguinte forma:(<modificador>) <tipo de dado> <nome da variável> (= <valor>);

Note que a utilização do modificador e da inicialização da variável são opcionais.Exemplos:unsigned int valor = 123;char letra = ’a’;int contador;

As variáveis podem ser do tipo locais ou globais, conforme veremos a seguir.

Page 8: RESUMO Linguagem C para Microcontroladores

2 Definições Gerais em Linguagem C 8

2.6.1 Variáveis Locais

São variáveis declaradas dentro de um bloco de instruções (ou função) e só podem seracessadas dentro desse bloco. Exemplo:int media(){

int valor1 = 5;int valor2 = 7;

return (valor1+valor2)/2;}

Uma observação importante é que todas as definições de variáveis locais devem apare-cer logo no início do bloco/função.

2.6.2 Variáveis Globais

São declaradas fora dos blocos de função e podem ser acessadas por todas as funções eblocos de instruções. Exemplo:int valor1 = 5;int valor2 = 7;

int media(){

return (valor1+valor2)/2;}

int soma(){

return valor1+valor2;}

Mas atenção, apesar de parecer uma boa ideia declarar funções globais devemos terbastante cuidado com sua utilização. Uma vez que estas variáveis podem ser acessadaspor todas as funções, é difícil manter o controle sobre seus valores à medida que o códigovai sendo executado. Por essa razão, declarar variáveis globais não é considerada uma boaprática de programação, devendo ser utilizadas apenas quando estritamente necessárias, ede forma bastante cuidadosa.

2.7 FunçõesQuando temos trechos de códigos que são repetidos várias vezes, podemos isolar estes tre-chos em funções. Assim, podemos chamar uma função em diferentes pontos do programaprincipal, evitando reescrever aquele trecho de código repetidamente.

Uma função deve ser declarada antes de ser chamada. Por isso é importante escrevertodas as novas funções antes da função principal (main). Por exemplo:

Page 9: RESUMO Linguagem C para Microcontroladores

2 Definições Gerais em Linguagem C 9

void piscaLED() // declara o início da função piscaLED{

PORTA.B0 = 1; // liga o pino A0delay_ms(1000); // aguarda 1000ms (1 segundo)PORTA.B0 = 0; // desliga o pino A0delay_ms(1000); // aguarda 1 segundo

}

void main(void) // início do programa principal{

while(1){

piscaLED(); // chama a função piscaLED}

}

O void, que traduzido para português quer dizer vazio, é um tipo de dado utilizado emfunções que não retornam nenhum parâmetro. A função main é sempre do tipo void, poisnão retorna nem recebe nanhum valor.

Entretanto, as funções podem muitas vezes conter parâmetros de entrada que carregaminformações para dentro do bloco da função, além de parâmetros de saída, devolvendoinformações ao programa principal. Por exemplo:int media(int a, int b) /* declara o início da função media.

Essa função recebe dois valoresdo tipo int (a e b) */

{return (a + b)/2; // retorna um valor do tipo int

}

void main(void) // início do programa principal{

int valor1 = 10;int valor2 = 20;int result;

result = media(valor1, valor2); /* A função média retornaseu valor do tipo intna variável result */

}

2.8 HeaderEm muitos compiladores, é necessário incluir um arquivo que contém todas as definiçõesdo microcontrolador sendo utilizado. Isto é feito através do comando “#include”. Em geral,temos a seguinte sintaxe que deve ser incluída logo no início de qualquer programa:#include<microcontrolador.h>

Além deste arquivo com as definições do microcontrolador, podemos utiliza a instrução“#include” para incluir algum arquivo denominado cabeçalho, contendo funções auxiliaresa serem utilizadas. Por exemplo:#include<nome_do_arquivo.h>

Page 10: RESUMO Linguagem C para Microcontroladores

3 Operadores 10

3 Operadores

A linguagem C possui operadores para atribuir, comparar ou modificar dados e variáveis.Podemos dividir estes operadores em quatro categorias principais:

• Aritméticos: para cálculos;

• Relacionais: para comparar valores numéricos;

• Lógicos: para testar condições ou manipular bits;

• Booleanos: para realizar operações lógicas com mais de um bit.

3.1 Operadores AritméticosEm linguagem C temos os seguintes operadores aritméticos:

Tab. 5: Operadores AritméticosSímbolo Operação

+ Soma- Subtração* Multiplicação/ Divisão

% Resto inteiro da divisão++ Incremento em um– Decremento em um

Os operadores aritméticos sempre usam duas variáveis e retornam um terceiro valormantendo inalteradas as variáveis originais. Exemplos:

• Soma:int y = 10;int z = 5;int x = 0;

x = y + z; /* Soma o conteúdo da variável y com avariável z e armazena o resultado navariável x */

• Subtração:int a = 10;int b = 5;int c = 0;

c = b - a; /* Subtrai da variável b o conteúdo davariável a e armazena o resultado navariável c */

Page 11: RESUMO Linguagem C para Microcontroladores

3 Operadores 11

• Multiplicação:int a = 1;int b = 20;int c = 2;

a = b*c; /* Multiplica o conteúdo da variável b pelo davariável c e armazena o resultado navariável a */

• Divisão:int a = 0;int b = 20;int c = 2;

a = b/c; /* Divide o conteúdo da variável b pelo davariável c e armazena o resultado navariável a */

• Resto inteiro da divisão:int a = 1;int b = 25;int c = 2;

a = b%c; /* Divide o conteúdo da variável b pelo davariável c e armazena o resto da divisão navariável a */

• Incremento em um:int contagem = 0;

contagem++; // Incrementa a variável contagem em um

• Decremento em um:int contagem = 0;

contagem--; // Decrementa a variável contagem em um

3.2 Operadores RelacionaisRealizam operações de comparação, retornando os valores FALSO (0) ou VERDADEIRO(1). Esses operadores não afetam o conteúdo das variáveis sendo comparadas.

Page 12: RESUMO Linguagem C para Microcontroladores

3 Operadores 12

Tab. 6: Operadores RelacionaisSímbolo Descrição

== Igual a!= Diferente de< Menor que> Maior que

<= Menor ou igual>= Maior ou igual

Exemplo:void main(){

unsigned char cont = 0;while(1){

if (PORTA.B0 == 1) // Se o pino A0 estiver ligadoif (cont < 9)

cont++; /* Se contagem for maior que 9,incrementa */

elsecont = 0; // Caso contrário, zera

}}

3.3 Operadores BooleanosSão usados para realizar testes booleanos entre elementos em um teste condicional. Osoperadores são:

Tab. 7: Operadores BooleanosSímbolo Descrição

&& E (AND)| | OU (OR)! NÃO (NOT)

• Exemplo 1:int A = 0;if ((A > 0) && (A < 10))

A++;

Significado: se A for maior do que zero E A for menor do que dez, então incrementeA em um.

Page 13: RESUMO Linguagem C para Microcontroladores

3 Operadores 13

• Exemplo 2:int A = 0;int B = 0;int C = 0;if ((A != B) || (A != C))

A--;

Significado: se A for diferente de B OU A for diferente de C, então decremente Aem um.

3.4 Operadores LógicosSão usados para realizar testes lógicos bit a bit. Os operadores lógicos são:

Tab. 8: Operadores LógicosSímbolo Descrição

& E (AND)| OU (OR)∧ OU Exclusivo (XOR)∼ NÃO (NOT)» Deslocamento para a direita« Deslocamento para a esquerda

• Exemplo 1:int cont = 0;if (PORTA.B0 & PORTA.B1)

cont++;

Significado: se PORTA.B0 for igual a um E PORTA.B1 for igual a um, então cont éincrementado em uma unidade.

• Exemplo 2:int cont = 0b00000001;if (PORTA.B0 | PORTA.B1)

cont = cont<<1;

Significado: se PORTA.B0 for igual a um OU PORTA.B1 for igual a um, então ovalor de cont é deslocado para a esquerda.

• Exemplo 3:int cont = 10;if (PORTA.B0 & ~PORTA.B1)

cont--;

Significado: se PORTA.B0 for igual a um E PORTA.B1 não for igual a um, então ovalor de cont é decrementado de uma unidade.

Page 14: RESUMO Linguagem C para Microcontroladores

3 Operadores 14

3.5 Associação de OperadoresAlgumas abreviações são comumente utilizadas com os operadores. Dentre elas podemoscitar:

Tab. 9: Abreviações de OperadoresForma Expandida Forma Reduzida

x = x + y x += yx = x - y x -= yx = x * y x *= yx = x / y x /= y

x = x % y x %= yx = x & y x &= yx = x | y x |= yx = x ∧ y x ∧= y

x = x << y x <<= yx = x >> y x >>= y

Page 15: RESUMO Linguagem C para Microcontroladores

4 Estruturas Condicionais 15

4 Estruturas Condicionais

4.1 A Estrutura ifA estrutura if, que significa “se” em português, é uma estrutura de decisão baseada noresultado de um teste lógico. Sua forma geral é:if (condição){

comando 1;comando 2;...comando n;

}

Se houver apenas uma instrução a ser executada após o teste lógico, as chaves podemdesprezadas:if (condição)

comando;

Em C, qualquer número diferente de zero é considerado verdadeiro, o que significa quea condição if só será falsa se o teste lógico aplicado resultar em zero (0). Qualquer outrovalor, mesmo que negativo, é considerado verdadeiro (1).

Exemplo:void main(){

int contagem = 0;if (PORTA.B0)

contador++; /* Apenas se o valor da porta A0 for igual aum, o contador será incrementado */

}

Entretanto, em geral utilizamos uma expressão lógica como condição de entrada para aestrutura if:void main(){

int contagem = 0;if (PORTA.B0 == 0)

contador++; /* Apenas se o valor da porta A0 for igual azero, o contador será incrementado */

}

Uma observação importante é quanto a diferença entre o operador de atribuição (=) ea operação booleana de igualdade (==). Para inicializar uma variável utilizamos =, porém,para testar o valor de uma variável utilizamos ==. Por exemplo:int a = 10; // Inicializamos a variável ’a’ com o valor 10

if (a == 10) // Fazemos o teste booleano com a variável ’a’a++;

Page 16: RESUMO Linguagem C para Microcontroladores

4 Estruturas Condicionais 16

4.2 A Estrutura if-elseA estrutura if pode ser expandida com o uso de else (senão), que permite definir comandosa serem executados caso o teste seja falso (0). Por exemplo:int i = 10;int j = 5;

if (i == 10) // Se ’i’ for igual a 10, incrementa jj++;

else // Senão, decrementa jj--;

Caso haja mais de um comando if na sequência, o else estará sempre relacionado como último if. Por exemplo:int i = 10;int j = 5;

if (i == 10) // Se ’i’ for igual a 10, incrementa jj++;

else // Senão, decrementa jj--;

4.3 A Estrutura if-else ifEste tipo de estrutura permite um número de alinhamentos de comandos, possibilitandocolocar estruturas if dentro de outras estruturas if com maior facilidade. Seu formato geralé:if (condição 1){

comandos;}else if (condição 2){

comandos;}else if (condição 3){

comandos;}

A estrutura if-else if é uma alternativa para tornar tomadas de decisões mais rápidas emalguns casos, Isto ocorre porque, no momento em que alguma condição seja satisfeita, osdemais blocos if subsequentes não serão sequer testados.

Page 17: RESUMO Linguagem C para Microcontroladores

4 Estruturas Condicionais 17

4.4 A Estrutura switchA estrutura switch é muito parecida com a estrutura if-else if. A diferença é que switch nãoaceita expressões lógicas para tomar decisões, mas somente constantes. O comando switchtesta o valor de uma variável e executa os comandos correspondentes a casos (cases) pré-estabelecidos. Cada case define uma série de comandos que serão executados até chegar nainstrução break. Quando nenhum caso correspondente for encontrado, a cláusula defaultserá executada. Porém, o uso da cláusula default é opcional.

Formato da estrutura switch:switch(variável){

case constante1:comandos;break;

case constante2:comandos;break;

...case constante n:

comandos;break;

default:comandos;break;

Exemplo de uso da estrutura switch:int contador = read_ADC(); /* lê o valor do conversor AD e armazena

na variável ’contador’ */switch(contador){

case 0:x++;PORTA.B0 = 1;break;

case 1:PORTA.B1 = 1;break;

case 2:PORTA.B0 = 0;PORTA.B1 = 0;break;

default:break;

Page 18: RESUMO Linguagem C para Microcontroladores

5 Estruturas de Repetição 18

5 Estruturas de Repetição

5.1 O Laço forO laço for é utilizado quando precisamos de uma ciclo controlado de repetições. Em suainicialização definimos uma variável de controle, a qual damos um valor inicial, uma con-dição de parada, e uma regra de incremento (ou decremento). Antes de serem executadosos comandos do laço for, avalia-se a condição de teste. Caso esta condição seja verdadeira,os comandos são executados. A cada ciclo de execução (iteração), a variável de controle éincrementada ou decrementada de acordo com uma regra.

A estrutura geral do laço for é:for(inicialização; condição; incremento){

comandos;}

Vejamos um exemplo de uso:for(i = 0; i < 10; i++){

PORTA.B0 = 1; // liga o pino A0delay_ms(1000); // aguarda 1 segundoPORTA.B0 = 0; // desliga o pino A0delay_ms(1000); // aguarda 1 segundo

}

Neste exemplo, a variável ’i’ é inicialmente carregada com o valor 0 (i = 0). Comoa condição inicial é verdadeira (i < 10), os comandos do laço são executados. Após aexecução dos comandos do laço, a variável ’i’ é incrementada em uma unidade, dada pelacondição de incremento ’i++’, e novamente os comandos do laço são executados. Isto éfeito até que a condição se torne falsa, isto é, quando ’i’ for igual a 10.

Ainda é possível utilizar o laço for em passos decrescentes. O mesmo código acimapode ser escrito de maneira equivalente como:for(i = 10; i > 0; i--){

PORTA.B0 = 1; // liga o pino A0delay_ms(1000); // aguarda 1 segundoPORTA.B0 = 0; // desliga o pino A0delay_ms(1000); // aguarda 1 segundo

}

5.1.1 O Comando break

o comando break é utilizado para encerrar o laço for antes de se completar todas as itera-ções. Quando o laço é quebrado, o programa pula para a próxima instrução após o laço.Exemplo:void main(){

int i = 0;

Page 19: RESUMO Linguagem C para Microcontroladores

5 Estruturas de Repetição 19

for(i = 0; i < 10; i++){

if (PORTB.B0 == 1)break;

PORTA.B0 = 1; // liga o pino A0delay_ms(1000); // aguarda 1 segundoPORTA.B0 = 0; // desliga o pino A0delay_ms(1000); // aguarda 1 segundo

}}

Neste exemplo, o pino A0 ficará piscando desde que o pino B0 seja diferente de 1.Quando isto acontecer (quando B0 for ligado), o comando break será executado e o laçoserá encerrado.

5.2 O Laço whileO laço while tem a seguinte estrutura:while(condição){

comandos;}

Dessa forma, o laço inicialmente verifica uma condição lógica. Se esta condição forverdadeira, os comandos dentro do laço serão executados, caso contrário, o programa saltapara a linha de comando imediatamente após o fim do laço.

A condição pode ser uma operação relacional, ou um teste booleano. Por exemplo:while(x<50) // Enquanto x for menor do que 50{

x++; // incrementa x}

5.2.1 Estrutura de Repetição Infinita

Microcontroladores em geral são programados para executar uma tarefa indefinidamente.Dessa forma, o uso de laços infinitos é bastante comum. Uma maneira de criar um laçoinfinito é fornecer uma condição sempre verdadeira ao while. Assim, uma estrutura típicade um programa em C para microcontroladores é a seguinte:void main(){

// inicializações de hardware e software

while(1) // loop infinito{

/* tarefas a serem executadas pelo microcontroladordurante o funcionamento */

}}

onde a condição em “while(1)” é sempre verdadeira (sempre igual a 1).

Page 20: RESUMO Linguagem C para Microcontroladores

5 Estruturas de Repetição 20

5.3 O Laço do-whileO laço do-while nada mais é do que uma variação do laço while. Sua estrutura geral é:do{

comandos;} while(condição);

A diferença aqui é que os comandos são executados antes de se realizar o teste lógicode condição. Caso o teste executado ao final seja verdadeiro, o laço é executado novamentedo início. Caso contrário, o programa segue com a instrução imediatamente após o laço.

Page 21: RESUMO Linguagem C para Microcontroladores

6 Comentários Finais 21

6 Comentários Finais

Todo o material apresentado neste resumo é material de livre acesso, baseado nas notas deaula disponíveis em http://paginapessoal.utfpr.edu.br/gbrante, bem como no livro “Progra-mação Linguagem C para Microcontroladores 8051”, da iniciativa u8051, disponível emhttp://www.u8051.com.br/.