Buscar

Arquivo 3 Apostila PIC16f877a MikroC Imprimir pag 1 até 10 (1)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 27 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 27 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 27 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

CEETEPS 
 
 
 
 
 
Introdução à Linguagem C para 
Microcontroladores PIC 
 
 
 
 
Prof. Fabiano Magalhães Galvão 
galvão.professor@gmail.com 
 
 
 
 
 
 
 
 
 
 
SÃO PAULO 
2012 
 
2 
REV 0.1 31/05/12 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Introdução à Linguagem C para Microcontroladores PIC 
Compilador MicroC, 8.2.0.0 
Autor: Prof. Fabiano M. Galvão 
Email: galvão.professor@gmail.com 
 
3 
REV 0.1 31/05/12 
SUMARIO 
1 INTRODUÇÃO ........................................................................................... 5 
2 INTRODUÇÃO À LINGUAGEM C .............................................................. 6 
2.1 Tipos e declaração de variáveis ................................................................... 6 
2.2 Constantes simbólicas .................................................................................. 7 
2.3 Operador de Atribuição ( = ) ......................................................................... 7 
2.4 Operadores Aritméticos ................................................................................ 7 
2.5 Operadores Incremental “ ++ ” e Decremental “ - - ” ..................................... 7 
2.6 Operadores Relacionais ............................................................................... 8 
2.7 Operadores Lógicos Relacionais .................................................................. 8 
2.8 Operadores Lógicos bit-a-bit ......................................................................... 8 
3 ESTRUTURAS DE CONTROLE ................................................................ 8 
3.1 Do – while ..................................................................................................... 9 
3.2 While ............................................................................................................. 9 
3.3 For ................................................................................................................ 9 
3.4 If – else ......................................................................................................... 9 
3.5 If .................................................................................................................. 10 
3.6 Botaoitch – case ......................................................................................... 10 
4 EXERCÍCIOS ........................................................................................... 11 
4.1 Botão e Led ................................................................................................ 11 
4.2 Delay ........................................................................................................... 12 
4.3 Pisca Port D com tempo programável ........................................................ 13 
4.4 Rotação de Bits........................................................................................... 14 
4.5 Motor de Passo ........................................................................................... 15 
4.6 Botão com Filtro (Debounce) ...................................................................... 17 
4.7 Buzzer ......................................................................................................... 18 
4.8 Display 7 Segmentos – 01 x Display ........................................................... 19 
4 
REV 0.1 31/05/12 
4.9 Display 7 segmentos – 04 x Display (Implementando!) .............................. 20 
4.10 LCD – Exemplo 1 .................................................................................... 20 
4.11 LCD – Exemplo 2 .................................................................................... 21 
4.12 PWM ........................................................................................................ 24 
4.13 ADC ......................................................................................................... 25 
4.14 Interrupções (Implementando!) ................................................................ 26 
4.15 Timers (Implementando!) ......................................................................... 27 
5 PROJETO ................................................................................................ 27 
5 
REV 0.1 31/05/12 
 
 
 
1 INTRODUÇÃO 
 
Abordo nesta apostila conteúdo necessário para que o aluno dê seus primeiros 
passos na programação em Linguagem C para microcontroladores. 
Todos os exemplos desta apostila foram criados para o Kit Didático montado em 
sala de aula com o microcontrolador PIC16F877A. 
O compilador utilizado é o MikroC versão 8.2.0.0 fornecido pela empresa 
Mikroeletronica. 
 
6 
REV 0.1 31/05/12 
2 INTRODUÇÃO À LINGUAGEM C 
 
A Linguagem C é utilizada para programação de microcontroladores assim como 
a linguagem assembly. A vantagem sobre a linguagem assembly é que este último é 
muito custoso sua programação, já a linguagem C, possui sintaxes muito mais simples, 
porém, poderosa o que nos beneficia com menor tempo de programação. Além disso, 
uma programação feita para um tipo de microcontrolador é fácil migrar para outro 
microcontrolador de outra família ou fabricante, o que em assembly tornaria muito difícil 
essa migração pois cada fabricante de microcontrolador tem uma linguagem assembly 
diferente. 
 
2.1 Tipos e declaração de variáveis 
Segue tabela de variáveis que podem ser declaradas. 
 
