Você está na página 1de 18

captulo ..

tU O 7

Declaraes de Controle

As declaraes ou comandos de controle so uma parte muito importante


de uma linguagem de programao, e a linguagem C dispe de um excelente
conjunto de comandos.
Podemos classificar as declaraes de controle em duas categorias bsicas:

Declaraes de teste condicional: so utilizadas para testar determi-


nadas condies / variveis e executar um cdigo para cada caso. A
linguagem C dispe de dois tipos de declaraes condicionais: o co-
mando lf e o comando swltch;
Declaraes de estrutura de repetio: so utilizadas para provocar a
execuo de um bloco de comandos enquanto uma determinada con-
dio for verdadeira. Em C dispomos de trs declaraes de repeti-
o: for, whlle e do-whlle.

Alm destas declaraes de controle, a linguagem e apresenta ainda a


declarao goto, utilizada para provocar o desvio incondicional do programa.

7.1. Comando lf
O comando lf j foi visto anteriormente neste livro, portanto agora vamos
anal isar em maior profundidade o seu funcionamento.
De maneira geral, o comando lf (ou "se" em portugus) utilizado para
executar um comando ou bloco de. comandos no caso de uma determinada
condio ser avaliada como verdadeira. Opcionalmente, tambm possvel
executar outro comando ou bloco de comandos no caso da condio ser ava-
liada como falsa.
A forma geral do comando lf :

if (condio) comandoA; { else comandoB;}

