Você está na página 1de 33

Microcontroladores pic 8bits

Sumário

1 Introdução 2
1.1 Registradores 3
Registrador TRISIO 3
Registrador GPIO ou PORT 3
1.2 Configurando pinos 3
1.3 COMPARADORES ANALÓGICOS E ADC 4
2 PIC 12F675 5
2.1 Características principais: 5
2.2 Descrição dos pinos 5
2.3 Exemplos de programas 6
1º pisca led 6
2º botão e led 7
3º Um pulso liga, outro pulso desliga 9
4º Comparadores analógicos 10
5º CONVERSOR ANALÓGICO PARA DIGITAL 12
3 PIC 16F628A 14
3.1 Características: 14
3.2 Descrição dos pinos 14
3.3 EXEMPLOS 15
1 - Botão e led 15
2 - Piscar led 18
3 - Piscar led com botão 19
4 - Botão de toque 20
5 - Corredor de leds 21
6 - Contador de 0 á 9 com display 22
7 – LCD 24

2
Introdução

Os microcontroladores são dispositivos versáteis onde podemos armazenar um


programa que ele executará. No mercado existem vários modelos diferentes com recursos
diferentes, podendo realizar aplicações simples e complexas. No geral um microcontrolador
contém uma CPU(microprocessador) com periféricos sendo capaz de realizar contas
matemáticas e analisar valores. Quanto mais avançado é o dispositivo mais recursos ele
contém e mais facilmente ele executará as ações.
Para que ele funcione é necessário um clock que consiste em um oscilador que gera
pulsos em alta frequência para que o programa seja rodado. Quanto maior o clock mais
rápido o microcontrolador trabalha, porém também consome mais energia. As frequências
de clock mais utilizadas começam nos 37Khz podendo ir além dos 40Mhz.
No microcontrolador também encontramos memória RAM, memória flash,
comparadores de tensão, conversor analógico digital, PWM, temporizadores, diversos tipos
de comunicação de dados e muitas outras funções. Estes recursos vai depender do modelo
escolhido.

Além de tudo isso os pinos do microcontrolador são configuráveis podendo ser uma
entrada ou uma saída de acordo com a escolha do programador. O importante é entender
que cada pino tem várias funções que podem ser escolhidas para uso. Assim, como exemplo,
um pino pode ser entrada ou saída digital, pode ser entrada para o clock do Timer1, pode ser

3
entrada para o oscilador externo a cristal ou pode ser entrada analógica. Esta configuração
da função que o pino vai assumir é realizada adicionando valores nos registradores internos.

1.1 Registradores

Os microcontroladores utilizam espaços de sua memória onde contém os


registradores. Estes elementos configuram a forma do microcontrolador trabalhar, e para
isto basta ajustar o seu valor. Abaixo mostraremos alguns registradores utilizados no uC.

Registrador TRISIO

O TRISIO é o registrador que configura os pinos como entrada ou saída. Com o valor
“0” no respectivo bit o pino se torna saída(Output), com “1” o pino é configurado como
entrada(Input).

Registrador GPIO ou PORT

O GPIO configura os pinos como ligado (1) ou desligado (0). Em alguns PICs, GPIO é
chamado PORT. Os bits podem ser setados de duas maneiras; GPIO.Bx para setar o bit x ou
ajustando o valor do bit correspondente através dos modos explicados mais adiante.
Para deixar claro; quando o PINO estiver configurado como saída e ligado, uma tensão
próxima a alimentação será emitida com uma capacidade máxima de 25mA, já quando o
pino estiver desligado uma tensão 0 será emitida na saída. Quando o pino está configurado
como entrada ele terá uma alta impedância.

1.2 Configurando pinos

Exemplos de definição de pinos.

TRISIO = 0b00000000; //todos pinos são saídas