TYPE SIZE RANGE 
unsigned char 8 bit 0 .. 255 
signed char 8 bit -128 .. 127 
signed short int 8 bit -128 .. 127 
unsigned short int 8 bit 0 .. 255 
signed int 16 bit -32768 .. 32767 
unsigned int 16 bit 0 .. 65535 
signed long int 32 bit -2147483648 .. 2147483647 
unsigned long int 32 bit 0 .. 4294967295 
float 32 bit ±1.17549435082e-38 .. ±6.80564774407e+38 
double 32 bit ±1.17549435082e-38 .. ± 6.80564774407e+38 
long double 32 bit ±1.17549435082e-38 .. ± 6.80564774407e+38 
 
Exemplo: 
unsigned short int tempo, conta_peca, x; 
unsigned char texto1, texto2; 
unsigned short int y = 128; 
char *mensagem1 = “ ETEC – SP ” 
 
7 
REV 0.1 31/05/12 
2.2 Constantes simbólicas 
Sintaxe: 
#define nome valor 
Exemplos: 
#define PORD LCD 
#define ON 1 
#define OFF 0 
#define PORTB.F0 tecla1 
2.3 Operador de Atribuição ( = ) 
Exemplos: 
 
conta_pecas = 0; 
i = 12; 
Max = 15; 
Min = 0; 
 
2.4 Operadores Aritméticos 
Operador Operação 
+ Adição 
- Subtração 
* Multiplicação 
/ Divisão 
% Módulo (Resto da divisão de números inteiros) 
 
2.5 Operadores Incremental “ ++ ” e Decremental “ - - ” 
++ var equivale à var = var + 1 
var ++ equivale à var = var + 1 
-- var equivale à var = var – 1 
var -- equivale à var = var – 1 
Veja os exemplos: 
Int a, b, c, i = 3; // a = ?, b = ?, c = ?, i = 3; 
a = i++; // a = 3, b = ?, c = ?, i = 4 
b = ++i; // a = 3, b = 5, c = ?, i = 5 
c = --i; // a = 3, b = 5, c = 4, i = 4 
8 
REV 0.1 31/05/12 
2.6 Operadores Relacionais 
Operador Operação 
> Compara se maior que 
< Compara se menor que 
>= Compara se maior ou igual a 
<= Compara se menor ou igual a 
== Compara se igual a 
!= Compara se diferente de 
 
2.7 Operadores Lógicos Relacionais 
Operador Operação 
&& AND 
|| OR 
! NOT 
2.8 Operadores Lógicos bit-a-bit 
Operador Operação 
& AND 
| OR 
^ OU EXCLUSIVO (XOR) 
~ Complemento (NOT) 
>> Deslocamento à direita 
<< Deslocamento à esquerda 
 
3 ESTRUTURAS DE CONTROLE 
 
Serve para executar um bloco, ou ainda, não executar um bloco de programação 
conforme condição imposta. Você ainda pode repetir o mesmo bloco n vezes. 
9 
REV 0.1 31/05/12 
3.1 Do – while 
Exemplo: 
do 
{ 
PORTD++; 
DELAY_MS(1000); 
}while (PORTD<0XFF);3.2 While 
Exemplo: 
 While (TECLA) 
 { 
 LED = 0; 
 } 
3.3 For 
Sintaxe: 
For (inicialização da variável; condição; incremento) 
{ 
Bloco de funções 
} 
 
Exemplo: 
For ( i=0; i<=3; i++) 
{ 
LED = 1; 
DELAY_MS(1000); 
} 
3.4 If – else 
Exemplo: 
10 
REV 0.1 31/05/12 
if (!BOTAO1) 
{ 
LED1 = 1; 
 } 
else LED1=0; 
 
3.5 If 
Exemplo: 
if (!BOTAO1) 
{ LED1 = 1; } 
 
3.6 Switch – case 
 Switch (i) 
 { 
 case 0 : return 0x3F; 
 case 1 : return 0x06; 
 case 2 : return 0x5B; 
 case 3 : return 0x4F; 
 case 4 : return 0x66; 
 case 5 : return 0x6D; 
 case 6 : return 0x7D; 
 case 7 : return 0x07; 
 case 8 : return 0x7F; 
 case 9 : return 0x6F; 
 } //case end 
 
 
 
11 
REV 0.1 31/05/12 
4 EXERCÍCIOS 
4.1 Botão e Led 
/* 
Botao.c 
Descrição: Firmware que acende um led ao pressionar um botão. 
Data: 26/01/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
*/ 
 
//ENTRADAS 
#define BOTAO1 portb.f0 
 
//SAIDAS 
#define LED1 portd.f0 
 
