Вы находитесь на странице: 1из 27

Microprocessadores e

Microcontroladores

Programao em Linguagem C
Formato bsico do programa
/* comentrios de documentao
* iniciados sempre por uma combinao /* e terminados por */
* uma boa prtica documentar seus programas
*/

#include <ArquivoDeDefinies.h> // contm as definies utilizadas

void main() { // funo principal do programa


. Corpo do programa // TODO programa em C inicia pela
. Variveis e instrues // execuo da funo main
} // final do programa
Um exemplo: Cabealho (header)
/*
* Experimento para laboratrio de Microcontroladores PIC
* Hardware de aplicao: McMaster com PIC 18F4550
* Desenvolvido por: Prof. Luis R Gianini
* Criado em 18/10/2014
* Laboratorio: UNINOVE
* Finalidade: Demonstrar a operao das portas digitais do PIC
* Efeito: Piscar os LEDs ESPECIAIS (RC0,RC1 e RC3)
*
* CONFIGURAO DOS JUMPERS DA PLACA:
*
* CAP USB(RC3) -> ON
* DATA I2C -> OFF
* CLOCK I2C -> OFF
* COLUNA 2(RB1) -> ON
* COLUNA 1(RB0) -> ON
* LINHA 1 / DISPLAY MILHAR(RB4) -> ON
* LEDS ESPECIAS (RC0,RC1,RC2) -> ON
*/
// Definio do processador utilizado
#include <p18F4550.h> // Definio dos registradores deste PIC

// Headers utilizados
#include <delays.h> // Delay library functions

// Portas utilizadas
//
// RC0 -> LED Vermelho
// RC1 -> LED Amarelo
// RC2 -> LED Verde
// Inicio do programa

void main () {

PORTC = 0x00; // Limpa PORTC


TRISC = 0b11111000; // Configura direo dos pinos da PORTA C
while(1) {
PORTC = 0b00000111; // acende os tres LEDs
Delay1KTCYx(200); // Aguarda um tempo
PORTC = 0b00000000; // apaga os tres LEDs
Delay1KTCYx(200); // Aguarda um tempo
}
} // FIM DO PROGRAMA
Tipos de dados

Type Size Valor mnimo Valor mximo

char 8 bits -128 127

unsigned char 8 bits 0 255

int 16 bits -32,768 32,767

unsigned int 16 bits 0 65,535

short 16 bits -32,768 32,767

unsigned short 16 bits 0 65,535

short long 24 bits -8,388,608 8,388,607

unsigned short long 24 bits 0 16,777,215

long 32 bits -2,147,483,648 2,147,483,647

unsigned long 32 bits 0 4,294,967,295


Exemplo de definio de varivel

int i;
char p;
int x=0, y=2;
long total;
unsigned char dado;
Exemplo de definio de varivel

void main() {

int i; // Variavel utilizada como controle do looping

PORTA = 0x00; // Limpa PORTA


PORTD = 0x00; // Limpa PORTD
TRISA = 0b11101111; // Configura direo dos pinos da PORTA A (RA4 como saida)
TRISD = 0b00000000; // Configura direo dos pinos da PORTA D (Todos como saida)
PORTA = 0x10;
while(1) {
i=1;
while(i<=128) {
PORTD = i; // Grava valor da PORTA D
Delay1KTCYx(100);
i=i*2;
}
}
} // FIM DO PROGRAMA
Operadores lgicos relacionais

Operador Operao
== Igual
!= Diferente
< Menor
> Maior
<= Menor ou igual
>= Maior ou igual
&& And (e)
|| Or (ou)
! Negao

Obs:- Estas operaes sempre resultam em TRUE (1) ou FALSE (0)


Exemplo de operao lgica relacional