TRISIO = 0b11111111; //todos pinos são entradas
TRISIO = 0b00000011; //2pinos são entradas e o restante saídas
TRISA=0b00001111; //4 pinos entrada e 4 como saída(PORTA)
TRISB=0B01010101; //4 pinos entrada e 4 como saída(PORTB)

Depois de configura o pino como entrada ou saída podemos liga-lo ou desligá-lo.

4
GPIO = 0b00010000; //liga a saída , todos pinos foram comandados de uma única vez
GPIO.B2 = 1; //ativa o bit 3
PORTA.RA0 = 1; //ativa o bit 1 do portA

Existem alguns modos de configurar um pino, podendo ser escrito em decimal, binário ou
hexadecimal

//Seta o bit do pino para HIGH diretamente.


GPIO.B2 = 1;
PORTA.RA3=1;

//Em hexa, ajustando o valor do bit correspondente


GPIO = 0x04;
PORTB=0X07;

//Em binário
GPIO = 0b00000100;
PORTC=0B00110010;

1.3 COMPARADORES ANALÓGICOS E ADC

Alguns modelos de microcontrolador contém internamente comparadores analógicos


e conversor analógico digital. É importante ressaltar que para utilizar os pinos do
microcontrolador como entrada ou saída digital é necessário desativar os módulos
comparadores e conversor analógico para digital , e para isso devemos alterar o registrador
CMCON e ANSEL.

Os três primeiros bits CM0,CM1, e CM2 definem a forma dele trabalhar . Para
desligar a função de comparação basta ativar estes três bits.

CMCON = 0b00000111;

No caso do registrador ANSEL basta desliga-lo atribuindo “0” para ele.

ANSEL = 0;
Todas as outras configurações estão contidas no manual do componente.

5
PIC 12F675
2.1 Características principais:

- 8 pinos, facilitando a montagem;


- Até 6 portas configuráveis como entrada ou saída e 2 osciladores internos 4MHz e
37kHz);
- Clock externo até 20Mhz;
- 10 interrupções disponíveis;
- Memória de programação FLASH, que permite a gravação do programa diversas
vezes;
- Memória EEPROM(não volátil);
- 1 comparador analógico
- Conversor analógico digital com 4 canais com 10bits de resolução
- Temperatura de trabalho -40ºC até +125ºC
- Tensão de trabalho 3.0V até +5.5V
- Corrente máxima de saída de um pino(quando em VDD) de 25mA

2.2 Descrição dos pinos

2.3

6
Exemplos de programas

1º pisca led

Este exemplo faz com que um led ligado no GP0 fique piscando a cada 1 segundo.

U1 R1
7
GP0/AN0
6 330R
GP1/AN1/VREF
5
GP2/T0CKI/INT/AN2
4 D1
GP3/MCLR
3 LED-GREEN
GP4/T1G/OSC2/AN3
2
GP5/T1CKI/OSC1
PIC12F675