//Subrotinas (Funções) 
void Config () // Configuração dos ports em uso e inicialização de variáveis. 
{ 
 TRISB=0b00000001; // Bits 7...4 como saida e Bits 3...0 como entradas (PORTB) 
 TRISD=0; // Todos os pinos configurados como saída do PORTD 
 PORTD=0X00; // inicialização do PORTD 
} 
 
 
void main() 
{ 
 config (); //Chama e executa a função "config" 
 
 while(1) // Loop infinito 
 { 
 if (!BOTAO1) LED1 = 1; //Ao pressionar o botão o led acende se não, o led apaga 
 else LED1=0; 
 } 
 
} 
 
/* 
Exercícios: 
Obs: Para todos os exercícios não esqueça de configurar os ports utilizados. 
 
1) Inverta a lógica do led; 
2) Analise as linhas de programação a seguir e explique o como o circuito se comportará: 
 
if (BOTAO1) LED1 = 1; 
else LED1=0; 
 
3)Acrescente mais 3 botões, totalizando 4, com as seguintes funções 
 
BOTAO1: Ao pressionar liga o LED1; 
BOTAO2: Ao pressionar desliga o LED2; 
BOTAO3: Ao pressionar liga os LEDS 3 e 4; 
BOTAO4: Liga TODO o PORTD. 
*/ 
 
 
 
12 
REV 0.1 31/05/12 
4.2 Delay 
/*Delay.c 
Descrição: Delay (Atraso). Ao pressionar o botão BOTAO1, o led 1 acenderá por 3 segundos e apagará 
Data: 26/01/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
*/ 
 
//ENTRADAS 
#define BOTAO1 portb.f0 
 
//SAIDAS 
#define LED1 portd.f0 
 
//Subrotinas (Funções) 
void Config () 
{ 
 TRISB=0b00000001; 
 TRISD=0; 
 PORTB=0X00; 
 PORTD=0X00; 
 } 
 
main() 
{ 
 config (); 
 
 while(1) 
 { 
 if (!BOTAO1) 
 { 
 LED1 = 1; 
 DELAY_MS(3000); 
 } 
 
 else LED1=0; 
 
 } 
 
} 
 
/* 
Exercícios; 
 
1) Altere os tempos; 
2) Faça um pisca-pisca com o led; 
3) Faça o PORTD inteiro piscar. Consulte o esquemático antes de programar, pois, você precisará utilizar 
um Display de 7 segmentos para visualizar; 
4) Analise o trecho do programa a seguir e implemente-o no exercício 3: 
 
while (!BOTAO1) 
 { 
 PORTD = ~PORTD; 
 delay_ms (500); 
 } 
5) Mantenha o led piscando e crie duas teclas, UP e DOWN, para aumentar ou diminuir a freqüência do led. 
 
*/ 
 
 
13 
REV 0.1 31/05/12 
4.3 Pisca Port D com tempo programável 
/*Pisca_port.c 
Descrição: Pisca o port d com o tempo programado entre os valores MAX e MIN. 
Data: 27/03/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
*/ 
 
//ENTRADAS 
#define TCL_DOWN portb.f0 
#define TCL_UP portb.f1 
 
//SAIDAS 
#define LED1 portd.f0 
 
//CONSTANTES 
#define MAX 1000 
#define MIN 100 
 
//VARIÁVEIS GLOBAIS 
unsigned int tempo; 
 
 
//Subrotinas (Funções) 
void Config () 
{ 
 TRISB=0b00000011; 
 TRISD=0; 
 PORTB=0X00010000; //Liga Transistor do Display 1 
 PORTD=0XFF; 
 tempo = 500; 
 } 
 
main() 
{ 
 config (); 
 
 while(1) 
 { 
 PORTB.F4 = ~PORTB.F4; 
 vdelay_ms(tempo); 
 
14 
REV 0.1 31/05/12 
 if(!TCL_UP) 
 { 
 delay_ms(10); 
 if(!TCL_UP) 
 { 
 tempo = tempo-100; 
 if(tempo<MIN) tempo = MIN; 
 } 
 } 
 
 if(!TCL_DOWN) 
 { 
 delay_ms(10); 
 if(!TCL_DOWN) 
 { 
 tempo = tempo+100; 
 if(tempo>MAX) tempo = MAX; 
 } 
 
 } 
 
 }//FIM DO LOOP INFINITO 
}//FIM DO MAIN 
 