void main() {

int i; // Variavel utilizada como controle do looping

PORTA = 0x00; // Limpa PORTA


PORTD = 0x00; // Limpa PORTD
TRISA = 0b11101111; // Configura direo dos pinos da PORTA A (RA4 como saida)
TRISD = 0b00000000; // Configura direo dos pinos da PORTA D (Todos como saida)
PORTA = 0x10;
while(1) {
i=1;
while(i<=128) {
PORTD = i; // Grava valor da PORTA D
Delay1KTCYx(100);
i=i*2;
}
}
} // FIM DO PROGRAMA
Exemplo de operao lgica relacional

void main() {

int i; // Variavel utilizada como controle do looping


int dir; // Variavel de direo do deslocamento dos LEDs

TRISA = 0b11101111; // Configura direo dos pinos da PORTA A (RA4 como saida)
TRISD = 0b00000000; // Configura direo dos pinos da PORTA D (Todos como saida)
PORTA = 0x10; // Habilita RA4 (liga transistor dos LEDs
dir = 1;
while(1) {
i=1;
if (dir==1) {
while(i<=128) {
PORTD = i; // Grava valor da PORTA D
Delay1KTCYx(100);
i=i*2;
}
dir=0
} else {
i=128;
while(i>=1) {
PORTD = i; // Grava valor da PORTA D
Delay1KTCYx(100);
i=i/2;
}
dir=1;
}
}
} // FIM DO PROGRAMA
Estilo de codificao
void main()
{
...
..
while(1)
{
i=1;
if (dir==1)
{
while(i<=128)
{
PORTD = i; // Grava valor da PORTA D
Delay1KTCYx(100);
i=i*2;
}
dir=0
}
else
{
i=128;
while(i>=1)
{
PORTD = i; // Grava valor da PORTA D
Delay1KTCYx(100);
i=i/2;
}
dir=1;
}
}
} // FIM DO PROGRAMA
Estilo de codificao
void main() {
...
..
TRISA = 0b11101111; // Configura direo dos pinos da PORTA A (RA4 como saida)
TRISD = 0b00000000; // Configura direo dos pinos da PORTA D (Todos como saida)
PORTA = 0x10; // Habilita RA4 (liga transistor dos LEDs
dir = 1;
while(1) {
i=1;
if (dir==1) {
while(i<=128) {
PORTD = i; // Grava valor da PORTA D
Delay1KTCYx(100);
i=i*2;
}
dir=0
} else {
i=128;
while(i>=1) {
PORTD = i; // Grava valor da PORTA D
Delay1KTCYx(100);
i=i/2;
}
dir=1;
}
}
} // FIM DO PROGRAMA
Operaes aritmticas

Operador Operao

+ Adio

- Subtrao

* Multiplicao

/ Diviso

% Resto da diviso

++ Incrementao (unrio)

-- Decrementao (unrio)
Exemplo ps-incremento e pr-incremento

void main() {

int a,b,i=10;

a = i++; // a recebe 10 e i recebe 11


b = ++i; // i recebe 12 e b recebe 12

} // FIM DO PROGRAMA
Exemplo ps-decremento e pr-decremento

void main() {

int a,b,i=10;

a = i--; // a recebe 10 e i recebe 9


b = --i; // i recebe 8 e b recebe 8

} // FIM DO PROGRAMA
Exemplo operao % (resto da diviso)

void main() {

int a,b,i=35;

a = i / 10; // a recebe 3
b = i % 10; // b recebe 5

} // FIM DO PROGRAMA
Operaes lgicas

Operador Operao
& And (e)

| Or (ou)

^ Xor (xou)

~ Negao ou inversor (unrio)

<< Deslocamento a esquerda (*2)

>> Deslocamento a direita (/2)


Exemplos de operaes lgicas

Tabela verdade
A B A&B A|B A^B ~A
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0
Exemplos de operaes lgicas (AND)
Variveis:
A = 0b11001010
0312 Octal, 0xca Hexadecimal ou 202 decimal
B = 0b00001111
017 Octal, 0x0f Hexadecimal ou 15 decimal

Operao & com 8 bits