void main()
{
TRISIO = 0b11111110; //define gp0 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
GPIO = 0; //desliga todas sáidas

while(1) // loop infinito


{
GPIO.B0 = 1; //liga GP0
delay_ms(1000); //aguarda 1000ms
GPIO.B0 = 0; //desliga GP0
delay_ms(1000); //aguarda 1000ms
}

Para que este programa funcione corretamente é necessário definir o oscilador interno de
4Mhz e desativar a função de Master clear(MCLR).Estas configurações são feitas na edição
do projeto do compilador MikroC (Project->Edit project).

7
2º botão e led
Este exemplo faz ligar o led quando o botão é pressionado e desliga o mesmo quando o
botão é solto.

vcc

BOTAO1 U1
7
R1
GP0/AN0
6 330R
GP1/AN1/VREF
5
GP2/T0CKI/INT/AN2 D1
4
GP3/MCLR
3 LED-GREEN
GP4/T1G/OSC2/AN3
2
GP5/T1CKI/OSC1
PIC12F675

R2
10k

void main()

8
{
TRISIO = 0b11111110; //define gp0 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
GPIO = 0; //desliga todas saídas

while(1) // loop infinito


{
if(GPIO.B1==1) //se o botão foi pressionado
GPIO.B0 = 1; //liga GP0
else //senão
GPIO.B0 = 0; //desliga GP0
}

Uma outra maneira de escrever este mesmo programa é definindo nomes para os pinos com
a função #define. Isso facilita muito o entendimento do programa veja:

#define led gpio.b0 //definição de nomes para pinos


#define botao gpio.b1

void main()
{
TRISIO = 0b11111110; //define gp0 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
GPIO = 0; //desliga todas saídas

while(1) // loop infinito


{
if(botao==1) //se o botão foi pressionado
led = 1; //liga GP0
else //senão
led = 0; //desliga GP0
}
}

3º Um pulso liga, outro pulso desliga

9
#define led gpio.b0 //definição de nomes para pinos
#define botao gpio.b1

void main()
{
TRISIO = 0b11111110; //define gp0 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
led = 0; //desliga led

while(1) // loop infinito


{
if(botao==1) //se o botão foi pressionado
led = !led; //inverte o estado do led
while(botao==1) //aguarda enquanto botao não é solto
{
}
delay_ms(50); //filtro para botao
}
}

Exercício1
Criar um programa que tenha dois botões (b1 e b2 ) e dois leds (led1 e led2).
Botão pressionado liga o led. Cada botão irá ligar o seu led.
Você deverá utilizar os seguintes pinos:
b1 e b2 em GP0 e GP1
led1 e led2 em GP4 e GP5

Exercício2
Refaça o programa anterior porém com os leds acendendo quando o botão é solto.

Exercício3
Escreva um programa onde um led liga se dois botões forem pressionados juntos(Lógica E).

Exercício4
Escreva um programa onde um led liga se um ou outro botão for pressionado juntos(Lógica
OU).
4º Comparadores analógicos

Circuitos comparadores são úteis quando precisamos atuar em algo mediante


comparação de valores. Se você precisa por exemplo ligar um ventilador quando a

10
temperatura passar de um valor este circuito é ideal. Obviamente para este exemplo vamos
precisar de um sensor de temperatura para ler e enviar ao microcontrolador.

Abaixo é mostrado um diagrama simples de como testar um circuito comparador de


tensão. Aqui foi utilizado dois resistores como divisor resistivo para determinar a referência
para disparo e um potenciômetro para simular um sensor.
vcc

RV1
R3
10k
37%

10k
U1
7 vref
GP0/AN0
6
GP1/AN1/VREF
5
GP2/T0CKI/INT/AN2
4
GP3/MCLR
3
GP4/T1G/OSC2/AN3
2 R1
GP5/T1CKI/OSC1 330R
PIC12F675

D1
LED-GREEN
R2
10k

Quando a tensão de saída do potenciômetro for maior que a tensão de referência o led será
acionado.

#define led gpio.b2 //definição de nomes para pinos

void main()
{
TRISIO = 0b11111011; //define gp2 como saída
CMCON = 0b00000010; //comparador ligado
ANSEL = 0b00000011; // an0 e an1 como entradas analógicas
led = 0; //desliga led

while(1) // loop infinito


{
if(cmcon.cout==1) //se atingiu referencia
led=1; //liga led
else //senao
led=0; //desliga led

}
}

11
Exercício5
Inverta o estado de saída do comparador fazendo ele ligar o led quando ficar abaixo do valor
da entrada.
Dica: altere o bit CINV do registrador CMCON.

Exercicio6
Crie um programa para quando a tensão for maior que 3V um led ficará piscando.

Exercício7

Crie um programa utilizando a referência de tensão interna (registrador VRCON).


Ajuste ele para uma faixa baixa (Low range) e com tensão de referência de
aproximadamente 1V.
Não esqueça de alterar o modo de comparador em CMCON.

5º CONVERSOR ANALÓGICO PARA DIGITAL

Este microcontrolador possui 4 entradas analógicas que podem ser utilizadas de


várias formas. No exemplo abaixo o valor da entrada analógica é comparado com 4 valores
(205,410,615 e 820) e quando supera cada um led é acionado.

12
Para simplificar a programação neste exemplo vamos utilizar a biblioteca ADC que
deve ser marcada na aba lateral direita.

vcc

RV1
29%

10k
U1
7
GP0/AN0
6
GP1/AN1/VREF
5
GP2/T0CKI/INT/AN2
4
GP3/MCLR
3
GP4/T1G/OSC2/AN3
2
GP5/T1CKI/OSC1
PIC12F675
R4 R3 R2 R1
330R 330R 330R 330R

D4 D3 D2 D1
LED-GREEN LED-GREEN LED-GREEN LED-GREEN

#define led1 gpio.b1 //define nome para saidas


#define led2 gpio.b2
#define led3 gpio.b4
#define led4 gpio.b5

unsigned int entrada; //variável de armazenamento da entrada analógica

void main()
{
TRISIO = 0b11001001; //define gp1,2,4,5 como saída e gp0 como entrada
CMCON = 0b00000111; //comparador desligado
ANSEL = 0b00000001; // an0 como entradas analógicas
ADC_Init(); // inicializa modulo adc

13
led1 = 0; //desliga leds
led2 = 0;
led3 = 0;
led4 = 0;

while(1) // loop infinito


{
entrada = ADC_Read(0); //le o canal analogico 0

if(entrada >= 205) //se a entrada é maior ou igual ao valor liga a saída
led1=1;
else
led1=0;
if(entrada >= 410)
led2=1;
else
led2=0;
if(entrada >= 615)
led3=1;
else
led3=0;
if(entrada >= 820)
led4=1;
else
led4=0;
}

Exercício8
Criar um programa onde a saída gp5 é ativada quando a temperatura for maior que
30°C(considere 3V).

Exercício9
Criar um programa onde as saídas gp4 e gp5 ficarão piscando alternadamente quando a
tensão for menor que 1V.
10- projeto – controle automático de irrigação

Desenvolver um projeto que controlará automaticamente a irrigação de uma horta. Para isto
utilizaremos um sensor de umidade ligado na An0, e uma bomba de água para irrigação. Se o
sensor detectar umidade baixa(<30%) a bomba liga e começa a irrigar a horta. Após 10s a
válvula será desligada e aguarda 10s para ler novamente o sensor de umidade.

14
6º Timer0
É um temporizador e contador de 8 bits(máx 255) com recursos especiais.
No modo temporizador ele é incrementado pelo ciclo de clock utilizando um divisor de
frequência(Prescaler). Já no modo contador ele é incrementado através do pino GP2/T0CKI.

Registradores utilizados no timer0:

MODO CONTADOR
O TIMER0 funciona como contador, quando você usa como oscilador os pulsos externos
aplicado no pino GP2/T0CKI.

Você deve configurar o seguinte registro:

RBPU – Resistor interno de pull up (normalmente desabilitado)


1- Pull up desabilitado
0- Pull up habilitado

INTEDG – Borda para interrupção


1- interrupção na borda de subida
0- Interrupção na borda de descida

T0CS - Define a fonte de clock do TIMER0:


1 - Externa (PINO GP2/T0CKI) - Modo contador;
0 - Interna (Cristal de quartzo) - Modo temporizador;

15
T0SE - Seleção da borda de transição do pino GP2/T0CKIN
1 - transição nivel alto-baixo (transição negativa);
0 - transição nivel baixo-alto (transição positiva);

PSA - Habilitação do prescaler (no modo CONTADOR é comum desabilitar);


1 - Desabilitado;
0 - Habilitado;

PS2, PS1, PS0 - Seleção do prescaler( somente no modo temporizador);

bits / TMR0 rate


000 1:2
001 1:4
010 1:8
011 1:16
100 1:32
101 1:64
110 1:128
111 1:256

Exemplo de projeto

16
VCC

RESET BOTAO/SENSOR

U1
7
GP0/AN0
6
GP1/AN1/VREF
5
R3 R1 GP2/T0CKI/INT/AN2
4
10k 10k GP3/MCLR
3 R2
GP4/T1G/OSC2/AN3
2
GP5/T1CKI/OSC1
330R
PIC12F675
D1
LED-GREEN

// contador com timer0, ao atingir 10 o led acende

#define reset gpio.b1


#define led gpio.b5

void main()
{
TRISIO = 0b11011111; //define gp5 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
option_reg = 0b10101000; //clock atraves do gp2, sem prescaler,pullup desabilitado
tmr0=0; //zera timer0
led = 0; //desliga led

while(1)
{
if(tmr0>=10) //se o timer0 for maior ou igual a 10
led=1; //liga o led
else //senão
led=0; //desliga o led

if(reset==1) //se o reset for pressionado

17
tmr0=0; //zera contador
}

Exercício 11
Criar um contador decrescente que comece em 9 e ative uma saída ao atingir 0;

Exercício12

Criar um contador crescente e decrescente. (utilize um outro botão para alterar


entre crescente e decrescente.

MODO TEMPORIZADOR

O temporizador do TIMER0 funciona quando você usa o oscilador interno do PIC ou o cristal
de quartzo externo.

Você deve configurar os seguintes bits do registro OPTION_REG:

RBPU – Resistor interno de pull up (normalmente desabilitado)


1- Pull up desabilitado
0- Pull up habilitado

INTEDG – Borda para interrupção


1- interrupção na borda de subida
0- Interrupção na borda de descida

T0CS - Define a fonte de clock do TIMER0:


1 - Externa (PINO GP2/T0CKI) - Modo contador;
0 - Interna (Cristal de quartzo) - Modo temporizador;

T0SE - Seleção da borda de transição do pino GP2/T0CKIN


1 - transição nivel alto-baixo (transição negativa);
0 - transição nivel baixo-alto (transição positiva);

18
PSA - Habilitação do prescaler (no modo CONTADOR é comum desabilitar);
1 - Desabilitado;
0 - Habilitado;

PS2, PS1, PS0 - Seleção do prescaler( somente no modo temporizador);

bits / TMR0 rate


000 1:2
001 1:4
010 1:8
011 1:16
100 1:32
101 1:64
110 1:128
111 1:256

Você deve estar perguntando: O que é prescaler?


Prescaler é o divisor de frequência do clock do TIMER0. É usado no modo temporizador para
poder obter tempos maiores.

Geralmente a contagem do tempo é feita pelo estouro do timer0, ou seja , quando ele atige
seu valor máximo e volta para zero( over flow). Assim o tempo pode ser determinado por:

t = ciclo de máquina * prescaler * contagem ( 256 - TMR0 );

onde: ciclo de máquina = 1/(Fosc/4);

Fosc é a frequência do clock do cristal oscilador.

EXEMPLO1:

O clock de um PIC é de 4MHz, utilizando o prescaler de 1:256 e contagem de 0 a 256, qual


será o tempo?

ciclo de máquina = 1 / (4Mhz/4) = 1us.

t = 1us * 256 * 256;

19
t = 65536us ou 65,536ms

Para ter tempos ainda maiores, como alguns segundos, um dos meios de se conseguir é
utilizando a interrupção.

Veja um exemplo: utilizando clock 4Mhz e prescaler de 1:4.

EXEMPLO2:

Em alguns projetos é necessário criar bases de tempos precisas. Vamos supor que queremos
criar um temporizador de 10ms com o timer0.

Dados: clock = 4Mhz; tempo=10ms; prescaler=?; valor do timer0?

Assim devemos escolher um valor de prescaler e determinar o valor de TMR0.

Escolhendo prescaler = 128, teremos:

t = ciclo de máquina * prescaler * contagem ( 256 - TMR0 );

10ms = 1us * 128 *(256-TMR0)


78,125 = 256-TMR0
TMR0 = 177,875

Como o valor do timer0 só pode ser inteiro escolhemos 178 e assim teremos:

t = 1us *128 *(256-178)

t = 9,984ms

Exemplo de projeto – piscar led a cada 10ms

#define led gpio.b5

void main()
{

20
TRISIO = 0b11011111; //define gp5 como saída
CMCON = 0b00000111; //desliga comparadores
ANSEL = 0; //desliga ADC
option_reg = 0b10000110; //clock interno, prescaler 1:128,pullup desabilitado
led = 0; //desliga led
tmr0= 178; /*carrega valor de tmr0 10ms = 1us * 128 *(256-TMR0)
78,125 = 256-TMR0
TMR0 = 177,875
*/

while(1)
{
if(tmr0 == 0) // se tmr0 estourou
{
led =!led; //inverte estado do led
tmr0=178; //carrega tmr0 para contar novamente
}
}

7º Timer1
8º Interrupções
9º Watchdog timer e Modo sleep

21
PIC 16F628A

2.4 Características:

- 18 pinos, facilitando a montagem;


- Até 16 portas configuráveis como entrada ou saída e 2 osciladores internos (4 MHz e
37KHz);
- 10 interrupções disponíveis;
- Memória de programação FLASH, que permite a gravação do programa diversas
vezes;
- Memória EEPROM(não volátil);
- Recursos adicionais:módulo CCP,comparadores e USART;
- Temperatura de trabalho -40ºC até +125ºC
- Tensão de trabalho 3.0V até +5.5V
- Corrente máxima de saída de um pino(quando em VDD) 25mA

2.5 Descrição dos pinos

2.6 EXEMPLOS

22
1 - Botão e led

O primeiro projeto será simples, possuindo apenas um botão e um led.O led será usado para
representar o estado do botão,isto é, acesso para o botão pressionado e apagado para o
botão solto.
O esquema elétrico está abaixo:

ESQUEMA 1

DEFINIÇÕES:

RA0= ENTRADA
RB5= SAÍDA

Observe que RA0 tem um resistor para o terra (resistor pull down), este tem a função de
manter o pino sempre em nível baixo, e quando o botão é pressionado a entrada vai para
nível alto.

void main()
{

23
CMCON = 0B00000111; // Desativa comparadores internos
// Para poder utilizar as portas RA0, RA1, RA2 e RA3

TRISA = 0B00000001; // Configura a porta RA0 como entrada


TRISB = 0B00000000; // Configura todo portb como saída

PORTB.RB5 = 0; // Inicia a porta RB5 em nível baixo

while(1)

{
if(PORTA.RA0 == 1)
{

PORTB.RB5 = 1; // Envia sinal alto para o led (Ligar)

}
else
{

PORTB.RB5 = 0; // Envia sinal baixo para o led (Desligar)

}
}
}

Neste exemplo a função PORTA.RA0, efetua a leitura da porta RA0. Se fossemos ler a
entrada RA5 por exemplo, escreveríamos PORTA.RA5.
A função PORTB.RB5 = 1;, coloca a saída RB5 em nível alto,ligando assim o led. Pelo
contrário, a função PORTB.RB5 = 0;, coloca a saída RB5 em nível baixo desligando o led. Da
mesma forma se quisermos acionar a saída RB3, basta escrever PORTB.RB3 = 1;.

A outra forma interessante é nomear os pinos utilizando a função #define, veja abaixo:

24
#define botao PORTA.RA0 // nomeia RA0 como botao
#define led PORTB.RB5 // nomeia RB5 como led

void main()
{

CMCON = 7; // Desativa comparadores internos


// Para poder utilizar as portas RA0, RA1, RA2 e RA3

TRISA.RA0 = 1; // Configura a porta RA0 como entrada


TRISB.RB5 = 0; // Configura a porta RB5 como saida

led = 0; // Inicia a porta RB5 em nível baixo

while(1)

{
if(botao == 1)
{

led = 1; // Envia sinal alto para o led (Ligar)

else
{
led = 0; // Envia sinal baixo para o led (Desligar)

}
}
}

Desta forma fica mais fácil o entendimento do programa.

Exercício1

Criar um programa que tenha três botões (b1, b2 e b3) e três leds (led1, led2 e led3).
Cada botão irá ligar o seu led.
Você deverá utilizar os seguintes pinos:
b1,b2 e b3 em RA2, RA3 e RA4.
led1, led2, led3 em RB4, RB5 e RB6
2 - Piscar led

Neste exemplo vamos piscar um led de 1 em 1 segundo usando a função delay.

25
#define led PORTB.RB5 // nomeia RB5 como led

void main()
{

CMCON = 7; // Desativa comparadores internos


// Para poder utilizar as portas RA0, RA1, RA2 e RA3

TRISB.RB5 = 0; // Configura a porta RB5 como saida

led = 0; // Inicia a porta RB5 em nível baixo

while(1)

led = 1; // Envia sinal alto para o led (Ligar)


delay_ms(1000); // Pausa de 1000 mili segundos
led = 0; // Envia sinal baixo para o led (Desligar)
delay_ms(1000); // Pausa de 1000 mili segundos

}
}

Importante ressaltar que quando o programa executa a função delay ele não pode realizar
outras funções, exceto se tiver uma interrupção.

Exercício2

a) Criar um programa que faça piscar um led de 0,3 em 0,3 segundos.

b) Criar um programa que faça ligar um led por 0,5 segundos e mantenha-o desligado por
0,1 segundos.

c) Criar um programa que faça dois leds piscarem juntos. Utilizar o RB3 para o segundo led.

3 - Piscar led com botão

A associação dos exemplos anteriores cria este.

26
Pressionando o botão o led pisca, soltando o botão o led apaga.

#define botao PORTA.RA0 // nomeia RA0 como botao


#define led PORTB.RB5 // nomeia RB5 como led

void main()
{

CMCON = 7; // Desativa comparadores internos


// Para poder utilizar as portas A0, A1, A2 e A3

TRISA.RA0 = 1; // Configura a porta RA0 como entrada


TRISB.RB5 = 0; // Configura a porta RB5 como saida

led = 0; // Inicia a porta RB5 em nível baixo

while(1)

{
if(botao == 1)
{
led = 1; // Envia sinal alto para o led (Ligar)
delay_ms(1000); // Pausa de 1000 mili segundos
led = 0; // Envia sinal baixo para o led (Desligar)
delay_ms(1000); // Pausa de 1000 mili segundos
}
else
{
led = 0; // Envia sinal baixo para o led (Desligar)
}
}
}

Exercício3

Criar um programa que tenha dois botões, sendo que o botao1 ativa o led1 que piscará de
0,5 em 0,5 seg e o botao2 ativa o led2 que piscará de 1 em 1 segundo.

4 - Botão de toque

Neste próximo exemplo, com um toque no botão o led liga com outro toque ele desliga,
veja:

27
#define botao PORTA.RA0 // nomeia RA0 como botao
#define led PORTB.RB5 // nomeia RB5 como led

void main()
{

CMCON = 7; // Desativa comparadores internos


// Para poder utilizar as portas A0, A1, A2 e A3

TRISA.RA0 = 1; // Configura a porta RA0 como entrada


TRISB.RB5 = 0; // Configura a porta RB5 como saida

led = 0; // Inicia a porta RB5 em nível baixo

while(1)

{
if(botao == 1)
{

led = !led; // Inverte o estado do atual do led


while(botao==1); //enquanto o botao estiver pres. nao faz nada
}
}
}

Exercício4

Criar um programa que ao pressionar o botão ligue todos os pinos ímpares do PORTB.
Ao pressionar novamente todos os pinos devem desligar.

5 - Corredor de leds
Neste exemplo um led fica aceso por vez e é deslocado criando a impressão de
movimento. Utilizaremos o operador <<(deslocamento a esquerda). Também existe o
deslocamento a direita(>>). Utilizamos também a função do compilador PORTX( ), que serve
para escrever um byte completo em uma porta do microcontrolador.
Para este exemplo vamos utilizar outro esquema eletrônico, veja abaixo:

28
int cont = 1; // Cria uma variável do tipo inteiro e armazena 1

void main()
{

CMCON = 7; // Desativa comparadores internos


// Para poder utilizar as portas RA0, RA1, RA2 e RA3
TRISB = 0X00; // Configura todas as portas RB como saida
PORTB = 0X00; // Inicia todas as portas RB em nível baixo

while(1)
{

PORTB = cont; // Escreve o valor de cont no PORTB = (0b00000001)


delay_ms(500); // Pausa de 500 mili segundos
cont = cont << 1; // desloca o bit 1 para esquerda PORTB = (0b00000010)
if(cont == 256) // se cont for igual a 256 ( 10000000)
{
cont = 1 ; //cont é igual a 1 e reinicia
}
}
}
6 - Contador de 0 á 9 com display

29
Este exemplo não utiliza nenhum botão ou chave e usa todo o PORTB do microcontrolador.
Nele é ligado um display de 7 segmentos de catodo comum que por consequência irá
reproduzir um contador de 0 á 9 que será repetido infinitamente.

Diagrama eletrônico:

int cont = 0; // Cria uma variável do tipo inteiro e armazena 0


int tabela[ ] = {
0b0111111, // número 0
0b0000110, // número1

30
0b1011011, // número2
0b1001111, // número3
0b1100110, // número4
0b1101101, // número5
0b1111100, // número6
0b0000111, // número7
0b1111111, // número8
0b1100111 // número9
};

void main()
{

//cada linha representa um número

CMCON = 7; // Desativa comparadores internos


// Para poder utilizar as portas RA0, RA1, RA2 e RA3
TRISB = 0X00; // Configura todas as portas RB como saida
PORTB = 0X00; // Inicia todas as portas RB em nível baixo

while(1)
{

PORTB = ( tabela[cont] ); //Escreve no PORTB o valor da posição cont da tabela


delay_ms(500); //Pausa 500 mili segundos
cont = cont + 1; //incrementa a variável cont
if(cont == 10) //Se cont for igual a 10, zera novamente
{
cont = 0;
}
}
}

7 – LCD

31
Conhecidos como LCD (liquid crystal display), tem como principal vantagem o baixo consumo
e a exibição de caracteres alfanuméricos em várias linhas e até mesmo de forma gráfica.Este
display possui 2 linhas por 16 colunas

1º exemplo
Este simples programa envia a mensagem “SENAI - 2016” para o LCD.

32
// INICIO CONFIGURAÇÕES DOS PINOS DO LCD 16X2

sbit LCD_RS at RB5_bit;


sbit LCD_EN at RB4_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB5_bit;
sbit LCD_EN_Direction at TRISB4_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

// FIM DAS CONFIGURAÇÕES DOS PINOS DO LCD 16X2

void main()
{

CMCON = 7; // Desativa comparadores internos


// Para poder utilizar as portas RA0, RA1, RA2 e RA3
TRISB = 0X00; // Configura todas as portas RB como saida

Lcd_Init(); //INICIALIZA O LCD 16X2

Lcd_Cmd(_LCD_CURSOR_OFF); // DESATIVA CURSOR


Lcd_Cmd(_LCD_CLEAR); // LIMPA O DISPLAY

while(1)
{

Lcd_Out(1,2,"SENAI - 2019");
// Escreve “SENAI – 2019” na 1ª linha a partir da 2ª coluna

}
}

33

Você também pode gostar