--~~~~~~~~~~-_clara~_e_s_de~Co_n_trrn_e~~~~~~~~~~~
(

Nesta forma ele pode ser um comando ou declarao qualquer da linguT
gem C, ou um bloco de comandos na seguinte forma :

if (condio)
{
comandoAl; li bloco de comandos para a condiao verdadeira
comandoA2;
.. '
} else
{
comandoBl ; li bloco de comandos para a condio falso
comandoB2 ;
. ..
}

Observe que, em ambos os caso, a clusula else opcional , no sendo


obrigatria para o funcionamento do comando.
O princpio de funcionamento do comando muito simples: se a condio
for verdadeira, ser executado apenas o comandoA (ou o bloco de comandos
A). Caso a condio seja avaliada como falsa, ento ser executado apenas o
comandoB (ou o bloco de comandos 8). Um detalhe muito importante a ser
observado que nunca, no mesmo teste, os dois comandos ou blocos de co-
mando sero executados, apenas um ou outro.

Exemplo 7.1

char letra ;
int X;
letra = A ;
...
if (letra =='A') x=O; li caso a varivel letra seja igual 'A ' , ento x=O;
if (letra==' B') x=S; li caso a varivel letra seja igual ' B ' , entao x=S;
.. .

Um aspecto muito importante da linguagem C e que muitas vezes provoca


confuses ao programador iniciante que a condio a ser testada no preci-
sa necessariamente envolver operadores relacionais ou lgicos. De fato , so-
mente necessrio que a expresso possa ser avaliada como verdadeira ou
falsa. Assim, possvel escrever o seguinte programa em C:

Exemplo 7.2

int x, y;
X = 5;
if (X) y = X;

. ~~~~~~~~~-M-~_roco~n-trol~ado~res~P_lc_._P_ro_g_ram~a__o_am~C~~~~~~----~
Veja que a condio a ser testada simplesmente o valor da varivel "x".
Se a condio for verdadeira, ou seja, se "x" for diferente de zero, ento a
atribuio "y = x" ser executada. Caso "x" seja avaliada como falsa, ou seja,
caso "x" seja igual a zero, ento a atribuio no ser executada.
possvel ainda encadear, ou aninhar, diversos comandos lf um dentro
do outro. Veja a forma geral em seguida:

if (condiaol) comandoA;
else if (condiao2 1 comandoB;
else if (condi!o3l comandoC;

Neste caso, ser primeiramente avaliada a expresso "condio1", se


verdadeira, ser executado o "comandoA", caso falsa, ser avaliada a "condi-
o2", caso seja verdadeira, ser executado o "comandoB" , caso seja falsa,
ser avaliada a "condio3" e se esta for verdadeira, ser executado o "co-
mandoC".
No exemplo seguinte, o programa faz uma leitura da porta A do microcon-
trolador e em seguida, utilizando uma estrutura de declarao if/ else , testa
sucessivamente o valor da varivel "x" (lida da porta A), at encontrar um valor
igual ao da varivel, executando o comando output_hlgh correspondente que
far setar um determinado pino da porta 8 do microcontrolador.

Exemplo 7.3
#include <pl6f877.h>
tuse delay(clock=4000000)
ifuses INTRC , NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP

int X;

mai n( )
{
while (true)
{
x = input_ a( ) ;
output_por t _b(O);
if (!x) output _high(pin_bO); else
if l x==l) output_high(pin_bl); else
if (x==2) output_high(pin_b2); else
if (x==3) output_high(pin_b3); else
ouput_high(pin_b4);
}
}

Suponha que apenas o pino RA1 esteja em nvel lgico 1 e os outros pi-
nos da porta A estejam em nvel lgico O.

~~~~~~~~~~~~De_ci_a_ra__e_s_de~Co_n_tro_l_e~~~~~~~~~~~-
(
A execuo deste programa far com que seja atribudo o valor decimal 2
(lido da porta A) varivel "x". Em seguida, o primeiro comando if verifica se o
valor da expresso (!x) verdadeiro. Como "x" igual a 2, ento a expresso
ser avaliada como falsa e a prxima declarao if ser avaliada. Novamente,
o resultado da avaliao ser falso, j que "x" diferente de 1, fazendo com
que a prxima declarao lf seja analisada. Agora, como "x" igual a 2, a ava-
liao da expresso ser verdadeira e o comando output_high(pin_b2} ser
executado, fazendo com que o pino RB2 seja setada. Os outros pinos da porta
B permanecero em nvel O. Observe que o prximo lf no avaliado.

7 .2. Comando Switch


Em alguns casos , como na comparao de uma determinada varivel a
diversos valores diferentes, o comando lf pode tornar-se um pouco confuso ou
pouco eficiente.
A declarao swltch permite a realizao de comparaes sucessivas
como a anterior, de uma forma muito mais elegante, clara e eficiente. Vej amos
ento o formato geral da declarao swltch:

switch (varivel)
{
case constante!:
comandoA;

break;
case constante2:
comandoB;

bre ak ;


default :
comandoZ;
. ..
}

Observe que o valor da varivel testado contra as constantes especifi-


cadas pela clusula case. Caso a varivel e a constante possuam o mesmo
valor, ento os comandos seguintes quela clusula case sero executados.
Caso o valor da yarivel no encontre correspondentes nas constantes especi-
ficadas pelas case, ento os comandos especificados pela clusula default
so executados.
Repare que cada seqncia de comandos da clusula case encerrada
por uma clusula break. Caso esta clusula seja omitida, ento todos os co-
mandos subseqentes ao case especificado sero executados, at que seja
encontrada uma outra clusula break, ou seja, atingido o final do bloco
switch.

Microcontroladores PIC - Programao em C


A explicao para este comportamento simples: uma seqncia de co-
mandos aps uma clusula case no um bloco de comandos e sendo as-
sim, deve haver uma forma de especificar o trmino dessa seqncia, o que
'7eito pela clusula break.

Uma alternativa ao cdigo anterior utilizando o comando swltch pode ser:

Exemplo 7.4
l i Es t e exemplo utiliza o c ircuito da figura 1 . 3
linclude <16f877.h>
tuse delay ( clock=4 00000r0)
#fuses HS,NOWDT, PUT,NOBROWNOUT,NOLVP

main ()
(
set up_adc_ports (no_analogs );
whil e(true)
(
output_port.J>(O) ;
swtch (input_a( ) )
{
O output_n~gh (piP..J, O) ;
break;
1 : output_high (pin_bl) ;
break ;
2 : output_bigh (pin_b2 );
break;
3 : output:_high (pin_b3) ;
b reak;
default :
output_hi gh(pin_b4);
}
}
}

No programa anterior, o valor lido da funo lnput_a() , que efetua a leitu-


ra da porta A do microcontrolador, ser comparado s constantes O, 1, 2 e 3.
Caso o valor corresponda a uma das constantes, a respectiva clusula case
ser executada. Caso o valor lido no encontre correspondentes, ser execu-
tada a clusula default.
Algumas caractersticas importantes da declarao swltch:
A declarao swltc!h somente pode testar igualdades. No so admi-
tidos outros operadores relacionais ou lgicos como em if;
Somente dados ordinais podem ser utlizados como constantes, ou
1

seja, nmeros inteiros de 1, 8, 16 ou 32 bits, ou ainda constantes de


caractere;
No permitido que, dentro do mesmo swltch, duas cases tenham
constantes iguais;
As clusulas break e default so opcionais, havendo situaes e
que a no-utlizao da clusula break permite a construo de est
turas swttch ainda mais eficientes, como veremos em seguida.

7 .2.1. Clusula Break


Como j dito anteriormente, a clusula break possui a funo de encerrar
uma seqncia de comandos de uma clusula case.
No entanto, podemos deliberadamente omitir a clusula break para fazer
com que uma mesma seqncia de comandos seja executada para vrias
case.

No fragmento de programa seguinte, caso a varivel "x" possua um valor


entre O e 3, ser executado o primeiro bloco de comandos, caso possua o
valor 4, ser executado o segundo bloco de comandos e caso seja outro valor.
ser executado o ltimo bloco de comandos:

Exemplo 7.5

switch (x)
(
case O:
case 1 :
case 2 :
case 3:
li caso o valor de x esteja entre O e 3. executa os comandos daqui
li at o prx imo br eak
.. .
break; // encerra os comandos de todas as case acima
case 4:
li caso o valor seja igual a 4, executa os comandos daqui a t o
li prximo break
bre ak;
default:
li caso seja diferente de 0,1, 2,3 ou 4, executa estes comandos
. ..
}

a que percebemos o motivo de no definir um bloco de comandos (na


forma tradicional utilizando { e }) para cada clusula case, pois se para cada
case fosse definido um bloco de comandos, ento no seria possvel escrever
a clusula case 1 anterior, pois no poderamos iniciar um bloco de cdigo e
no fech-lo antes de outro bloco.
Repare que normalmente no se utiliza uma clusula break aps a clu
sula default, j que normalmente default a ltima clusula de um comando
swltch.

Microcontroladoras PIC Programao em C


7 .3. Estruturas de Repetio
Como j foi dito no incio deste captulo, as estruturas de repetio, ou
iaos de repetio, como so tambm chamadas, so estruturas especiais de
comandos, construdas de forma a executar repetidamente um determinado
comando ou bloco de comandos. Na verdade, como veremos mais adiante,
..ma estrutura no precisa executar virtualmente nenhum comando.
Existem trs estruturas de repetio na linguagem C: "Para", "Enquanto"
e faa - enquanto ".
A primeira estrutura baseada no comando for (" Para") e basicamente
~1ilizada para laos finitos de contagem, normalmente utilizando uma varivel
ce controle da contagem.
A estrutura baseada no comando whlle ("Enquanto ") utilizada para repe-
tlo de um determinado conjunto de instrues enquanto uma condio for
.erdadeira.
Finalmente, a estrutura baseada no comando do-whlle (" Faa - enquanto")
muito similar estrutura whlle, com a diferena de que aqui a condio
analisada no final do bloco de comandos.

Vejamos ento cada estrutura mais detalhadamente.

7 .3.1. Lao For


O lao for uma das mais comuns estruturas de repetio, sendo a ver-
so C considerada uma das mais poderosas e flexveis dentre todas as lin-
guagens de programao.
O formato geral do lao for :

for ( inicia li zaao ; condiao ; i ncremento ) comando;

ou,

for ( inicia lizao ; condiao ; increment o l


{
//bloco de c CJPLWndos1
c omando11
CQIN!ndo21

}

Cada uma das trs sees do comando for possui uma funo distinta,
conforme em seguida:
Inicializao: esta seo conter uma expresso vlida utilizada nor-
malmente para inicializao da varivel de controle do lao for.
Condio: esta seo pode conter a condio a ser avaliada para de-
cidir pela continuidade ou no do lao de repetio. Enquanto a condi-
o for avaliada como verdadeira, o lao for permanecer em execu-
o.
Incremento: esta seo pode conter uma ou mais declaraes para
incremento da varivel de controle do lao.

O funcionamento bsico do comando o seguinte: primeiramente a seo


de inicializao do comando executada, em seguida, a condio de teste
avaliada e caso seja verdadeira, executado o comando ou bloco de coman-
dos, em seguida a seo de incremento executada e o lao repetido (vol-
tando a avaliar a condio de teste).
O comando for pode ser utilizado para repetir um comando ou bloco de
comandos, no entanto tambm possvel no executar nenhum comando e
neste caso, o comando for possui apenas a funo de retardar a execuo do
programa por um perodo de tempo.
Vejamos alguns exemplos de utilizao do comando for:
O programa seguinte envia serialmente uma seqncia de nmeros de O
at 10:

Exemplo 7.6
#inc l ude <16F 628.h>
iuse delay (clock=4000000)
#fuses I NTRC_IO,NOWDT ,PU'l'.NOBRO~'NOUT, NOMCLR,NOLVP
~use rs232(baud=19200,parity=N,xmit=PIN_B2,rcv=PIN_Bl )

rnain ()
(
i nt conta;
for (conta=O ; conta<=lO ; conta++) print f (\u\r\n, conta);
J

7 .3.1.1. Outras Formas do Lao For


Como j dissemos no incio do tpico anterior, o lao for possui uma
grande flexibilidade na sua forma de construo e uso.
Esta flexibilidade devido ao fato de que permitida a utilizao de qual
quer expresso vlda em C, mesmo no sendo relacionada com o lao de
repetio em si, em quaisquer das sees do comando.

Microcontroladores PIC Programao em C


De fato, podemos criar laos muito interessantes e pouco usuais pela
manipulao correta dos argumentos do comando for.
A primeira aplicao na criao de laos de atraso (delays). Veja o se-
guinte fragmento de programa :

for (atraso=01 atraso<lOO; atraso++);

Este lao for no possui nenhum comando associado a ele, o que implica
simplesmente que sero executadas 100 iteraes do lao antes de o pro-
grama continuar a execuo normalmente. Esta uma forma muito eficiente
de criar uma pequena rotina de atraso de tempo.
possvel tambm executar contagens regressivas com o comando for. O
programa seguinte imprime na sada serial os nmeros de 10 a O em ordem
decrescente:

Exemplo 7.7
#include <16F628.h>
#use delay (clock=4000000J
#fuses INTRC_IO,NOWDT ,PUT,NOBROWNOUT,NOMCLR ,NOLVP
#use rs232( baud= 19200,parity=N,xmit=PIN_B2,rcv=PIN_Bl)

main ()
{
i nt conta;
for (conta=lO; conta>=O; conta-- ) printf ( '%u\r\n', cont a);
}

Outra caracterstica interessante do comando for ser possvel utilizar


mais de uma varivel para o controle do funcionamento do lao. No exemplo
seguinte, demonstramos o uso de mltiplas variveis de controle num mesmo
lao:

Exemplo 7.8

#include <16F628.h>
#use delay(clock=4000000 )
#fuses HS,NOWDT ,PUT,NOBROWNOUT,NOMCLR,NOLVP
#use rs232(baud=19200,parity=N,Xlllit=PIN_B2,rcv=PIN_Bl )

mai n ()
{
int x,y;
for (x =O, y=lO ; x<=l O ; x++, y-- ) printf('%u , %u\r\n,x,y);
}
O PIC programado com o cdigo ant erior imprime serialmente esta se-
qncia:

o 10
1 9
2 8
3 7
4 6
5 , 5
6 4
7 3
8 2
9 1
10 ' , o

Observe que no exemplo anterior existem duas variveis (apesar de so-


mente uma ser testada na condio), sendo uma incrementada e outra de-
crementada a cada ciclo do lao.
Uma outra caracterstica do comando for ser possvel ut ilizar uma con-
dio de teste no relacionada varivel de controle do lao. No programa
seguinte, construmos um lao de contagem que realiza uma contagem de O a
1000, mas caso o pino RB3 esteja em nvel lgico O, o lao terminar imedia--
tamente e ser impresso o valor final da contagem do lao:

Exemplo 7.9
#include <16F628 . h>
#use delay(clock=4000000)
lfus es HS , NOWDT , PUT,NOBROWNOUT,NOMCLR,NOLVP
#use rs232 ( baud19200,parityaN,xmi~ePIN_B2,rcvPIN_Bl)

main ( l
{
long nt x ;
for (x=O; (x <=lOOO) && input(pin_b3) ; x++);
pr1ntf(" t lu\r\n",x);
)

Este lao for no executa qualquer comando, mas permanece em conta-


gem enquanto a varivel "x" for menor ou igual a 1000 e o pino RB3 estiver
em nvel lgico 1.
'
E tambm possvel criar um lao infinito, ou seja, um lao que ser repe-
tido indefinidamente. Veja o comando seguinte:

for (; ; ) ;

Alguns detalhes importantes sobre o comando for:


Cada uma das sees de argumentos do comando for admite qual-
quer tipo de declarao vlida da linguagem e;

. ~~~~~~~~~-M_lcro_c_o_n1_ro_a_d~_e_s_P_1c_-_P_ro_g_ram~a~_-_o_em~c~~~~~~~~
\
A seo de teste sempre avaliada no incio de cada ciclo do lao;
Se a seo de teste for inicialmente falsa, nenhuma iterao do lao
executada;
A seo de incremento sempre executada ao final de cada ciclo do
lao.

7 .3.1.2. A Clusula Break no Comando For


t: possvel tambm utilizar a clusula break dentro de um lao for.
Nesse caso, break far com que o lao seja prematuramente encerrado,
independentemente de a condio de repetio do lao ser avaliada.
O mesmo programa do exemplo 7.9 pode ser escrito da seguinte forma
utilizando a clusula break:

Exemplo 7 .10

#include <1 6F628 . h>


#use delay (clock ;l2000000)
lfuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP
t use rs232(baud=19 200 ,parityN,xmit=PIN_B2,rcv=PIN_Bl )

main ()
(
long i nt: x;
f o r (x=O ; (x<=lOOO); x++ ) if (!input(pin_b3)) break;
printf( %lu\r\n ,x) ;
}

7 .3.1.3. A Clusula Continue no Comando For


Outra clusula adicional que pode ser utilzada dentro de um lao for a
continue.
A sua finalidade forar o trmino do ciclo atual do lao, fazendo com
que ocorra um novo ciclo.
O exemplo seguinte demonstra a utilizao da clusula continue. O cdi-
go seguinte Imprime pela sada serial os nmeros entre O e 1000 que tenham
o bit 4 igual a 1:

Exemplo 7 .11

l include <16F628.h>
l use delay(clock=4000000)
lfuses HS,NOWDT,PUT.NOBROWNOUT,NOMCLR.NOLVP
mai n()
{
l ong int x;
for (x=O; (X <lOOO); x++ )
{
if l!hit_tes t(x , 4)) continue;
printf(%lu \ r\n ,x);
}
}

Observe que a clusula continue no termina o lao como acontece co


break. Ela apenas encerra o ciclo atual do lao.

7 .3.2. Lao While


Outro tipo de lao disponvel na linguagem o comando whlle , j menci
nado anteriormente neste livro e que possui a seguinte forma geral:

while (condio) com.ando1

ou ainda:
while (condio)
{
comandol;
comando2;

)

Como j foi visto, a filosofia de funcionamento do comando while : p


meiramente a condio avaliada, caso seja verdadeira, ento o comando ou
o bloco de comandos associado executado e a condio novamente ava-
liada, reiniciando o lao. Caso o condio seja falsa, o comando ou bloco de
comandos no executado e o programa tem seqncia a partir da declarao
seguinte ao bloco whlle.
Tal qual o comando for, a condio testada pelo whlle pode ser qualquer
expressao da linguagem C que possa ser avaliada como verdadeira ou falsa.
Em seguida demonstramos como construir um lao de contagem simples
utilizando o comando while :

i nt X;
while (x<=lOl x++;

Assim como no comando for, no preciso associar nenhum comando ao


whlle. No exemplo seguinte, o programa permanece aguardando que o pino
RB3 esteja em nvel lgico 1, antes de prosseguir a execuo:

Microcontroladores PIC Programao em C


Exemplo 7.12
#include <16F628.h>
tuse delay(clock=4000000)
tfuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP
#use rs232(baud=l9200,parity=N,xmit=PIN_a2,rcv=PIN_Bl)

rnain()
{
while ( !input(pin_b3)};
printf( ' O pino RB3 esta em nvel 1\r\n " );
}

Algumas caractersticas do comando whlle:


A condio de teste avaliada sempre no infcio de cada iteraoo do
lao;
O comando ou bloco de comando, caso exista, ser executado so-
mente se a condio for verdadeira.

7 .3.2.1. Break e Continue no Comando White


Tambm possivel utilizar as clusulas break e cQntinue com o comando
whlle. Elas possuem a mesma funo j explicada anteriormente.
Vejamos um exemplo do funcionamento de break e continue com o co-
mando whlle:

Exemplo 7.13
tinclude <16F628 . h>
#use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP
#use rs232(baud=l9200,parity=N,xmitPIN_B2,rcv=PIN_Bl)

~in()
(
port_b_pull-ups (true); l i habilita pull - ups internos
int x=D ;- II declara a varivel x corno inteira de 8
l i de 8 bits e a inicializa em O
while (x<30) l i enquanto x for menor que 30
{
l i se o pino RB3 for igual a O sai do lao
i f ( ! input (pin_b3) ) break;
x++; l i incrementa x
if (!(x\2)) continue; l i se o resto da diviso inteira de x pr
l i 2 for o ente.o termina o ciclo atual
printf("\u\r\n ,x); l i imprime o valor da varivel x
}
}
O exemplo 7 .13 far a contagem de O a 30 e imprimindo somente os v~
lores de "x" Que forem mpares. Alm disso, caso o nvel lgico do pino R83
seja igual a O, o lao terminar prematuramente.

7 .3.3. Lao Do-While


O ltimo t ipo de estrutura de repetiao disponvel na linguagem e o co-
mando do (em portugus "faa").
O comando do utilizado juntamente com o comando whlle para criar
uma estrutura de repetio com funcionamento ligeiramente diferente do while
e for tradicionais.
De fato, a diferena entre a estrutura whlle tradicional e a estrutura
do-whlle que esta ltima realiza a avaliao da condio de teste no final de
cada ciclo de iterao do lao de repetio, ao contrrio do que j estudamos
sobre o whlle, o qual realiza o teste no incio de cada ciclo.
A forma geral da estrutura do-whlle :

do comando while (condiao);

ou,

do
(
comando.1\;
comandoB;

> while (condicaol;

O funcionamento da estrutura do-while o segu inte: o comando ou bloco


de comandos executado e ento avaliada a condio de teste, caso ela
seja verdadeira, iniciada uma nova iterao do ciclo; caso seja falsa, o lao
terminado.
Em seguida temos um exemplo de funcionamento do lao do-while:

Exemplo 7 .14
#ioclude <16F628.h>
#use delay(clock=4000000)
#fuses HS,NOWDT, PUT,NOBROWNOUT,NOMCLR,NOLVP
tuse rs232(~ud=l9200,paricy=N,xmit=PIN_B2,rcv=PIN_Bl)

main ()
{
port_b_pull-ups (true); l i habilita pull-ups internos
int x:O; li declara e inicializa x
do

Microcontroladores PIC Programao em C


{
x++; 11 incrementa x
printf ( w \ r\n ,x); l i imprime o valor de x
} while (input(pi.n.J>3) ); l i enquanto o pino RB3 1
}

Este programa ir incrementar e imprimir o valor da varivel "x" enquanto


o estado lgico do pino RB3 for igual a 1.
Algumas caractersticas Importantes do comando do-whlle:
A condio de teste ser avalada sempre ao trmino de cada ciclo de
repetio;
Caso a condio seja inicialmente falsa, o comando , ou bloco de co-
mandos, caso exista, ser executado uma vez.

7 .3.3.1. Break e Continue no Comando Do-Whlle


Como os outros laos vistos neste captulo, tambm o do-whlle aceita a
utilizao das clusulas break e continue.
Veja uma modificao do exemplo 7.15 para encerrar prematuramente o
lao no caso de atingido o valor 100:

Exemplo 7 .:16
f i nclude <16F628.h>
tuse delay(clock=4000000)
tfuses HS,NOWDr,PUT,NOBROWNOl11',NOMCLR,NOLVP

#use rs232(baud=19200,parityN,x:mit=PIN_B2.rcv=PIN_Bl)

rnain ( l
e
int xO; l i declara e inicializa x
do
{
x++; li incrementa x
printf{ "'5u\r\n" , x); l i irrprime o valor de x
i f (x>=lOO I break; l i se x maior ou igual a 100 sai do lao
} while (input(pin_b3)) 1 li enquanto o pino RB3 1
l

7 .4. Comando Goto


A linguagem C dispe ainda de outro comando de desvio incondicional do
programa: goto (em portugus "v para").

~~~~~~~~~~~-Oec~l_ara__e_s_d_e_Co_n_lrol~e~~~~~~~~~~~
(

De fato, o desvio incondicional um tanto incomum em uma linguagem
de programao estruturada, mas existem algumas poucas situaes em que
o uso de goto pode acarretar um aumento na eficincia e velocidade do pro-
grama.

O funcionamento do comando goto basicamente idntico instruo


assembly goto disponvel no conjunto de instrues dos PICs:

go t o local;

Em que l o c al um rtulo para uma determinada posio no programa.

Com o uso do goto, possvel escrever estruturas de repetio ao estilo


da linguagem BASIC e Assembly:

Exemplo 7 .16

int conta = O; li declara e i nicializa a varivel cont a


loop : li define o rtulo loop
conta +-.+ ; li i nc r ementa conta
if (conta<=lO) goto l oop; li s e cont a menor ou igual a 10 vai para
li loop

Uma possvel aplicao para o comando goto pode ser a sada imediata
de uma estrutura profundamente aninhada.

7 .5. Exerccios
1) No fragmento de programa seguinte, a condio analisada pelo comando
if verdadeira ou falsa?

i n t X = O, y = 10;
if (x = l) y = O; e lse y = 5 ;

2) O programa seguinte aguarda o pressionamento de uma tecla e toma al-


gumas decises em relao ela. Qual a tecla em questo?

#include <16F628.h>
tuse del ay (clock=4000000l
#fuse s HS,NOWDT, PUT,NOBROWNOOT,NOMCLR,NOLVP
tuse rs2321baud=l9200 , paritycN,xmit=PIN_B2,rcv=PIN_Bll
main()
(
char x;
boole an y = O;
while (true)
{

Microcontroladores PIC Programao em C


x = getc(); //efetua a leitura de uma tecla
if (x == 77)
(
y = !y;
if (y) printf(Liga\r\n); e lse printf (De sliga\r\n );
} else
(
y = O;
printf ( OQsiiga\r \ n);
}
}
}

3) O programa seguinte permite visualizar alguns registradores internos do


PIC por meio da linha serial. Qual(quais) tecla(s) devemos pressionar para
visualizar o registrador TRISB?

linclude <16P628 . h>


luse delay(clock=4000000)
lfuse s HS,NOWDT,PUT,NOBROWNOlJT,NOHCLR,NOLVP
luse rs232(baud=l9200,parity=N,xmit=PI N_B2,rcv=PI N_Bll
lbyte f sr = Ox04
#byte indf = O
rnain (}
{
int xzO;
while (true)
(
swi tch (getc ( l)
{
case 'p': switch (getc ())
{
case 'a' : X = 5;
break;
case b' . X = 6;
)
break;
case 1 t ' : switch (getc ())
(
case 'a' .. x = Ox85;
break;
case b . . X = Ox86;
l
break;
default . X = 3;
}
if (X)
(
fsr = x ;
printf ("%x .. %x\r \n ' , x ,indf);
}
}
}
4) O programa seguinte imprime alguns valores na tela. Pressionando a teci
5, quais so os valores impressos?
tinclude <16F628 .h>
luse delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP
tuse rs232(baud .. 19200,parity=N,xmit=PIN_ B2,rcv=PIN_Bl )
main()
{
int x,y;
while ( {y = (getc ( )-48)) > 0)
for (x =O; x<=lO; ++x) printf ( %u x %u - \u\r\n,y,x,xy);
pr intf ( Fim\r\n ) ;
)

Você também pode gostar