/* 
Exercícios; 
 
1) Estude o programa e altere os tempos máximo e minimo; 
 
*/ 
4.4 Rotação de Bits 
/* 
Rotacao-bit.c 
Descrição: Rotaciona os bits para esquerda e direita ao pressionar as teclas TCL1 e TCL2. 
Data: 22/03/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
*/ 
//ENTRADAS 
#define TCL1 portb.f0 
#define TCL2 portb.f1 
//SAIDAS 
//VARIAVEIS 
unsigned short shifter; 
//Subrotinas (Funções) 
void Config () // Configuração dos ports em uso e inicialização de variáveis. 
 { 
15 
REV 0.1 31/05/12 
 TRISB=0b00001111; // Bits 7...4 como saida e Bits 3...0 como entradas (PORTB) 
 TRISD=0; // Todos os pinos configurados como saída do PORTD 
 PORTD=0X00; // inicialização do PORTD 
 PORTB=0B00010000; 
 SHIFTER =0x01; 
 } 
void main() 
{ 
config (); //Chama e executa a função "config" 
while(1) // Loop infinito 
 { 
 while(!TCL1) 
 { 
 if(shifter==0b10000000) 
 { 
 PORTD = shifter; 
 SHIFTER=1; 
 delay_ms(250); 
 } 
 else 
 { 
 PORTD = shifter; 
 shifter <<= 1; 
 delay_ms(250); 
 } 
 } 
 if(!TCL2) 
 { 
 if(shifter==0b00000001) 
 { 
 PORTD = SHIFTER; 
 SHIFTER=0b10000000; 
 DELAY_MS(250); 
 } 
 else 
 { 
 PORTD = shifter; 
 shifter >>= 1; 
 delay_ms(250); 
 } 
 
 } 
 } //fim do loop infinito 
} //fim do main 
 
/* 
Exercícios; 
 
1) Crie botões UP e Down para alterar a freqüência de rotação dos bits. Defina também um valor máximo e 
um valor mínimo para a freqüência de rotação. 
 
*/ 
 
4.5 Motor de Passo 
/* 
Motordepasso.c 
Descrição: Ao pressionar a tecla TCL1 o motor gira no sentido horário. Ao pressionar a tecla TCL2 o motor 
gira no sentido anti-horario. 
Data: 27/01/12 
16 
REV 0.1 31/05/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
*/ 
//ENTRADAS 
#define TCL1 portb.f0 
#define TCL2 portb.f1 
 
//SAIDAS 
unsigned short shifter; 
 
//Subrotinas (Funções) 
void Config () // Configuração dos ports em uso e inicialização de variáveis. 
{ 
 TRISB = 0b00001111; // Bits 7...4 como saida e Bits 3...0 como entradas (PORTB) 
 TRISC = 0; // Todos os pinos configurados como saída do PORTD 
 PORTC = 0b00000011; // inicialização do PORTD 
 PORTB = 0B00010000; // inicialização do PORTB 
 Shifter = 0b00000011; // inicialização da variável shifter 
} 
 
 
void main() 
{ 
 config(); //Chama e executa a função "config" 
 
 while(1) // Loop infinito 
 { 
 
 while(!TCL1) //Shift à esquerda 
 { 
 shifter <<= 1; 
 
 if(shifter==0b00011000) 
 { 
 shifter=0b00001001; 
 } 
 
 if(shifter==0b00010010) 
 { 
 shifter=0b00000011; 
 } 
 portc=shifter; 
 delay_ms(500); 
 
 } 
 
while(!TCL2) //Shift à direita 
 { 
 shifter >>= 1; 
 
 if(shifter==0b00000001) 
 { 
 shifter=0b00001001; 
 } 
 
 if(shifter==0b00000100) 
 { 
 shifter=0b00001100; 
 } 
 portc=shifter; 
 delay_ms(500); 
 
 } 
 
 } //fim do loop infinito 
 
17 
REV 0.1 31/05/12 
}// fim do main 
/* 
Exercícios 
1)Implemente as seguintes funções 
BOTAO3: Aumenta velocidade. 
BOTAO4: Diminui velocidade do motor. 
 
Obs: Crie uma variável 
 
2)Descubra quantos passos são necessários para o motor completar 1 (uma) volta e modifique o programa 
anterior para que o motor dê apenas uma volta ao pressionar os botões BOTAO1 e BOTAO2;*/ 
 
 
4.6 Botão com Filtro (Debounce) 
/* 
Debounce.c 
Descrição: Botão com filtro debounce. 
Data: 26/01/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
*/ 
 
