PROGRAMAÇÃO EM LINGUAGEM C
Prof. Stefano
1
Prof. Stefano
•
•
•
•
•
•
Histórico
Estrutura de um programa
Constantes e variáveis
Operadores
Declarações de Controle
Exercícios
2
Histórico
• A primeira linguagem de programação de alto nível
com real aceitação foi FORTRAN, na década de 50,
para análise e resolução de problemas matemáticos;
• Em 1959 surgiu o COBOL, voltada para aplicações
comerciais;
• A linguagem C foi desenvolvida em 1972, por Dennis
Ritchie, para utilização com o sistema operacional
UNIX;
3
Estrutura de um programa
• Estrutura básica de um programa em C:
void main()
{
}
4
Estrutura de um programa
No ambiente do MikroC digite o programa abaixo
void main() {
TRISB = 0x00;
do {
PORTB = 0;
Delay_ms(500);
PORTB= 255;
Delay_ms(500);
} while(1);
}
5
Estrutura de um programa
Identificando os elementos do programa
void main() {
TRISB = 0x00;
do {
PORTB = 0;
Delay_ms(500);
PORTB= 255;
Delay_ms(500);
} while(1);
}
Início do programa
Configura as portas
Laço do ....while(condição)
Escreve 0 nas portas
Espera 500 ms
Escreve 25510 nas portas
Espera 500 ms
6
Estrutura de um programa em C
• Exercício: Altere o programa para que os leds pares e
ímpares pisquem alternadamente;
7
Constantes e variáveis
• Identificadores: São nomes arbitrários dados as
funções, variáveis, constantes. Os identificadores
podem ser1 letras de A à Z, números de 0 à 9 e
“_“(underline). Não pode começar com número.
– Exemplos:
•
•
•
•
Temperatura_media
Temp
_T1
Contador
1 – Depende de cada compilador
8
Constantes e variáveis
• Constantes: são elementos que tem um valor fixo,
não podendo ser mudados durante a execução do
programa;
– Exemplo: π = 3,1415927.... Em vez de escrever toda vez o
número podemos nomear uma constante PI = 3,1415927 e
durante programa utilizar PI;
• Variáveis: são elementos que permitem a alteração
do seu valor durante a execução do programa. É
recomendável que no início do programa seja
atribuído um valor inicial a elas, que elas sejam
inicializadas;
– Exemplo: Calcule consumo médio de combustível de um
automóvel. CONSUMO= KM/L
9
Tipos de variáveis
Em linguagem C as variáveis podem assumir diferentes
tipos, de acordo com a sua utilização:
Tipo
Bits
Faixa
unsigned char
8
0 até 255
signed char
8
-128 até 127
unsigned short int
8
0 até 255
signed short int
8
-128 até 127
unsigned int
16
0 até 65535
signed int
16
-32768 até 32767
unsigned long int
32
0 até 4294967295
signed long int
32
-2147483648 até 2147483647
float
32
± 1,17549435082E-38 até ± 6,80564774407E38
double
32
± 1,17549435082E-38 até ± 6,80564774407E38
long double
32
± 1,17549435082E-38 até ± 6,80564774407E38
10
Tipos de variáveis
Representação numérica:
Decimal: não precisa de nenhuma representação
especial, mas não pode começar com zero ou será
considerado como base octal;
Hexadecimal: começa com 0x (0X): Exemplo: 0x3F;
Binário: começa com 0b (0B): Exemplo: 0b1100;
11
Operadores
• Operador é um símbolo que
faz com que
compilador execute alguma operação matemática ou
lógica;
• Os principais operadores são aritméticos, de relação,
lógicos e bit a bit;
• A seguir serão apresentados os principais elementos
de cada operador. Este tópico será visto em maiores
detalhes na linguagem de programação aplicado
diretamente ao compilador utilizado;
12
Operadores
• Operador Aritmético
Operador
Operação realizada
+
*
/
%
++
--
Soma
Subtração
Multiplicação
Divisão
Resto da divisão
Incremento
Decremento
13
Operadores
• Exercício: Altere o programa anterior para que os
leds sejam incrementados utilizando um contador;
Qual o tempo total
entre cada
incremento?
void main() {
unsigned char contador=0;
TRISB = 0x00;
PORTB=0;
do {
Delay_ms(500);
PORTB= contador;
contador++;
Delay_ms(500);
} while(1);
}
14
Operadores
• Exercício: Altere o programa anterior para que os
leds mostrem o resultado da operação matemática;
void main() {
unsigned char soma=0;
TRISB = 0x00;
do {
soma= 16 + 6/3 -3; //15
PORTB= soma;
Delay_ms(1000);
soma= (6*2 + 8)/10 + 40; //42
PORTB= soma;
Delay_ms(1000);
} while(1);
}
15
Operadores
• Operador de Relação: eles testam as relações nas
expressões. Seu resultado é 1 se for verdadeiro ou 0
se for falso;
Operador
Operação realizada
==
!=
>
<
>=
<=
Igual a
Não igual a
Maior que
Menor que
Maior ou igual a
Menor ou igual a
16
Operadores
•
•
•
•
•
•
•
Exemplos de Operador de Relação:
4 = = 3; retorna 0 - FALSO
3 = = 3; retorna 1 - VERDADEIRO
7 > = 3; retorna 1 – VERDADEIRO
4 < = 3; retorna 0 - FALSO
4 ! = 3; retorna 1 – VERDADEIRO
4 > 3; retorna 1 – VERDADEIRO
17
Operadores
• Exercício: Altere o programa anterior para que
quando o contador chegar em 255 o programa saia
do laço e termine a execução;
void main() {
unsigned char contador=0;
TRISB = 0x00;
do {
PORTB = 0;
Delay_ms(500);
PORTB= contador;
contador++;
Delay_ms(500);
} while(contador < 255);
}
18
Operadores
• Operadores lógicos: realizam operações lógicas nas
expressões.
Os operandos são considerados
verdadeiros(1) ou falsos(0). Seu resultado é 1 se for
verdadeiro ou 0 se for falso;
Operador
Operação realizada
&&
||
!
AND
OR
NOT (Negado)
19
Operadores
• Exemplos de Operador Lógico:
a) (3 > 1) & & (2= = 2);
1 & & 1; resulta em 1 - verdadeiro
b) (3 > 7) | | (2= = 2);
0 | | 1 ; resulta em 1 - verdadeiro
c) !{(3 > 1) & & (2= = 2)} ;
!{ 1 & &
1};
!{ 1} ; - resulta em 0 - falso
20
Operadores
• Operadores Bit a Bit: eles testam as relações dos
operadores nas expressões bit a bit;
Operador
Operação realizada
&
|
^
~
>>
AND
<<
OR
XOR
NOT
SHIFT RIGHT,desloca bits a
direita
SHIFT LEFT, desloca bits a
esquerda
21
Operadores
• Exemplos de Operador Bit a Bit:
a) v1= 101101, v2=110011, v3 = v1 & v2; AND
v1 = 1 0 1 1 0 1
v2 = 1 1 0 0 1 1
v3 = 1 0 0 0 0 1
b) v1= 110001, v2=010111, v3 = v1 | v2; OR
v1 = 1 1 0 0 0 1
v2 = 0 1 0 1 1 1
v3 = 1 1 0 1 1 1
22
Operadores
• Exemplo: Implemente o programa abaixo e
acompanhe a variação na saída de acordo com a
variação na entrada;
void main() {
TRISA = 0xFF;
TRISB = 0x00;
TRISC= 0x00;
do {
PORTB = PORTA & 0x0F;
PORTC = PORTA && 0x0F;
} while(1);
}
23
Operadores
• Exemplos de Operador Bit a Bit:
c) v1= 101101, v2=110011, v3 = v1 ^ v2; XOR
v1 = 1 0 1 1 0 1
v2 = 1 1 0 0 1 1
v3 = 0 1 1 1 1 0
d) v1= 110001, v2 = ~ v1 ; NOT
v1 = 1 1 0 0 0 1
v2 = 0 0 1 1 1 0
24
Operadores
• Exemplo: Implemente o programa
acompanhe a variação na saída;
abaixo
e
void main() {
TRISB = 0x00;
do {
PORTB = ~PORTB;
Delay_ms(500);
} while(1);
}
25
Operadores
• Exemplos de Operador Bit a Bit:
e) v1= 000101, v2=v1 << 2; SHIFT LEFT (x 2)
= 001010; <<1
v2 = 010100; <<2
f) v1= 010100, v2=v1 >> 2; SHIFT RIGHT (÷ 2)
= 001010; >> 1
v2 = 000101; >> 2
26
Operadores
• Implemente um programa que desloca os leds do
PORTB para direita;
void main() {
TRISB = 0x00;
PORTB = 0xA0;
do {
PORTB = PORTB>>1;
Delay_ms(100);
} while(1);
}
Acompanhe a
simulação para
ver o que acontece
com a saída
27
Operadores
• Exercício: Implemente um programa que desloca os
leds do PORTB para a esquerda;
28
Controle de fluxo de um programa
• O controle do fluxo normal de um programa é um
poderoso recurso em qualquer linguagem de
programação;
• A seguir veremos as diferentes formas de fazer este
controle;
29
Controle de fluxo de um programa
• Declaração de controle condicional IF
IF.......THEN....ELSE
SE......ENTÃO...SENÃO
• Ele é utilizado para executar um determinado
comando se uma determinada condição for
verdadeira. A opção ELSE não é obrigatória.
IF (true) THEN
CommandsTrue
ELSE
CommandsFalse
IF (verdadeiro) THEN
ComandosVerdadeiro
ELSE
ComandosFalso
30
Controle de fluxo de um programa
• Caso 1: somente verdadeiro:
if (true)
{
CommandsTrue
}
void main() {
TRISB = 0x00;
TRISA = 0xFF;
do {
if (PORTA.F0 = = 1)
{
PORTB = 0X0F;
}
Delay_ms(1000);
PORTB = 0XF0 ;
} while(1);
}
31
Controle de fluxo de um programa
• Exercício: Implemente um programa para que toda
vez que uma entrada (PORTA.0) estiver sendo
acionada (1) um contador é incrementado e o valor
mostrado em PORTB. O intervalo de incremento no
contador é de 300ms.
32
Controle de fluxo de um programa
• Caso 2: com verdadeiro e falso:
if (true)
{
CommandsTrue
}
else
{
CommandsFalse
}
void main() {
TRISB = 0x00;
TRISA = 0xFF;
do {
if (PORTA.0 = = 1)
PORTB = 0X0F;
else
PORTB = 0XF0 ;
} while(1);
};
33
Controle de fluxo de um programa
• Exercício: Implemente um programa para que toda
vez que uma entrada (PORTA.0) estiver sendo
acionada (1) somente os leds pares de PORTB devem
estar ligados, caso contrário os ímpares.
34
Controle de fluxo de um programa
• Exercício: Implemente um programa que tenha um
contador que é incrementado a cada 300 ms e seu
valor mostrado na PORTB. Enquanto o valor do
contador for menor que 50 a saída PORTC.0 fica em
1, caso contrário somente a saída PORTC.1 fica em 1.
35
Controle de fluxo de um programa
• Desafio: Considere que na saída PORTB tenhamos 8
leds ligados. Elabore um programa para que somente
1 led esteja ligado e que o acendimento se desloque
entre os 8 leds, de uma ponta para outra, em um
movimento de ida e volta. O incremento no
deslocamento deverá ser a cada 300 ms e em laço
infinito. Utilize o IF para selecionar o sentido do
deslocamento do led.
36
Controle de fluxo de um programa
• Caso 3: IF aninhado:
if (true1)
{
Commands1
}
else if(true2)
{
Commands2
}
else if (true3)
{
Commands3
}
else
{
Commands4
}
V
true1
?
Commands1
N
V
Commands2
true2
?
N
V
true3
?
Commands3
N
Commands4
37
Controle de fluxo de um programa
void main() {
unsigned char contador=0;
TRISB = 0x00;
TRISC = 0x00;
do { PORTB=contador;
if (contador < 20)
PORTC = 0X01;
else if (contador < 40)
PORTC = 0X03 ;
else if (contador < 70)
PORTC = 0X07 ;
else
PORTC = 0X0F ;
contador++;
} while(1);
}
38
Controle de fluxo de um programa
• Exercício: Altere o programa anterior para que as
saídas da PORTC (C.0, C.1 e C.2) tenha seu nível
lógico alterado de acordo com a tabela abaixo.
Contador
C.0
C.1
C.2
Contador>127
0
0
0
31<NIVEL≤127
1
0
0
15<NIVEL≤31
1
1
0
NIVEL≤15
1
1
1
39
Controle de fluxo de um programa
• Desafio: A) Considere que na entrada PORTA
tenhamos 8 chaves ligadas simbolizando os sensores
de segurança de uma casa. Elabore um programa,
utilizando o IF aninhado para testar os sensores, um
de cada vez, para que, enquanto algum dos sensores
estiver atuado (1) todos os leds da saída PORTB
devem ficar ligados, caso contrário desligados.
• B) Implemente um programa para resolver o
problema acima sem utilizar o IF aninhado. Compare
os dois programas e avalie qual é a melhor solução.
40
Controle de fluxo de um programa
• Declaração de controle condicional WHILE
WHILE (true) { }
ENQUANTO (verdadeiro) { }
• Faz a verificação da condição ANTES de executar o
comando. Enquanto a condição permanecer
verdadeira o(s) comando(s) é/são executados.
WHILE (true)
{
Comandos
}
41
Controle de fluxo de um programa
while(true)
{
Comandos
}
V
pergunta
?
Comandos
N
42
Controle de fluxo de um programa
• Exemplo WHILE:
void main() {
unsigned char contador=0;
TRISB = 0x00;
while(contador < 31)
{
PORTB = contador;
Delay_ms(300);
contador++;
}
}
Qual é o valor final
que aparece na saída??
43
Controle de fluxo de um programa
• Exercício: Na esteira abaixo quando o sensor S1 for
acionado por uma peça o motor M1 deve ser ligado e
quando a peça acionar o sensor S2 o motor deve ser
desligado. Implemente um programa em C que
atenda o solicitado.
S1
S2
M1
S1 = PORTA.0
S2 = PORTA.1
M1 = PORTB.0
44
Controle de fluxo de um programa
• Resolução:
void main() {
TRISB = 0x00;
TRISA = 0xFF;
do {
while(PORTA.f0 = = 0);
PORTB.f0 = 1;
while(PORTA.f1 = = 0);
PORTB.f0 = 1;
} while(1);
}
45
Controle de fluxo de um programa
• Exercício: Na esteira abaixo a peça é colocada na posição dada
pelo sensor S1, e com isso o motor M1 é ligado, levando a
peça até o sistema de aquecimento. Neste instante o motor
M1 é desligado e a peça espera 3 segundos, sendo o motor
M1 ligado novamente para levar a peça para o resfriamento,
quando então o motor M1 é desligado novamente,
aguardando agora 4 segundos neste estágio. Após decorrido o
tempo o motor M1 é ligado novamente para levar a peça até
a posição dada pelo sensor S4, quando o motor é desligado
novamente. Implemente um programa em C que atenda o
solicitado.
S1 = PORTA.0
S2 = PORTA.1
S3 = PORTA.2
S4 = PORTA.3
M1 = PORTB.0
46
Controle de fluxo de um programa
• Resolução:
47
Controle de fluxo de um programa
• Declaração de controle condicional DO ... WHILE
DO { }WHILE (true)
FAÇA{ } ENQUANTO (verdadeiro)
• Executa a ação ANTES de verificar a condução.
Enquanto a condição permanecer verdadeira o(s)
comando(s) é/são executados.
DO
{
Comandos
}WHILE (true);
48
Controle de fluxo de um programa
Comandos
do
{
Comandos
}while (true);
V
pergunta
?
N
49
Controle de fluxo de um programa
• Exemplo:
void main() {
unsigned char contador=0;
TRISB = 0x00;
do {
PORTB= contador;
contador++;
Delay_ms(300);
} while(contador < 31);
}
50
Controle de fluxo de um programa
• Exemplo:
void main() {
TRISB = 0x00;
PORTB=0x01;
do{
do {
PORTB= PORTB<<1;
delay_ms(300);
} while(PORTB!=128);
do {
PORTB= PORTB>>1;
delay_ms(300);
} while(PORTB!=1);
}while(1);
}
51
Exercícios de revisão
EXERCÍCIOS DE REVISÃO
52
Exercícios de revisão
• Exercício : No sistema abaixo quando uma peça é colocada na
posição dada pelo sensor S1 o motor M1 é ligado, levando a
peça até o sensor S2 e caindo na caixa de saída. Sabe-se que a
caixa suporta até 20 peças. Implemente um contador(CONT)
para que somente quando somente 20 peças caírem na caixa
o motor M1 é desligado e a lâmpada L1 é ligada, alertando ao
operador da necessidade de trocar a caixa. Implemente um
algoritmo que atenda o solicitado.
S1 = PORTA.0
S2 = PORTA.1
M1 = PORTB.0
L1= PORTB.1
53
Exercícios de revisão
• Resolução:
54
Exercícios de revisão
• Exercício: No exercício anterior foi acrescentado o
botão B1 no painel para que quando o operador
trocar a caixa ele irá apertar o botão a lâmpada L1 irá
apagar, o motor M1 é ligado novamente, o contador
é zerado e o ciclo se inicia novamente.
S1 = PORTA.0
S2 = PORTA.1
B1= PORTA.2
M1 = PORTB.0
L1= PORTB.1
55
Exercícios de revisão
• Resolução:
56
Exercícios de revisão
• Exercício: No sistema de seleção da página seguinte
quando uma caixa é colocada na posição dada pelo
sensor S1 o motor M1 é ligado levando a caixa até o
sensor S5, quando então é desligado. Implemente
um programa para que de acordo com o tipo de
caixa, dada pela figura e identificada no sistema
através do acionamento dos sensores S2,S3 e S4,
somente a lâmpada correspondente fique ligada.
Esta lâmpada somente poderá ficar ligada até a caixa
correspondente chegar ao sensor S5. O sistema é
contínuo.
57
Exercícios de revisão
S1 = PORTA.0
S2 = PORTA.1
S3 = PORTA.2
S4 = PORTA.3
S5 = PORTA.4
M1= PORTB.0
L1= PORTB.1
L2= PORTB.2
L3= PORTB.3
58
Exercícios de revisão
• Resolução:
59
REFERÊNCIAS
•
•
•
•
Robert Schildt. C completo e total.
User´s Manual MikroC
Fábio Pereira. Programação em C
Notas de aula do Prof. Stefano
60