Prof. Glauber G. O. Brante UTFPR Universidade Tecnolgica Federal do Paran DAELT Departamento Acadmico de Eletrotcnica Sumrio 1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 Denies Gerais em Linguagem C . . . . . . . . . . . . . . . . . . . . . 4 2.1 A Linguagem C Case Sensitive . . . . . . . . . . . . . . . . . . . . . . . 4 2.2 Palavras Reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.3 Comentrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.4 Representao Numrica . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.5 Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.5.1 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.5.2 Denies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.6 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.6.1 Variveis Locais . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.6.2 Variveis Globais . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.7 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.8 Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.1 Operadores Aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.2 Operadores Relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.3 Operadores Booleanos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.4 Operadores Lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.5 Associao de Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4 Estruturas Condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4.1 A Estrutura if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4.2 A Estrutura if-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.3 A Estrutura if-else if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.4 A Estrutura switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 5 Estruturas de Repetio . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.1 O Lao for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.1.1 O Comando break . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.2 O Lao while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.2.1 Estrutura de Repetio Innita . . . . . . . . . . . . . . . . . . . . 19 5.3 O Lao do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 6 Comentrios Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1 Introduo 3 1 Introduo O objetivo desse documento fornecer um resumo sobre a linguagem C com nfase em aplicaes para microcontroladores. O emprego da linguagem C na programao de mi- crocontroladores no complicado, mas exige conhecimento mnimo da estrutura de pro- gramao, alm de conhecimentos especcos sobre as estruturas internas do microcon- trolador em questo. Este resumo apresentar as estruturas de programao mais comuns, necessrias para se programar microcontroladores. Para os conhecimentos especcos de cada microcontrolador, uma leitura do datasheet do componente se faz necessria. A estrutura bsica de um programa em C para microcontroladores a seguinte: void main() { // inicializaes de hardware e software while(1) // loop infinito { / * tarefas a serem executadas pelo microcontrolador durante o funcionamento * / } } Com o uso inteligente dos comentrios e funes, a programao se torna de mais f- cil compreenso. Programas extensos podem ser divididos em sub-rotinas (funes) que ocasionalmente consumiro menos memria do microcontrolador e tornaro o se proces- samento mais rpido. 2 Denies Gerais em Linguagem C 4 2 Denies Gerais em Linguagem C 2.1 A Linguagem C Case Sensitive Case sensitive signica que a linguagem C diferencia as letras maisculas das minsculas. Assim, os identicadores CONTADOR, contador e Contador so diferentes entre si. De- vemos prestar bastante ateno a esse fato, pois se criarmos uma varivel de uma maneira e escrevermos de outra na hora de utiliz-la teremos um erro de compilao. Essa regra tambm se aplica a todos os comandos da linguagem C, que devem ser escritos em letras minsculas, e.g., while, for, if. 2.2 Palavras Reservadas A linguagem C possui um conjunto de palavras reservadas que no podem ser usadas como variveis de programa. As palavras reservadas da linguagem C, no padro ANSI, so: Tab. 1: Palavras Reservadas em Linguagem C auto break case char const continue default do double else enum extern oat for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while main Como j comentado, uma palavra reservada da linguagem C no pode ser utilizada pelo programador como varivel do programa. A seguir temos um exemplo de erro no emprego de variveis: while = 1; int = 200; 2.3 Comentrios Os comentrios auxiliam na documentao do programa e so fundamentais para enten- dimento futuro de sua funcionalidade, especialmente se quem vai fazer a manuteno do rmware no o prprio programador que o criou. Alm disso, os comentrios tambm so teis excluso de linhas de cdigo durante a compilao, facilitando os testes durante a programao. Em geral, grande parte dos compiladores aceita dois tipos de comentrios, os de linha simples e os de mltiplas linhas. Os comentrios de linha simples sempre so iniciados com // (dupla barra), fazendo com que o compilador ignore tudo o que estiver na mesma linha depois da dupla barra. Por exemplo: // Este um comentrio de linha simples. 2 Denies Gerais em Linguagem C 5 Por sua vez, os comentrios de mltiplas linhas devem ser sempre iniciados com /* e terminados com */. Por exemplo: / * Este um comentrio de mltiplas linhas. * / 2.4 Representao Numrica Nessa subseo apresentaremos um resumo das representaes numricas para microcon- troladores PIC, baseados no compilador MikroC Pro. Os tipos numricos so os mesmos para todos os microcontroladores, porm a representao numrica pode variar entre os diversos compiladores existentes. Decimal: valor_decimal = 125; Binrio: PORTA = 0b11110001; Hexadecimal: valor_hexa = 0xFF; Octal: valor_octal = 075; Caractere: caracter = a; 2.5 Tipos de Dados Toda varivel usada em um programa deve ser declarada como de um determinado tipo, que dene seu tamanho (em nmero de bits) e suas caractersticas. As variveis podem ser: Tab. 2: Tipos de Dados Tipo Bytes Mnimo Mximo Representa void Zero Sem valor Sem valor Valores nulos char 1 -128 127 Caracteres int 2 -32768 32767 Inteiros oat 4 1, 5 10 45 3, 4 10 38 Valores com casas decimais (ponto utuante) double 8 4, 9 10 324 1, 8 10 308 Valores com casas decimais (ponto utuante) 2 Denies Gerais em Linguagem C 6 Alm disso, temos os seguintes modicadores de tipo: Tab. 3: Modicadores de Tipos de Dados Tipo Modicao signed Com sinal unsigned Sem sinal short Inteiro menor que o padro long Inteiro maior que o padro Portanto, temos os seguintes tipos de dados inteiros: Tab. 4: Tipos de Dados Inteiros Tipo Bytes Mnimo Mximo char 1 -128 127 signed char 1 -128 127 unsigned char 1 0 255 short int 2 -128 127 signed short int 2 -128 127 unsigned short int 2 0 255 int 2 -32768 32767 signed int 2 -32768 32767 unsigned int 2 0 65535 short 2 -32768 32767 signed short 2 -32768 32767 unsigned short 2 0 65535 long int 4 2 31 2 31 1 signed long int 4 2 31 2 31 1 unsigned long int 4 0 2 32 1 2.5.1 Constantes Servem para criar smbolos de valor constante que auxiliam na programao. No momento da compilao, o compilador se encarrega de atribuir os valores corretos aos smbolos criados. Por exemplo: const LIGADO = 1; const DESLIGADO = 0; const TMAX = 100; Aps denir as constantes, possvel utilizar estas palavras como tendo o mesmo sig- nicado do valor numrico atribudo. 2 Denies Gerais em Linguagem C 7 2.5.2 Denies Alm de dar nome a valores constantes, tambm podemos atribuir outros nomes a smbolos j existentes no microcontrolador. Por exemplo, imagine que voc tenha um LED ligado ao bit 0 da porta A do seu microcontrolador, alm de um motor DC ligado ao bit 1 dessa mesma porta. Para facilitar a programao, pode-se fazer: #define LED PORTA.B0 #define MOTOR PORTA.B1 Observe que na Linguagem C os comandos iniciados pelo caractere # so os nicos que no recebem ponto-e-vrgula no nal da sentena. Assim, os comandos de denio #dene e const servem para tornar o programa mais compreensvel. Alm disso, estes comandos so sempre eliminados pelo compilador, ou seja, no consomem memria extra do microcontrolador. Para visualizar sua utilizada, considere o cdigo abaixo utilizando denies 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 Variveis Uma varivel sempre deve ser declarada da seguinte forma: (<modificador>) <tipo de dado> <nome da varivel> (= <valor>); Note que a utilizao do modicador e da inicializao da varivel so opcionais. Exemplos: unsigned int valor = 123; char letra = a; int contador; As variveis podem ser do tipo locais ou globais, conforme veremos a seguir. 2 Denies Gerais em Linguagem C 8 2.6.1 Variveis Locais So variveis declaradas dentro de um bloco de instrues (ou funo) e s podem ser acessadas dentro desse bloco. Exemplo: int media() { int valor1 = 5; int valor2 = 7; return (valor1+valor2)/2; } Uma observao importante que todas as denies de variveis locais devem apare- cer logo no incio do bloco/funo. 2.6.2 Variveis Globais So declaradas fora dos blocos de funo e podem ser acessadas por todas as funes e blocos de instrues. Exemplo: int valor1 = 5; int valor2 = 7; int media() { return (valor1+valor2)/2; } int soma() { return valor1+valor2; } Mas ateno, apesar de parecer uma boa ideia declarar funes globais devemos ter bastante cuidado com sua utilizao. Uma vez que estas variveis podem ser acessadas por todas as funes, difcil manter o controle sobre seus valores medida que o cdigo vai sendo executado. Por essa razo, declarar variveis globais no considerada uma boa prtica de programao, devendo ser utilizadas apenas quando estritamente necessrias, e de forma bastante cuidadosa. 2.7 Funes Quando temos trechos de cdigos que so repetidos vrias vezes, podemos isolar estes tre- chos em funes. Assim, podemos chamar uma funo em diferentes pontos do programa principal, evitando reescrever aquele trecho de cdigo repetidamente. Uma funo deve ser declarada antes de ser chamada. Por isso importante escrever todas as novas funes antes da funo principal (main). Por exemplo: 2 Denies Gerais em Linguagem C 9 void piscaLED() // declara o incio da funo piscaLED { PORTA.B0 = 1; // liga o pino A0 delay_ms(1000); // aguarda 1000ms (1 segundo) PORTA.B0 = 0; // desliga o pino A0 delay_ms(1000); // aguarda 1 segundo } void main(void) // incio do programa principal { while(1) { piscaLED(); // chama a funo piscaLED } } O void, que traduzido para portugus quer dizer vazio, um tipo de dado utilizado em funes que no retornam nenhum parmetro. A funo main sempre do tipo void, pois no retorna nem recebe nanhum valor. Entretanto, as funes podem muitas vezes conter parmetros de entrada que carregam informaes para dentro do bloco da funo, alm de parmetros de sada, devolvendo informaes ao programa principal. Por exemplo: int media(int a, int b) / * declara o incio da funo media. Essa funo recebe dois valores do tipo int (a e b) * / { return (a + b)/2; // retorna um valor do tipo int } void main(void) // incio do programa principal { int valor1 = 10; int valor2 = 20; int result; result = media(valor1, valor2); / * A funo mdia retorna seu valor do tipo int na varivel result * / } 2.8 Header Em muitos compiladores, necessrio incluir um arquivo que contm todas as denies do microcontrolador sendo utilizado. Isto feito atravs do comando #include. Em geral, temos a seguinte sintaxe que deve ser includa logo no incio de qualquer programa: #include<microcontrolador.h> Alm deste arquivo com as denies do microcontrolador, podemos utiliza a instruo #include para incluir algum arquivo denominado cabealho, contendo funes auxiliares a serem utilizadas. Por exemplo: #include<nome_do_arquivo.h> 3 Operadores 10 3 Operadores A linguagem C possui operadores para atribuir, comparar ou modicar dados e variveis. Podemos dividir estes operadores em quatro categorias principais: Aritmticos: para clculos; Relacionais: para comparar valores numricos; Lgicos: para testar condies ou manipular bits; Booleanos: para realizar operaes lgicas com mais de um bit. 3.1 Operadores Aritmticos Em linguagem C temos os seguintes operadores aritmticos: Tab. 5: Operadores Aritmticos Smbolo Operao + Soma - Subtrao * Multiplicao / Diviso % Resto inteiro da diviso ++ Incremento em um Decremento em um Os operadores aritmticos sempre usam duas variveis e retornam um terceiro valor mantendo inalteradas as variveis originais. Exemplos: Soma: int y = 10; int z = 5; int x = 0; x = y + z; / * Soma o contedo da varivel y com a varivel z e armazena o resultado na varivel x * / Subtrao: int a = 10; int b = 5; int c = 0; c = b - a; / * Subtrai da varivel b o contedo da varivel a e armazena o resultado na varivel c * / 3 Operadores 11 Multiplicao: int a = 1; int b = 20; int c = 2; a = b * c; / * Multiplica o contedo da varivel b pelo da varivel c e armazena o resultado na varivel a * / Diviso: int a = 0; int b = 20; int c = 2; a = b/c; / * Divide o contedo da varivel b pelo da varivel c e armazena o resultado na varivel a * / Resto inteiro da diviso: int a = 1; int b = 25; int c = 2; a = b%c; / * Divide o contedo da varivel b pelo da varivel c e armazena o resto da diviso na varivel a * / Incremento em um: int contagem = 0; contagem++; // Incrementa a varivel contagem em um Decremento em um: int contagem = 0; contagem--; // Decrementa a varivel contagem em um 3.2 Operadores Relacionais Realizam operaes de comparao, retornando os valores FALSO (0) ou VERDADEIRO (1). Esses operadores no afetam o contedo das variveis sendo comparadas. 3 Operadores 12 Tab. 6: Operadores Relacionais Smbolo Descrio == 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 ligado if (cont < 9) cont++; / * Se contagem for maior que 9, incrementa * / else cont = 0; // Caso contrrio, zera } } 3.3 Operadores Booleanos So usados para realizar testes booleanos entre elementos em um teste condicional. Os operadores so: Tab. 7: Operadores Booleanos Smbolo Descrio && E (AND) | | OU (OR) ! NO (NOT) Exemplo 1: int A = 0; if ((A > 0) && (A < 10)) A++; Signicado: se A for maior do que zero E A for menor do que dez, ento incremente A em um. 3 Operadores 13 Exemplo 2: int A = 0; int B = 0; int C = 0; if ((A != B) || (A != C)) A--; Signicado: se A for diferente de B OU A for diferente de C, ento decremente A em um. 3.4 Operadores Lgicos So usados para realizar testes lgicos bit a bit. Os operadores lgicos so: Tab. 8: Operadores Lgicos Smbolo Descrio & E (AND) | OU (OR) OU Exclusivo (XOR) NO (NOT) Deslocamento para a direita Deslocamento para a esquerda Exemplo 1: int cont = 0; if (PORTA.B0 & PORTA.B1) cont++; Signicado: se PORTA.B0 for igual a um E PORTA.B1 for igual a um, ento cont incrementado em uma unidade. Exemplo 2: int cont = 0b00000001; if (PORTA.B0 | PORTA.B1) cont = cont<<1; Signicado: se PORTA.B0 for igual a um OU PORTA.B1 for igual a um, ento o valor de cont deslocado para a esquerda. Exemplo 3: int cont = 10; if (PORTA.B0 & ~PORTA.B1) cont--; Signicado: se PORTA.B0 for igual a um E PORTA.B1 no for igual a um, ento o valor de cont decrementado de uma unidade. 3 Operadores 14 3.5 Associao de Operadores Algumas abreviaes so comumente utilizadas com os operadores. Dentre elas podemos citar: Tab. 9: Abreviaes de Operadores Forma Expandida Forma Reduzida x = x + y x += y x = x - y x -= y x = x * y x *= y x = x / y x /= y x = x % y x %= y x = x & y x &= y x = x | y x |= y x = x y x = y x = x << y x <<= y x = x >> y x >>= y 4 Estruturas Condicionais 15 4 Estruturas Condicionais 4.1 A Estrutura if A estrutura if, que signica se em portugus, uma estrutura de deciso baseada no resultado de um teste lgico. Sua forma geral : if (condio) { comando 1; comando 2; ... comando n; } Se houver apenas uma instruo a ser executada aps o teste lgico, as chaves podem desprezadas: if (condio) comando; Em C, qualquer nmero diferente de zero considerado verdadeiro, o que signica que a condio if s ser falsa se o teste lgico aplicado resultar em zero (0). Qualquer outro valor, 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 a um, o contador ser incrementado * / } Entretanto, em geral utilizamos uma expresso lgica como condio de entrada para a estrutura if: void main() { int contagem = 0; if (PORTA.B0 == 0) contador++; / * Apenas se o valor da porta A0 for igual a zero, o contador ser incrementado * / } Uma observao importante quanto a diferena entre o operador de atribuio (=) e a operao booleana de igualdade (==). Para inicializar uma varivel utilizamos =, porm, para testar o valor de uma varivel utilizamos ==. Por exemplo: int a = 10; // Inicializamos a varivel a com o valor 10 if (a == 10) // Fazemos o teste booleano com a varivel a a++; 4 Estruturas Condicionais 16 4.2 A Estrutura if-else A estrutura if pode ser expandida com o uso de else (seno), que permite denir comandos a 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 j j++; else // Seno, decrementa j j--; Caso haja mais de um comando if na sequncia, o else estar sempre relacionado com o ltimo if. Por exemplo: int i = 10; int j = 5; if (i == 10) // Se i for igual a 10, incrementa j j++; else // Seno, decrementa j j--; 4.3 A Estrutura if-else if Este tipo de estrutura permite um nmero de alinhamentos de comandos, possibilitando colocar estruturas if dentro de outras estruturas if com maior facilidade. Seu formato geral : if (condio 1) { comandos; } else if (condio 2) { comandos; } else if (condio 3) { comandos; } A estrutura if-else if uma alternativa para tornar tomadas de decises mais rpidas em alguns casos, Isto ocorre porque, no momento em que alguma condio seja satisfeita, os demais blocos if subsequentes no sero sequer testados. 4 Estruturas Condicionais 17 4.4 A Estrutura switch A estrutura switch muito parecida com a estrutura if-else if. A diferena que switch no aceita expresses lgicas para tomar decises, mas somente constantes. O comando switch testa o valor de uma varivel e executa os comandos correspondentes a casos (cases) pr- estabelecidos. Cada case dene uma srie de comandos que sero executados at chegar na instruo break. Quando nenhum caso correspondente for encontrado, a clusula default ser executada. Porm, o uso da clusula default opcional. Formato da estrutura switch: switch(varivel) { 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 varivel 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; 5 Estruturas de Repetio 18 5 Estruturas de Repetio 5.1 O Lao for O lao for utilizado quando precisamos de uma ciclo controlado de repeties. Em sua inicializao denimos uma varivel de controle, a qual damos um valor inicial, uma con- dio de parada, e uma regra de incremento (ou decremento). Antes de serem executados os comandos do lao for, avalia-se a condio de teste. Caso esta condio seja verdadeira, os comandos so executados. A cada ciclo de execuo (iterao), a varivel de controle incrementada ou decrementada de acordo com uma regra. A estrutura geral do lao for : for(inicializao; condio; incremento) { comandos; } Vejamos um exemplo de uso: for(i = 0; i < 10; i++) { PORTA.B0 = 1; // liga o pino A0 delay_ms(1000); // aguarda 1 segundo PORTA.B0 = 0; // desliga o pino A0 delay_ms(1000); // aguarda 1 segundo } Neste exemplo, a varivel i inicialmente carregada com o valor 0 (i = 0). Como a condio inicial verdadeira (i < 10), os comandos do lao so executados. Aps a execuo dos comandos do lao, a varivel i incrementada em uma unidade, dada pela condio de incremento i++, e novamente os comandos do lao so executados. Isto feito at que a condio se torne falsa, isto , quando i for igual a 10. Ainda possvel utilizar o lao for em passos decrescentes. O mesmo cdigo acima pode ser escrito de maneira equivalente como: for(i = 10; i > 0; i--) { PORTA.B0 = 1; // liga o pino A0 delay_ms(1000); // aguarda 1 segundo PORTA.B0 = 0; // desliga o pino A0 delay_ms(1000); // aguarda 1 segundo } 5.1.1 O Comando break o comando break utilizado para encerrar o lao for antes de se completar todas as itera- es. Quando o lao quebrado, o programa pula para a prxima instruo aps o lao. Exemplo: void main() { int i = 0; 5 Estruturas de Repetio 19 for(i = 0; i < 10; i++) { if (PORTB.B0 == 1) break; PORTA.B0 = 1; // liga o pino A0 delay_ms(1000); // aguarda 1 segundo PORTA.B0 = 0; // desliga o pino A0 delay_ms(1000); // aguarda 1 segundo } } Neste exemplo, o pino A0 car piscando desde que o pino B0 seja diferente de 1. Quando isto acontecer (quando B0 for ligado), o comando break ser executado e o lao ser encerrado. 5.2 O Lao while O lao while tem a seguinte estrutura: while(condio) { comandos; } Dessa forma, o lao inicialmente verica uma condio lgica. Se esta condio for verdadeira, os comandos dentro do lao sero executados, caso contrrio, o programa salta para a linha de comando imediatamente aps o m do lao. A condio pode ser uma operao 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 Repetio Innita Microcontroladores em geral so programados para executar uma tarefa indenidamente. Dessa forma, o uso de laos innitos bastante comum. Uma maneira de criar um lao innito fornecer uma condio sempre verdadeira ao while. Assim, uma estrutura tpica de um programa em C para microcontroladores a seguinte: void main() { // inicializaes de hardware e software while(1) // loop infinito { / * tarefas a serem executadas pelo microcontrolador durante o funcionamento * / } } onde a condio em while(1) sempre verdadeira (sempre igual a 1). 5 Estruturas de Repetio 20 5.3 O Lao do-while O lao do-while nada mais do que uma variao do lao while. Sua estrutura geral : do { comandos; } while(condio); A diferena aqui que os comandos so executados antes de se realizar o teste lgico de condio. Caso o teste executado ao nal seja verdadeiro, o lao executado novamente do incio. Caso contrrio, o programa segue com a instruo imediatamente aps o lao. 6 Comentrios Finais 21 6 Comentrios Finais Todo o material apresentado neste resumo material de livre acesso, baseado nas notas de aula disponveis em http://paginapessoal.utfpr.edu.br/gbrante, bem como no livro Progra- mao Linguagem C para Microcontroladores 8051, da iniciativa u8051, disponvel em http://www.u8051.com.br/.