//ENTRADAS 
#define BOTAO1 portb.f0 
#define BOTAO2 portb.f1 
#define BOTAO3 portb.f2 
#define BOTAO4 portb.f3 
 
//SAIDAS 
#define LED1 portd.f0 
#define LED2 portd.f1 
#define LED3 portd.f2 
#define LED4 portd.f3 
 
void Config () 
{ 
 TRISB=0b00001111; 
 TRISD=0; 
 PORTD=0X00; 
} 
 
main() 
{ 
 config (); 
 
 while(1) 
 { 
 if (!BOTAO1) 
 { 
 delay_ms(200); 
 if(!BOTAO1) LED1 = 1; 
 else LED1 = 0; 
 } 
 else LED1=0; 
 
 
 if (!BOTAO2) 
 { 
 delay_ms(200); 
 if(!BOTAO2) LED2 = 1; 
 else LED2 = 0; 
 } 
18 
REV 0.1 31/05/12 
 else LED2=0; 
 
 
 if (!BOTAO3) 
 { 
 delay_ms(250); 
 if(!BOTAO3) LED3 = 1; 
 else LED3 = 0; 
 } 
 else LED3=0; 
 
 
 if (!BOTAO4) 
 { 
 delay_ms(250); 
 if(!BOTAO4) LED4 = 1; 
 else LED4 = 0; 
 } 
 else LED4=0; 
 } 
} 
 
/* 
Exercícios; 
1) Crie uma constante para substituir o tempo do filtro Debounce; 
2) Altere o tempo do filtro Debounce e explique seu efeito. 
*/ 
 
 
4.7 Buzzer 
/* 
buzzer.c 
 
Descrição: Ao pressionar um botão o Buzzer toca. 
Data: 26/01/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
*/ 
 
//ENTRADAS 
#define BOTAO1 portb.f0 
#define BOTAO2 portb.f1 
 
//SAIDAS 
#define BUZZER porta.f5 
 
//Subrotinas (Funções) 
void Config () 
{ 
 TRISA=0b11011111; 
 TRISB=0b00000011; 
 TRISD=0; 
 
 PORTA=0; //Clear PORTA 
 PORTB=0X00; //Clear PORTB 
 PORTD=0B00000000; //Clear PORTD 
 
 ADCON1=7; // Configura RA0, RA1 e RA3 como Analogicos e RA2, RA4, RA5, RE0...RE2 como Digitais 
 } 
19 
REV 0.1 31/05/12 
 
 
main() 
{ 
 config (); 
 
 while(1) 
 { 
 BUZZER=0; 
 
 if (!BOTAO1) 
 { 
 BUZZER = 1; 
 DELAY_MS(2000); 
 } 
 
 while (!BOTAO2) 
 { 
 BUZZER = 0; 
 DELAY_US(250); 
 BUZZER =1; 
 DELAY_US(250); 
 }// t_on = 250us 
 //t_off= 250us 
 //t_on + t_off = 0,5ms = 2kHz. 
 } 
} 
/* 
Exercícios; 
 
1)Altere a frequência para 3kHz. Demonstre os cálculos. 
2)Altere os tempos t_on e t_off sendo que t_on ≠ t_off mas a freqüência continue 3kHz. 
*/ 
 
4.8 Display 7 Segmentos – 01 x Display 
/* 7SegDisplay.c 
 
Descrição: Contador em um Display de 7 segmentos. 
Data: 30/01/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
*/ 
 
void config() 
{ 
 INTCON = 0; // Desabilita interrupções GIE, PEIE,INTE,RBIE,T0IE 
 PORTB = 0B00010000; // Liga o Display 1. 
 TRISB = 0; 
 PORTD = 0; 
 TRISD = 0; 
} 
 
 
unsigned short mascara(unsigned short num) 
{ 
 botaoitch (num) 
 { 
 case 0 : return 0x3F; 
 case 1 : return 0x06; 
 case 2 : return 0x5B; 
 case 3 : return 0x4F; 
20 
REV 0.1 31/05/12 
 case 4 : return 0x66; 
 case 5 : return 0x6D; 
 case 6 : return 0x7D; 
 case 7 : return 0x07; 
 case 8 : return 0x7F; 
 case 9 : return 0x6F; 
 } //case end 
}//~ 
 
 
unsigned short i; 
 
void main() 
 
{ 
 
Config(); 
 
 do { 
 for (i = 0; i <= 9u; i++) { 
 PORTB = 0; // Desliga todos os displays de 7 segmentos 
 PORTD = mascara(i); // Busca valor para disponibilizar no PORTD 
 PORTB = 0B00010000; // Liga um Display de 7 segmentos 
 Delay_ms(500); 
 } 
 } while (1); //Fim do loop infinito 
} 
 