Var Binrio Oct Hex Dec
A 1 1 0 0 1 0 1 0 0312 0xca 202
& & & & & & & & & & & &
B 0 0 0 0 1 1 1 1 017 0x0f 15
A&B 0 0 0 0 1 0 1 0 012 0x0a 10
Exemplos de operaes lgicas (OR)
Variveis:
A = 0b11001010
0312 Octal, 0xca Hexadecimal ou 202 decimal
B = 0b00001111
017 Octal, 0x0f Hexadecimal ou 15 decimal

Operao | com 8 bits


Var Binrio Oct Hex Dec
A 1 1 0 0 1 0 1 0 0312 0xca 202
| | | | | | | | | | | |
B 0 0 0 0 1 1 1 1 017 0x0f 15
A|B 1 1 0 0 1 1 1 1 0317 0xcf 207
Exemplos de operaes lgicas (XOR)
Variveis:
A = 0b11001010
0312 Octal, 0xca Hexadecimal ou 202 decimal
B = 0b00001111
017 Octal, 0x0f Hexadecimal ou 15 decimal

Operao ^ com 8 bits


Var Binrio Oct Hex Dec
A 1 1 0 0 1 0 1 0 0312 0xca 202
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
B 0 0 0 0 1 1 1 1 017 0x0f 15
A^B 1 1 0 0 0 1 0 1 0305 0xc5 197
Exemplos de operaes lgicas (NOT)
Variveis:
A = 0b11001010
0312 Octal, 0xca Hexadecimal ou 202 decimal

Operao ~ com 8 bits


Var Binrio Oct Hex Dec
A 1 1 0 0 1 0 1 0 0312 0xca 202
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
~A 0 0 1 1 0 1 0 1 065 0x35 53
Abreviaes de operaes

Operao Abreviao Descrio

A = A+20 A += 20 Soma 20 em A

C = C+A C += A Soma A em C

i = i*2 I *= 2 Multiplica i por 2

x = x << 2 x <<= 2 Desloca x dois bits a esquerda (*4)

x = x >> 3 x >>= 3 Desloca x trs bits a direita (/8)

y = y & 0x0f y &= 0x0f Zera nibble mais significativo de y


Exemplos de operaes de deslocamento

Variveis:
A = 0b11001010
0312 Octal, 0xca Hexadecimal ou 202 decimal

Operao >> com 8 bits


Var Binrio Oct Hex Dec
A 1 1 0 0 1 0 1 0 0312 0xca 202
A>>1 0 1 1 0 0 1 0 1 0145 0x65 101
A>>2 0 0 1 1 0 0 1 0 062 0x32 50
Exemplos de operaes de deslocamento

Variveis:
A = 0b00110010
062 Octal, 0x32 Hexadecimal ou 50 decimal

Operao << com 8 bits


Var Binrio Oct Hex Dec
A 0 0 1 1 0 0 1 0 062 0x32 50
A<<1 0 1 1 0 0 1 0 0 0144 0x64 100
A<<2 1 1 0 0 1 0 0 0 0310 0xc8 200
Diferena entre !(NOT) e ~(NOT)

Operao ~ e ! com 8 bits


Var Binrio Oct Hex Dec
A 1 1 0 0 1 0 1 0 0312 0xca 202
Variveis: ~A 0 0 1 1 0 1 0 1 065 0x35 53
!A 0 0 0 0 0 0 0 0 0 0x00 0
A = 0b11001010
B 0 1 0 1 0 1 0 1 125 0x55 85
B = 0b01010101
~B 1 0 1 0 1 0 1 0 252 0xaa 170
C = 0b00000000 !B 0 0 0 0 0 0 0 0 0 0x00 0
C 0 0 0 0 0 0 0 0 0 0x00 0
~C 1 1 1 1 1 1 1 1 0377 0xff 255
!C 0 0 0 0 0 0 0 1 01 0x01 1
Palavras reservadas da Linguagem C

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while