Escolar Documentos
Profissional Documentos
Cultura Documentos
tU O 7
Declaraes de Controle
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 :
--~~~~~~~~~~-_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 ;
. ..
}
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;
.. .
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;
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.
switch (varivel)
{
case constante!:
comandoA;
break;
case constante2:
comandoB;
bre ak ;
default :
comandoZ;
. ..
}
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);
}
}
}
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
. ..
}
ou,
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.
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
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);
}
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
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);
)
for (; ; ) ;
. ~~~~~~~~~-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.
Exemplo 7 .10
main ()
(
long i nt: x;
f o r (x=O ; (x<=lOOO); x++ ) if (!input(pin_b3)) break;
printf( %lu\r\n ,x) ;
}
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);
}
}
ou ainda:
while (condio)
{
comandol;
comando2;
)
i nt X;
while (x<=lOl x++;
rnain()
{
while ( !input(pin_b3)};
printf( ' O pino RB3 esta em nvel 1\r\n " );
}
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.
ou,
do
(
comando.1\;
comandoB;
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
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
~~~~~~~~~~~-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.
go t o local;
Exemplo 7 .16
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 ;
#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)
{