/* 
Exercícios 
1)Implemente contagem de 0x0 a 0xF; 
2)Implemente um contador que incrementa seu valor (0x0 à 0xF) ao pressionar a tecla BOTAO1 e 
decrementa ao pressionar a tecla BOTAO2. 
3)Igual ao exercício anterior, contudo, utilize o debounce para programação das teclas. 
*/ 
 
4.9 Display 7 segmentos – 04 x Display (Implementando!) 
Programa em desenvolvimento. 
4.10 LCD – Exemplo 1 
/*Lcd.c 
 
Descrição: Rotinas para escrever no LCD. 
Data: 26/01/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
*/ 
 
//ENTRADAS 
#define BOTAO1 portb.f0 
#define BOTAO2 portb.f1 
 
//SAIDAS 
#define BUZZER porta.f5 
21 
REV 0.1 31/05/12 
 
//Variáveis 
 // "0123456789abcdef" 
 char *texto = " E T E C - S P "; 
 
 
//Subrotinas (Funções) 
void config() 
{ 
 TRISA = 0b11011111; 
 TRISB = 0b00000011; 
 TRISD = 0; 
 TRISE = 0; 
 
 ADCON1=7; // Configura RA0, RA1 e RA3 como Analógicos e RA2, RA4, RA5, RE0...RE2 como Digitais 
 
PORTA = 0; 
PORTB = 0; 
PORTD = 0; 
PORTE = 0; //Limpa todos os Ports utilizados 
 
//Configura LCD 
 Lcd8_config(&PORTE, &PORTD, 0,2,1,7,6,5,4,3,2,1,0); 
 Lcd8_Init(&PORTE, &PORTD); 
 Lcd8_Cmd(LCD_CURSOR_OFF); //Desliga cursor 
} 
 
 
 void tela_inicial() 
 { 
 Lcd8_Out(1, 1,"Kit PIC 16F877A"); 
 Lcd8_Out(2, 1,"Prof. Fabiano G."); 
 delay_ms(1000); 
 Lcd_Cmd(Lcd_CLEAR); 
 } 
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
void main() 
{ 
 config (); 
 tela_inicial(); 
 
 
 Lcd8_Out(1, 2, texto); // Escreve na coluna 1, linha 2. 
 //01234567890abcdef 
 Lcd8_Out(2, 1, "*ELETRONICA !!!*"); // Escreve na linha 2, coluna 1 
} 
 
/* 
Exercícios 
 
1) Faça um programa que informe qual tecla foi pressionada. 
 
*/ 
4.11 LCD – Exemplo 2 
/*lcd-teclas.c 
 
Descrição: LCD e teclas. 
Data: 27/01/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
22 
REV 0.1 31/05/12 
*/ 
 
 
//DECLARAÇÃO DE VARIÁVEIS 
 
 //1234567890ABCDEF 
char *msg_teclapress1 = "Voce pressionou"; 
char *msg_teclapress2 = "a tecla:"; 
 
unsigned short int flag_tela_princ, tecla_press; 
 
 
//ENTRADAS 
#define BOTAO1 portb.f0 
#define BOTAO2 portb.f1 
#define BOTAO3 portb.f2 
#define BOTAO4 portb.f3 
 
//SAIDAS 
#define LED1 portd.f0 
#define LED2 portd.f1 
#define LED3 portd.f2 
#define LED4 portd.f3 
 
 
//Subrotinas (Funções) 
void Config () 
{ 
 TRISA = 0b11011111; 
 TRISB = 0b00000011;TRISD = 0; 
 TRISE = 0; 
 
 ADCON1=7; // Configura RA0, RA1 e RA3 como Analogicos e RA2, RA4, RA5, RE0...RE2 como Digitais 
 
 PORTA = 0; //Clear PORTA 
 PORTB = 0; //Clear PORTB 
 PORTD = 0; //Clear PORTD 
 PORTE = 0; //Clear PORTE 
 
//Configura LCD 
 Lcd8_config(&PORTE, &PORTD, 0,2,1,7,6,5,4,3,2,1,0); 
 Lcd8_Init(&PORTE, &PORTD); 
 Lcd8_Cmd(LCD_CURSOR_OFF); //Desliga cursor 
 
//Inicialização de variáveis 
 flag_tela_princ = 0; 
 tecla_press = 0; 
} 
 
 
void teclado () 
{ 
if (!BOTAO1) 
 { 
 delay_ms(1); 
 if(!BOTAO1) 
 { 
 tecla_press = 1; 
 lcd8_cmd(lcd_clear); 
 Lcd8_Out(2, 14, " 1 "); 
 } 
 } 
 
 
 
 if (!BOTAO2) 
23 
REV 0.1 31/05/12 
 { 
 delay_ms(1); 
 if(!BOTAO2) 
 { 
 tecla_press = 1; 
 lcd8_cmd(lcd_clear); 
 Lcd8_Out(2, 14, " 2 "); 
 } 
 } 
 
 
 
 if (!BOTAO3) 
 { 
 delay_ms(1); 
 if(!BOTAO3) 
 { 
 tecla_press = 1; 
 lcd8_cmd(lcd_clear); 
 Lcd8_Out(2, 14, " 3 "); 
 } 
 } 
 
 
 
 if (!BOTAO4) 
 { 
 delay_ms(1); 
 if(!BOTAO4) 
 { 
 tecla_press = 1; 
 lcd8_cmd(lcd_clear); 
 Lcd8_Out(2, 14, " 4 "); 
 } 
 } 
 
 
} 
 
void tela_principal() 
{ //1234567890ABCDEF 
Lcd8_Cmd(Lcd_CLEAR); 
Lcd8_Out(1, 1, "E T E C - S P"); // Escreve na linha 1, coluna 2 
Lcd8_Out(2, 1, "Press. uma tecla"); 
flag_tela_princ = 1; 
} 
 
void tela_tecla_press() 
{ 
Lcd8_Out(1, 1, msg_teclapress1); // Escreve na linha 1, coluna 1 
Lcd8_Out(2, 1, msg_teclapress2); // Escreve na linha 2, coluna 1 
} 
 
main() 
{ 
 config (); 
 //1234567890BCDEF" 
 Lcd8_Out(1, 1,"Kit PIC 16F877A"); 
 Lcd8_Out(2, 1,"Prof. Fabiano G"); 
 delay_ms(1000); 
 
 while(1) 
 { 
 if(!flag_tela_princ) tela_principal(); 
 
 teclado (); 
 
24 
REV 0.1 31/05/12 
 if(tecla_press) 
 { 
 tela_tecla_press(); 
 delay_ms (1500); 
 tecla_press = 0; 
 flag_tela_princ = 0; 
 } 
 
 } 
} 
 
4.12 PWM 
/* 
PWM.C 
 
Descrição: Exemplo de acionamento 
Data: 26/01/12 
Autor: Fabiano M. Galvão 
PIC16F877A 
Compilador MikroC for Pic 8.2.0.0 
*/ 
 
unsigned short duty_atual, duty_anterior; 
 
void InitMain() { 
 PORTB = 0; 
 TRISB = 0b00001111; // Configuração dos pinos do PortB 
 
 PORTD = 0; 
 TRISD = 0; 
 
 ADCON1 = 7; // Configura RA0, RA1 e RA3 como Analógicos e RA2, 
 
RA4, RA5, 
 // RE0...RE2 como Digitais 
 
 PORTC = 0; 
 TRISC = 0; 
 PWM1_Init(5000); //Inicializa PWM à 5kHz. 
} 
 
 
void main() { 
 
 int duty_atual; 
 
 initMain(); 
 
 
 duty_atual = 127; // Inicializa PWM com duty = 50% 
 duty_anterior = 0; // Variável que armazena valor do duty anterior 
 PWM1_Start(); // Liga PWM1 
 
 while (1) { 
 
 if (Button(&PORTB, 0,1,0)) //Sintaxe: "Button(&Portx, pino, 
 
debounce, ativo em 0 ou 1)" 
 duty_atual++ ; //Incrementa duty 
 
 if (Button(&PORTB, 1,1,0)) 
 duty_atual-- ; //Decrementa duty 
 
25 
REV 0.1 31/05/12 
 if (Button(&PORTB, 2,1,0)) 
 duty_atual = 100; //Duty cycle = 39% 
 
 if (Button(&PORTB, 3,1,0)) 
 duty_atual = 250; //Duty cycle = 98% 
 
 
 if (duty_anterior != duty_atual) { 
 PWM1_Change_Duty(duty_atual); 
 duty_anterior = duty_atual; 
 PORTD = duty_anterior; 
 } 
 Delay_ms(200); // slow down change pace a little 
 } //Fim do loop infinito 
} //Fim do Main 
 
/* 
Exercícios 
 
1)Altere o debounce e explique o que você notou de diferente. 
 
2)Altere o pino de saída do PWM e a sua frequência. 
 
3) Sabendo que o comando "PWMx_Change_Duty" altera o duty cicle e que 
o parâmetro está entre 0 e 255, ou seja, 0 = 0%, 127 = 50% e 255 = 
 
100%, 
faça um programa que ao pressionar: 
 
BOTAO3, duty cycle = 33% 
BOTAO4, duty cycle = 75% 
 
As teclas BOTAO1 e BOTAO2 devem continuar com a mesma função. 
 
Mostre os cálculos ao professor. 
 
4) Acrescente um comando para desligar o PWM. Procure o comando na aba 
 
Qhelp, 
lado superior esquerdo do ambiente de programação. 
 
*/ 
 
4.13 ADC 
/* 
 * Project name: 
 ADC_on_LCD (Displaying ADC result on LCD) 
 * Copyright: 
 (c) MikroElektronika, 2005-2008. 
 * Description: 
 This code demonstrates how to use library function ADC_read, and library 
 procedures and functions for LCD display (4 bit interface). 
 * Test configuration: 
 MCU: PIC16F877A 
 Dev.Board: EasyPIC5 
 Oscillator: HS, 08.0000 MHz 
 Ext. Modules: LCD 
 BOTAO: mikroC v8.0 
 * NOTES: 
 None. 
*/ 
 
unsigned char ch; 
26 
REV 0.1 31/05/12 
unsigned int adc_rd; 
char *text; 
long tlong; 
 
void main() { 
 TRISA = 0B00000011; 
 TRISE = 0; 
 
 
 INTCON = 0; // disable all interrupts 
 ADCON1 = 0X84;//0x84;//0x82; // configure VDD as Vref, and analog channels 
 
 
 
 //Configura LCD 
 Lcd8_config(&PORTE, &PORTD, 0,2,1,7,6,5,4,3,2,1,0); 
 Lcd8_Init(&PORTE, &PORTD); 
 Lcd8_Cmd(LCD_CURSOR_OFF); //Desliga cursor 
 lcd8_cmd(lcd_clear); 
 
 
 
 text = "mikroElektronika"; // assign text to string 
 LCD8_Out(1,1,text); // print string a on LCD, 1st row, 1st column 
 text = "LCD example"; // assign text to string 
 LCD8_Out(2,1,text); // print string a on LCD, 2nd row, 1st column 
 
 
 Delay_ms(2000); 
 lcd8_cmd(lcd_clear); 
 
 text = "voltage:"; // assign text to string 
 while (1) { 
 adc_rd = ADC_read(0); //0 = Canal AN0 // get ADC value from 2nd channel 
 LCD8_Out(2,1,text); // print string a on LCD, 2nd row, 1st column 
 
 tlong = (long)adc_rd * 5000; // covert adc reading to milivolts 
 tlong = tlong / 1023; // 0..1023 -> 0-5000mV 
 
 ch = tlong / 1000; // extract volts digit 
 LCD8_Chr(2,9,48+ch); // write ASCII digit at 2nd row, 9th column 
 LCD8_Chr_CP('.'); 
 
 ch = (tlong / 100) % 10; // extract 0.1 volts digit 
 LCD8_Chr_CP(48+ch); // write ASCII digit at cursor point 
 
 ch = (tlong / 10) % 10; // extract 0.01 volts digit 
 LCD8_Chr_CP(48+ch); // write ASCII digit at cursor point 
 
 ch = tlong % 10; // extract 0.001 volts digit 
 LCD8_Chr_CP(48+ch); // write ASCII digit at cursor point 
 LCD8_Chr_CP('V'); 
 
 Delay_ms(1); 
 } 
} 
 
4.14 Interrupções (Implementando!) 
Programa em desenvolvimento. 
27 
REV 0.1 31/05/12 
4.15 Timers (Implementando!) 
Programa em desenvolvimento. 
5 PROJETO 
Neste capítulo, os alunos devem apresentar um projeto utilizando-se dos 
conceitos adquiridos no desenvolvimento da disciplina. 
O projeto será constituído por: 
1. Documentação contendo descrição de projeto, fluxograma, esquema 
elétrico, programa fonte e outros que julgar necessário; 
2. O programa fonte deverá ser entregue digitalmente ao professor sem 
erros de compilação. 
 
Será avaliado a documentação e o funcionamento do projeto na prática.

Continue navegando