Você está na página 1de 32

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

Apostila
Microcontroladores PIC
Programando em C

Professores
Fabio Caldas
&
Marcos Felipe
Prof. Fabio Caldas & Marcos Felipe

Pgina 1

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/******************ESSE EXEMPLO BUSCA MOSTRAR A ESTRUTURA BSICA****************


******************* DE UM PROGRAMA Em "C" PARA CONTROLADORES PIC***************/
#INCLUDE <16F877.H> /******** AQUI ESPECIFICADO O CONTROLADOR A SER UTILIZADO
PELO PROJETO. SE PRECISARMOS TROCAR O CONTROLADOR, BASTA INFORMAR NESTA LINHA
DE PROGRAMA EX.: #INCLUDE <16F628A.H> OU #INCLUDE <16F452.H> *****************/
#USE DELAY(CLOCK=4000000) /*** ESSA LINHA DO PROGRAMA DEFINE A VOCIDADE DE CLOCK
DO PROCESSADOR. O PIC TRABALHA COM UMA FREQUNCIA DE CLOCK DE AT 20 MHZ. *****/
#FUSES NOWDT, XT, BROWNOUT, NOPUT, NOPROTECT, NOCPD, NOLVP
/********************** AQUI TRATAMOS DOS CONFIGURATIONS BITS. E SO NECESSRIOS
PARA O FUNCIONAMENTO BSICO DO MICROCNTROLADOR. ABAIXO SER RELACIONADO AS POSS
VEIS CONFIGURAES COM SUAS EXPLICAES.
MASTER CLEAR (MCLR OU NOMCLR) O RESET DO MICROCONTROLADOR
BROWN OUT (BROWNOUT OU NO BROWNOUT) PERMITE QUE O PRECESSADOR SEJA RESETADO SE A
TENSO DE ALIMENTAO CAIA ABAIXO DE 4V.
WATCH DOG TIMER (WDT OU NOWDT) O CO DE GUARDA FAZ COM QUE O MICROCONTROLADOR
SEJA RESETADO CASO PASSE UM DETERMINADO TEMPO.
POWER UP TIME (PUT OU NOPUT) UTILIZADO PARA MANTER O MICROCONTROLADOR RESETADO
POR UM DETRMINADO TEMPO, NO MOMENTO DE SUA ENERGIZAO.
LOW VOLTAGE PROGRAM (LVP OU NOLVP) PERMITE PROGRAMAR O PIC EM BAIXA TENSO.
CODE PROTECT (PROTECT OU NOPROTECT) PROTEGE A MEMRIA INTERNA CONTRA LEITURA DE
OUTROS PROGRAMADORES.
DATA EE READ PROTECT(CPD OU NOCPD) IDEM AO ANTERIOR PORM NA MEMRIA EEPROM.
OSCILADOR (XT, INTRC_IO, HS, EC, INTOSC E RC) PERMITE SELECONAR A FONTE DE CLOCK
PARA O MICROCONTROLADOR PIC.***************************************************/
VOID MAIN(VOID) /*** ESSA A FUNO PRINCIPAL DO PROGRAMA. ESTE O UNICO BLOCO
PRECISO PARA QUE UM PROGRAMA EM "C" FUNCIONE. PODE SER VOID MAIN() OU MAIN()***/
{ // ABERTURA DE CHAVE INDICA INCIO DO BLOCO.
// BLOCO DE COMANDOS;
}// FECHAMENTO DE CHAVE INDICA FIM DE BLOCO.

Prof. Fabio Caldas & Marcos Felipe

Pgina 2

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/***************************EXERCCIO DE FIXAO********************************
********************************************************************************
******DIGA O SIGNIFICADO DE CADA LINHA DO FRAGUIMENTO DE PROGRAMA ABAIXO ******/
#INCLUDE <16F877.H>
#USE DELAY(CLOCK=4000000)
#FUSES NOWDT, XT, BROWNOUT, NOPUT, NOPROTECT, NOCPD, NOLVP
VOID MAIN(VOID)
{

}
// AS CONTRABARRAS (//) INDICA COMENTRIO DE UMA LINHA APENAS.
// A CONTRABARRA SEGUIDO DE ESTERISTICO (/* */ INDICA COMENTRIO DE MULTIPLAS LINHAS
/* DEPOIS QUE O CDIGO CRIADO, SER PRECISO GERAR UM ARQUIVO HEX. QUE A LINGUAGEM
QUE A MQUINA ENTENDE. ESSE PROCESSO CHAMAMOS DE COMPILAR.
PARA EXECUTAR A COMPILAO BASTA PRECIONARMOS NO TECLADO F9 OU MENU -> COMPILE -> F9*/

Anote sua observao:


_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________
_____________________________________________________________________________________

Prof. Fabio Caldas & Marcos Felipe

Pgina 3

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/************ELABORANDO O PRIMEIRO PROJETO COM MICROCONTROLADOR PIC*************


********************************************************************************
******OBJETIVO: FAZER UM LED ACENSER AO APERTAR UM BOTO***************************
********************************************************************************
***FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LED, BOTO, FONTE DE ALIMENTAO***
***PROTOBORD, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E GRAVADOR PICKIT2 ***
********************************************************************************
*****APRENDER O COMANDO WHILE, IF, INPUT, OUTPUT_HIGH, OUTPUT_LOW E DELAY_MS***/
#INCLUDE<16F877.H>
#USE DELAY(CLOCK = 4000000)
#FUSES XT, NOWDT
MAIN()
{
WHILE(TRUE)
{
IF(INPUT(PIN_C0)==0)
{
OUTPUT_HIGH(PIN_C1);
}
ELSE OUTPUT_LOW(PIN_C1);
}
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 4

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/************ELABORANDO O SEGUNDO PROJETO COM MICROCONTROLADOR PIC**************


********************************************************************************
******OBJETIVO: FAZER UM UM LED PISCAR NUM DETERMINADO TEMPO (PISCA-PISCA)******
********************************************************************************
***FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LED, BOTO, FONTE DE ALIMENTAO***
***PROTOBORD, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E GRAVADOR PICKIT2 ***
********************************************************************************
*****APRENDER O COMANDO WHILE, IF, INPUT, OUTPUT_HIGH, OUTPUT_LOW E DELAY_MS***/
#INCLUDE<16F877.H>
#USE DELAY(CLOCK = 4000000)
#FUSES XT, NOWDT
VOID MAIN()
{
WHILE(TRUE)
{
IF(INPUT(PIN_C0)==0)
{
OUTPUT_HIGH(PIN_C1);
DELAY_MS(1000);
OUTPUT_LOW(PIN_C1);
DELAY_MS(1000);
}
}
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 5

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/************ELABORANDO O TERCEIRO PROJETO COM MICROCONTROLADOR PIC*************


********************************************************************************
*****************OBJETIVO: ESCREVER EM BINRIO DE 1 AT 256*********************
********************************************************************************
**FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, 8 LED's, BOTO, FONTE DE ALIMENTAO
***PROTOBORD, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E GRAVADOR PICKIT2 ***
********************************************************************************
********************APRENDER O COMANDO WHILE, FOR OUTPUT_X*********************/
#INCLUDE<16F877.H>
#USE DELAY(CLOCK = 4000000)
#FUSES XT, NOWDT
VOID MAIN()
{
INT NUMERO;
WHILE(TRUE)
{
FOR(NUMERO=0;NUMERO<256; NUMERO++)
{
OUTPUT_D(NUMERO);
DELAY_MS(500);
}
NUMERO=0;
}
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 6

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/*************ELABORANDO O QUARTO PROJETO COM MICROCONTROLADOR PIC**************


********************************************************************************
****OBJETIVO:MANIPULAR UM DISPLAY DE SETE SEGMENTOS POR COMANDOS DE TECLAS******
********************************************************************************
*FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, DIS7SEG, GRAVADOR PICKIT2, PROTOBORD*
*FONTE DE ALIMENTAO, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E BOTO******
********************************************************************************
*********************APRENDER O COMANDO WHILE, SWITCH CASE*********************/
#INCLUDE<16F877.H>
#USE DELAY(CLOCK = 4000000)
#FUSES XT, NOWDT
INT INDICE;
VOID MAIN()
{
INDICE =0;
WHILE(TRUE)
{
IF(!INPUT(PIN_C0)) INDICE=1;
IF(!INPUT(PIN_C1)) INDICE=2;
IF(!INPUT(PIN_C2)) INDICE=3;
IF(!INPUT(PIN_C3)) INDICE=4;
SWITCH(INDICE)
{
CASE 1: OUTPUT_D(0B00000110);
BREAK;
CASE 2: OUTPUT_D(0B01011011);
BREAK;
CASE 3: OUTPUT_D(0B01001111);
BREAK;
CASE 4: OUTPUT_D(0B00000000);
BREAK;
}
}
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 7

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

Prof. Fabio Caldas & Marcos Felipe

Pgina 8

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/*************ELABORANDO O QUINTO PROJETO COM MICROCONTROLADOR PIC**************


********************************************************************************
***************OBJETIVO: CONSTRUIR UM CONVERSOR ANALGICO DIGITAL***************
********************************************************************************
***FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LED, BOTO, FONTE DE ALIMENTAO***
***PROTOBORD, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E GRAVADOR PICKIT2 ***
********************************************************************************
APRENDER O COMANDO WHILE, IF, ELSE, OUTPUT_HIGH, OUTPUT_LOW E CONF DO CANAL AD*/
#INCLUDE <16F877A.H>
#DEVICE ADC=8
#FUSES XT,WDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
#USE DELAY(CLOCK=4000000, RESTART_WDT)
FLOAT CONVERSAO = 0;
VOID MAIN()
{
SETUP_ADC_PORTS (RA0_RA1_RA3_ANALOG);
SETUP_ADC (ADC_CLOCK_DIV_8);
SETUP_COUNTERS (RTCC_INTERNAL, WDT_2304MS);
SET_ADC_CHANNEL (1);
WHILE(TRUE)
{
RESTART_WDT();
CONVERSAO = READ_ADC();
CONVERSAO = (CONVERSAO * 5);
CONVERSAO = (CONVERSAO / 255);
OUTPUT_D(READ_ADC());
IF (CONVERSAO<=1) OUTPUT_HIGH(PIN_B0);
ELSE OUTPUT_LOW(PIN_B0);
IF ((CONVERSAO<=4)&&(CONVERSAO>=1)) OUTPUT_HIGH(PIN_B1);
ELSE OUTPUT_LOW(PIN_B1);
IF ((CONVERSAO<=5)&&(CONVERSAO>=4)) OUTPUT_HIGH(PIN_B2);
ELSE OUTPUT_LOW(PIN_B2);
}
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 9

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

Prof. Fabio Caldas & Marcos Felipe

Pgina 10

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/************* ELABORANDO O SEXTO PROJETO COM MICROCONTROLADOR PIC**************


********************************************************************************
****************OBJETIVO:MANIPULAR UM DISPLAY DE LCD 16X2 **********************
********************************************************************************
*FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LCD 16X2, GRAVADOR PICKIT2, PROTOBORD
*FONTE DE ALIMENTAO, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E BOTO******
********************************************************************************
****************APRENDER COMO CRIAR FUNES E COMANDOS DO LCD******************/
#Include <16f877.h>
#fuses xt, nolvp, nowdt, nolvp, nobrownout, put, nodebug, noprotect, nowrt, nocpd
#use delay(clock = 4000000)
#Define rs pin_e2 // pino de seleo de modo do display
#Define en pin_e1 // pino de habilitao do display
void inicializa(void) ;
void atualiza_tela(void) ;
void lcd_inst(char dado) ;
void lcd_dado(char dado) ;
void main(void)
{
inicializa() ; // chama rotina para inicializar o sistema
While(1) // entra em loop infinito
{
atualiza_tela() ;
}
}
void inicializa(void)
{
// aguarda 2s
//delay_ms(2) ; comentar essa linha para utilizar no pic simulator
// rotina de inicializao do display
lcd_inst(0x30) ;
delay_ms(3) ;
lcd_inst(0x30) ;
lcd_inst(0x30) ;
lcd_inst(0x38) ;
lcd_inst(0x01) ;
delay_ms(1) ;
lcd_inst(0x0c) ;
lcd_inst(0x06) ;
}
void atualiza_tela(void)
{
lcd_inst(0x01) ; // provoca o apagamento da linha
delay_ms(2) ; // aguarda 2 ms

Prof. Fabio Caldas & Marcos Felipe

Pgina 11

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

lcd_inst(0x80) ; // posiciona o cursor na linha 1 e coluna 1


printf(lcd_dado, "Aline eu te amo!") ; // escreve a frase
lcd_inst(0xc0) ; // posiciona o cursor o cursor na linha 2coluna 2
printf(lcd_dado, "voce e linda d+!") ; // escreve a frase
delay_ms(500) ; // aguarda 5000 ms
lcd_inst(0x01) ; // provoca o apgamento da linha
delay_ms(2) ; // aguarda 2 ms
lcd_inst(0x80) ; // posiciona o cursor na linha 1 e coluna 1
printf(lcd_dado, "e muito especial") ; // escreve a frase
lcd_inst(0xc4) ; // posiciona o cursor o cursor na linha 2coluna 2
printf(lcd_dado, "para mim") ; // escreve a frase
delay_ms(500) ; // aguarda 5000 ms
lcd_inst(0x01) ; // provoca o apgamento da linha
delay_ms(2) ; // aguarda 2 ms
lcd_inst(0x81) ; // posiciona o cursor na linha 1 e coluna 1
printf(lcd_dado, "nao posso mais") ; // escreve a frase
lcd_inst(0xc1) ; // posiciona o cursor o cursor na linha 2coluna 2
printf(lcd_dado, "viver sem voce") ; // escreve a frase
delay_ms(500) ; // aguarda 5000 ms
lcd_inst(0x01) ; // provoca o apgamento da linha
delay_ms(2) ; // aguarda 2 ms
lcd_inst(0x82) ; // posiciona o cursor na linha 1 coluna 3
printf(lcd_dado, "quer se casar") ; // escreve a frase
lcd_inst(0xc5) ; // posiciona o cursor na linha 2 coluna 6
printf(lcd_dado, "comigo") ; // escreve a frase
delay_ms(500) ; // aguarda 5000 ms
}
void lcd_inst(char dado)
{
disable_interrupts(global) ; // desliga As interrupes
output_low(rs) ; // pe pino de rs em baixo, modo comando
output_d(dado) ; // pe o dado no PORTD
delay_cycles(2) ; // aguarda 2 us, acomodao
output_high(en) ; // gera pulso de clock
delay_cycles(2) ;
output_low(en) ;
delay_ms(1) ; // aguarda 1ms
enable_interrupts(global) ; // liga As interrupes
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 12

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

void lcd_dado(char dado)


{
disable_interrupts(global) ; // desliga As interrupes
output_high(rs) ; // seta o pino rs, modo dado
output_d(dado) ; // pe o dado no PORTD
delay_cycles(2) ; // aguarda 2us, acomodao
output_high(en) ; // gera pulso de clock
delay_cycles(2) ;
output_low(en) ;
delay_ms(1) ; // aguarda 1ms
enable_interrupts(global) ; // liga As interrupes
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 13

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/************* ELABORANDO O STIMO PROJETO COM MICROCONTROLADOR PIC*************


********************************************************************************
******OBJETIVO:MANIPULAR UM DISPLAY DE LCD 16X2 E O CANAL AD 1 E 2 DO PIC*******
********************************************************************************
*FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LCD 16X2, GRAVADOR PICKIT2, PROTOBORD
*FONTE DE ALIMENTAO, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E SENSOR*****
********************************************************************************
****************APRENDER COMO CRIAR FUNES E COMANDOS DO LCD******************/
#include <16F877.h>//microcontrolador utilizado
#fuses xt,nolvp,nowdt,nolvp,nobrownout,put,nodebug,noprotect,nowrt,nocpd
#use delay(clock=4000000)
// Define o clock do sistema
#define RS
#define EN
void Inicializa(void);
void Atualiza_tela();
void Atualiza_tela1();
void Atualiza_tela2();
void Lcd_Inst(char dado);
void Lcd_Dado(char dado);
float temperatura,tensao;
void main (void)
{
Inicializa();
while(1)
{
restart_wdt();
atualiza_tela1();
atualiza_tela2();
}
}

PIN_E2
PIN_E1

// Pino de seleo de modo do display


// Pino de habilitao do display

// Chama rotina para inicializar o sistema


// Entra em loop infinito
// Limpa o wdt

void Inicializa(void)
{
//delay_ms(2000); manter essa linha comentada para usar no pic simulator ide
setup_adc(ADC_CLOCK_DIV_8);
// Configura clock da converso
setup_adc_ports(RA0_RA1_RA3_ANALOG); // Configura A/D
//set_adc_channel(0);
// L a entrada 0
//set_adc_channel(1);
// L a entrada 0
setup_wdt(WDT_2304MS);
// Configura WDT para 2,304 s
Lcd_Inst(0x30);
delay_ms(3);
Lcd_Inst(0x30);
Lcd_Inst(0x30);
Lcd_Inst(0x38);
Lcd_Inst(0x01);
delay_ms(1);

// Inicializa o display

Prof. Fabio Caldas & Marcos Felipe

Pgina 14

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

Lcd_Inst(0x0C);
Lcd_Inst(0x06);
}
void Atualiza_tela1(void)
{
set_adc_channel(1);
Lcd_Inst(0x81);

// Posiciona cursor no display

tensao= read_adc();
tensao*=0.01953125;
printf(lcd_dado,"Tensao %1.3f V", tensao);
}
void Atualiza_tela2(void)
{
set_adc_channel(0);
Lcd_Inst(0xC1);
// Posiciona cursor no display
temperatura= read_adc();
temperatura*=2;
printf(lcd_dado,"Temper %1.1f C", temperatura);
}
void Lcd_Inst(char dado)
{
disable_interrupts(GLOBAL);
output_low(RS);
output_d(dado);
delay_cycles(2);
output_high(EN);
delay_cycles(2);
output_low(EN);
delay_ms(1);
enable_interrupts(GLOBAL);
}
void Lcd_Dado(char dado)
{
disable_interrupts(GLOBAL);
output_high(RS);
output_d(dado);
delay_cycles(2);
output_high(EN);
delay_cycles(2);
output_low(EN);
delay_ms(1);
enable_interrupts(GLOBAL);
}

Prof. Fabio Caldas & Marcos Felipe

// Desliga as interrupes
// Pe pino de RS em baixo, modo comando
// Pe o dado no portd
// Aguarda 2 us, acomodao
// Gera pulso de clock

// Aguarda 1ms
// Liga as interrupes

// Desliga as interrupes
// Seta o pino RS, modo dado
// Pe o dado no portd
// Aguarda 2us, acomodao
// Gera pulso de clock

// Aguarda 1ms
// Liga as interrupes

Pgina 15

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

Prof. Fabio Caldas & Marcos Felipe

Pgina 16

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/***************ELABORANDO O OITAVO PROJETO COM MICROCONTROLADOR PIC*************


********************************************************************************
***********OBJETIVO: TRANSMITIR O VALOR DO CANAL AD VIA SERIAL RS232************
********************************************************************************
FERRAMENTAS UTILIZADAS:MICROCONTROLADOR, SENSOR, FONTE DE ALIMENTAO, PROTOBORD
**COMPUTADOR, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E GRAVADOR PICKIT2 ***
********************************************************************************
APRENDER O COMANDO WHILE, IF, ELSE, OUTPUT_HIGH, OUTPUT_LOW E CONF DO CANAL AD*/
#INCLUDE <16F877A.H>
#DEVICE ADC=10
#fuses XT,WDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
#USE DELAY(CLOCK=4000000, RESTART_WDT)
#USE RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7)
FLOAT CONVERSAO = 0;
VOID MAIN()
{
SETUP_ADC_PORTS (RA0_RA1_RA3_ANALOG);
SETUP_ADC (ADC_CLOCK_DIV_32);
SETUP_COUNTERS (RTCC_INTERNAL, WDT_2304MS);
SET_ADC_CHANNEL (1);
while(TRUE)
{
RESTART_WDT();
CONVERSAO = READ_ADC();
CONVERSAO = (CONVERSAO * 5);
CONVERSAO = (CONVERSAO / 1023);
OUTPUT_D(READ_ADC());
PRINTF(" O VALOR AD: %f\r\n", CONVERSAO);
if (CONVERSAO<=1) OUTPUT_HIGH(PIN_B0);
else OUTPUT_LOW(PIN_B0);
if ((CONVERSAO<=4)&&(CONVERSAO>=1)) OUTPUT_HIGH(PIN_B1);
else OUTPUT_LOW(PIN_B1);
if ((CONVERSAO<=5)&&(CONVERSAO>=4)) OUTPUT_HIGH(PIN_B2);
else OUTPUT_LOW(PIN_B2);
}
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 17

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

Prof. Fabio Caldas & Marcos Felipe

Pgina 18

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/***************ELABORANDO O NONO PROJETO COM MICROCONTROLADOR PIC************


********************************************************************************
***********OBJETIVO: DESENVOLVER UMA ROTINA PARA TECLADO MATRICIAL**************
********************************************************************************
FERRAMENTAS UTILIZADAS:MICROCONTROLADOR, SENSOR, FONTE DE ALIMENTAO, PROTOBORD
**COMPUTADOR, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E GRAVADOR PICKIT2 ***
********************************************************************************
APRENDER O COMANDO WHILE, IF, ELSE, OUTPUT_HIGH, OUTPUT_LOW E CONF DO CANAL AD*/
#INCLUDE <16F877.H>
#fuses XT,WDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
#USE DELAY(CLOCK=4000000, RESTART_WDT)
//#USE RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7)
#define SEL_LINHA1
0b00001110
#define SEL_LINHA2
0b00001101
#define SEL_LINHA3
0b00001011
#define SEL_LINHA4
0b00000111
#define COL1
PIN_A4
#define COL2
PIN_A5
#define COL3
PIN_A0
int indice=0;
int1 tecla0=0, tecla1=0, tecla2=0, tecla3=0, tecla4=0, tecla5=0;
int1 tecla6=0, tecla7=0, tecla8=0, tecla9=0, teclaE=0, teclaC=0;
void Inicializa(void);
VOID MAIN()
{
Inicializa();
while(1) // Entra em loop infinito
{
restart_wdt(); // Limpa o wdt
if (tecla1) OUTPUT_HIGH(PIN_C0);
if (tecla2) OUTPUT_HIGH(PIN_C1);
if (tecla3) OUTPUT_HIGH(PIN_C2);
if (tecla4) OUTPUT_LOW(PIN_C0);
if (tecla5) OUTPUT_LOW(PIN_C1);
if (tecla6) OUTPUT_LOW(PIN_C2);
if (tecla7) OUTPUT_HIGH(PIN_C3);
if (tecla8) OUTPUT_HIGH(PIN_C4);
if (tecla9) OUTPUT_HIGH(PIN_C5);
if (teclaC) OUTPUT_LOW(PIN_C3);
if (tecla0) OUTPUT_LOW(PIN_C4);
if (teclaE) OUTPUT_LOW(PIN_C5);
}
}
void Inicializa(void)
{
setup_wdt(WDT_2304MS);

Prof. Fabio Caldas & Marcos Felipe

Pgina 19

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

setup_adc_ports(no_analogs);
set_timer0(0);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
}
#int_timer0
void Ist_Timer0(void)
{
indice++;
switch(indice)
{
case 1:
output_d(SEL_LINHA1);
tecla1=0;
// Limpa a tecla pressionada
tecla2=0;
// Limpa a tecla pressionada
tecla3=0;
// Limpa a tecla pressionada
if (!input(COL1)) tecla1=1; // Verifica se tecla est pressionada
if (!input(COL2)) tecla2=1; // Verifica se tecla est pressionada
if (!input(COL3)) tecla3=1; // Verifica se tecla est pressionada
break;
// Liga display selecionado
case 2:
output_d(SEL_LINHA2);
// Seleciona no barramento a linha 1
tecla4=0;
// Limpa a tecla pressionada
tecla5=0;
// Limpa a tecla pressionada
tecla6=0;
// Limpa a tecla pressionada
if (!input(COL1)) tecla4=1; // Verifica se tecla est pressionada
if (!input(COL2)) tecla5=1; // Verifica se tecla est pressionada
if (!input(COL3)) tecla6=1; // Verifica se tecla est pressionada
break;
// Liga display selecionado
case 3:
output_d(SEL_LINHA3);
// Seleciona no barramento a linha 3
tecla7=0;
// Limpa a tecla pressionada
tecla8=0;
// Limpa a tecla pressionada
tecla9=0;
// Limpa a tecla pressionada
if (!input(COL1)) tecla7=1; // Verifica se tecla est pressionada
if (!input(COL2)) tecla8=1; // Verifica se tecla est pressionada
if (!input(COL3)) tecla9=1; // Verifica se tecla est pressionada
break;
// Liga display selecionado
case 4:

// Caso seja 4...


// Reinicia indice
output_d(SEL_LINHA4);
teclaC=0;
tecla0=0;
teclaE=0;
if (!input(COL1)) teclaC=1;

Prof. Fabio Caldas & Marcos Felipe

// Seleciona no barramento a linha 4


// Limpa a tecla pressionada
// Limpa a tecla pressionada
// Limpa a tecla pressionada
// Verifica se tecla est pressionada

Pgina 20

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

if (!input(COL2)) tecla0=1; // Verifica se tecla est pressionada


if (!input(COL3)) teclaE=1; // Verifica se tecla est pressionada
indice=0;
break;
// Liga display selecionado
}
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 21

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/*********ELABORANDO O DCIMO PROJETO COM MICROCONTROLADOR PIC*********


********************************************************************************
************OBJETIVO: DESENVOLVER UMA ROTINA PARA PWM CCP1 E CCP2***************
********************************************************************************
FERRAMENTAS UTILIZADAS:MICROCONTROLADOR, SENSOR, FONTE DE ALIMENTAO, PROTOBORD
**COMPUTADOR, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E GRAVADOR PICKIT2 ***
********************************************************************************
APRENDER O COMANDO WHILE, IF, ELSE, OUTPUT_HIGH, OUTPUT_LOW E CONF DO CANAL AD*/

#include <16F877.h>
//microcontrolador utilizado
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Configuraes para gravao
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#fuses xt,nolvp,wdt,nolvp,nobrownout,put,nodebug,noprotect,nowrt,nocpd
// Configuraes da Mquina
// Oscilador: XT, LVP: Off, WDT: On
// Brown-out: Off, Power-up: Off, Debug: Off
// CP: Off, CPD: Off
#use delay(clock=4000000)
// Utiliza biblioteca de delay
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Definio e inicializao das variveis
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Aqui iremos definir as variveis globais do sistema
int1 tecla0=0, tecla1=0, tecla2=0, tecla3=0, tecla4=0, tecla5=0, tecla6=0,
tecla7=0, tecla8=0, tecla9=0, teclaE=0, teclaC=0;
int indice=0;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Constantes internas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Aqui iremos definir as constantes utilizadas pelo sistema
#define SEL_LINHA1
0b00001110
// Seleo da linha 1
#define SEL_LINHA2
0b00001101
// Seleo da linha 2
#define SEL_LINHA3
0b00001011
// Seleo da linha 3
#define SEL_LINHA4
0b00000111
// Seleo da linha 4
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Entradas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Aqui iremos definir as entradas do sistema
#define COL1
PIN_A4
#define COL2
PIN_A5
#define COL3
PIN_A0
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Sadas
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Aqui iremos definir as sadas do sistema
#define RS
PIN_E2
// Pino de seleo de modo do display
#define EN
PIN_E1
// Pino de habilitao do display
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Prototipagem das funes
*

Prof. Fabio Caldas & Marcos Felipe

Pgina 22

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Aqui iremos declarar todas as funes definidas pelo usurio
void Inicializa(void);
// Prototipagem da procedure
void Tela_Inicial(void);
// Prototipagem da procedure
void Atualiza_PWM_0(int dado);
// Prototipagem da procedure
void Atualiza_PWM_20(int dado);
// Prototipagem da procedure
void Atualiza_PWM_40(int dado);
// Prototipagem da procedure
void Atualiza_PWM_60(int dado);
// Prototipagem da procedure
void Atualiza_PWM_80(int dado);
// Prototipagem da procedure
void Atualiza_PWM_100(int dado);
// Prototipagem da procedure
void Lcd_Inst(char dado);
// Prototipagem da procedure
void Lcd_Dado(char dado);
// Prototipagem da procedure
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina Principal
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Nessa parte ficar o loop principal do sistema
void main (void)
{
Inicializa();
// Chama rotina para inicializar o sistema
while(1)
// Entra em loop infinito
{
restart_wdt();
// Limpa o wdt
if (tecla1)
Atualiza_PWM_0(0x8B); // Atualiza PWM e LCD
if (tecla2) Atualiza_PWM_20(0x8B); // Atualiza PWM e LCD
if (tecla3) Atualiza_PWM_40(0x8B); // Atualiza PWM e LCD
if (tecla4) Atualiza_PWM_60(0x8B); // Atualiza PWM e LCD
if (tecla5) Atualiza_PWM_80(0x8B); // Atualiza PWM e LCD
if (tecla6) Atualiza_PWM_100(0x8B); // Atualiza PWM e LCD
if (tecla7)
Atualiza_PWM_0(0xCB); // Atualiza PWM e LCD
if (tecla8) Atualiza_PWM_20(0xCB); // Atualiza PWM e LCD
if (tecla9) Atualiza_PWM_40(0xCB); // Atualiza PWM e LCD
if (teclaC) Atualiza_PWM_60(0xCB); // Atualiza PWM e LCD
if (tecla0) Atualiza_PWM_80(0xCB); // Atualiza PWM e LCD
if (teclaE) Atualiza_PWM_100(0xCB); // Atualiza PWM e LCD
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Inicializao do Sistema
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void Inicializa(void)
{
delay_ms(2000);
setup_adc_ports(no_analogs); // Todos os ADs desligados
setup_ccp1(CCP_PWM);
// Confirura modo CCP para PWM
setup_ccp2(CCP_PWM);

Prof. Fabio Caldas & Marcos Felipe

Pgina 23

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

output_low(PIN_C1);
output_low(PIN_C2);
// Garante estado do port
set_pwm1_duty(0);
set_pwm2_duty(0);
// Garante estado inicial do modo CCP
setup_timer_2(T2_DIV_BY_4,249,1);
set_timer0(0);
// Inicializa timer 0 com 0
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1); // Timer configurado para clock
// Interno com prescaler de 1:4
setup_wdt(WDT_2304MS);
// Configura WDT para 2,304 s
enable_interrupts(INT_TIMER0); // Habilita interrupo de timer 0
enable_interrupts(GLOBAL); // Habilita todas as interrupes
Lcd_Inst(0x30);
// Inicializa o display
delay_ms(3);
Lcd_Inst(0x30);
Lcd_Inst(0x30);
Lcd_Inst(0x38);
Lcd_Inst(0x01);
delay_ms(1);
Lcd_Inst(0x0C);
Lcd_Inst(0x06);
Tela_Inicial();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina para Apresentar a Tela Inicial
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void Tela_Inicial(void)
{
Lcd_Inst(0x80);
// Atualiza a tela do LCD
printf(lcd_dado,"CCP1(Vent): 0 %");
Lcd_Inst(0xC0);
// Atualiza a tela do LCD
printf(lcd_dado,"CCP2(Resi): 0 %");
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina para Atualizar o Duty-Cycle do PWM para 0%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void Atualiza_PWM_0(int dado)
{
Lcd_Inst(dado);
printf(lcd_dado," 0 ");
if(dado==0x8B)
{ set_pwm1_duty(0);}
else
{ set_pwm2_duty(0);}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina para Atualizar o Duty-Cycle do PWM para 20%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void Atualiza_PWM_20(int dado)
{
Lcd_Inst(dado);

Prof. Fabio Caldas & Marcos Felipe

Pgina 24

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

printf(lcd_dado," 20");
if(dado==0x8B)
{ set_pwm1_duty(50);}
else
{ set_pwm2_duty(50);}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina para Atualizar o Duty-Cycle do PWM para 40%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void Atualiza_PWM_40(int dado)
{
Lcd_Inst(dado);
printf(lcd_dado," 40");
if(dado==0x8B)
{ set_pwm1_duty(101);}
else
{ set_pwm2_duty(101);}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina para Atualizar o Duty-Cycle do PWM para 60%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void Atualiza_PWM_60(int dado)
{
Lcd_Inst(dado);
printf(lcd_dado," 60");
if(dado==0x8B)
{ set_pwm1_duty(152);}
else
{ set_pwm2_duty(152);}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina para Atualizar o Duty-Cycle do PWM para 80%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void Atualiza_PWM_80(int dado)
{
Lcd_Inst(dado);
printf(lcd_dado," 80");
if(dado==0x8B)
{ set_pwm1_duty(203);}
else
{ set_pwm2_duty(203);}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina para Atualizar o Duty-Cycle do PWM para 100%
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

Prof. Fabio Caldas & Marcos Felipe

Pgina 25

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

void Atualiza_PWM_100(int dado)


{
Lcd_Inst(dado);
printf(lcd_dado,"100");
if(dado==0x8B)
{ set_pwm1_duty(255);}
else
{ set_pwm2_duty(255);}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina para escrever comandos no display
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void Lcd_Inst(char dado)
{
disable_interrupts(GLOBAL);
// Desliga as interrupes
output_low(RS);
// Pe pino de RS em baixo, modo
comando
output_d(dado);
// Pe o dado no portd
delay_cycles(2);
// Aguarda 2 us, acomodao
output_high(EN);
// Gera pulso de clock
delay_cycles(2);
output_low(EN);
delay_ms(1);
// Aguarda 1ms
enable_interrupts(GLOBAL);
// Liga as interrupes
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Rotina para escrever dados no display
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void Lcd_Dado(char dado)
{
disable_interrupts(GLOBAL);
// Desliga as interrupes
output_high(RS);
// Seta o pino RS, modo dado
output_d(dado);
// Pe o dado no portd
delay_cycles(2);
// Aguarda 2us, acomodao
output_high(EN);
// Gera pulso de clock
delay_cycles(2);
output_low(EN);
delay_ms(1);
// Aguarda 1ms
enable_interrupts(GLOBAL);
// Liga as interrupes
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Tratamento da Interrupo de Timer 0
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#int_timer0
void Ist_Timer0(void)
{
indice++;
// Incrementa indice
switch(indice)

// Seleo de casos com indice

Prof. Fabio Caldas & Marcos Felipe

Pgina 26

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

{
case 1:

// Caso seja 1...


output_d(SEL_LINHA1); // Seleciona no barramento a linha 1
tecla1=0;
// Limpa a tecla pressionada
tecla2=0;
// Limpa a tecla pressionada
tecla3=0;
// Limpa a tecla pressionada
if (!input(COL1)) tecla1=1; // Verifica se tecla est pressionada
if (!input(COL2)) tecla2=1; // Verifica se tecla est pressionada
if (!input(COL3)) tecla3=1; // Verifica se tecla est pressionada

break;
case 2:

// Caso seja 2...


output_d(SEL_LINHA2); // Seleciona no barramento a linha 1
tecla4=0;
// Limpa a tecla pressionada
tecla5=0;
// Limpa a tecla pressionada
tecla6=0;
// Limpa a tecla pressionada
if (!input(COL1)) tecla4=1; // Verifica se tecla est pressionada
if (!input(COL2)) tecla5=1; // Verifica se tecla est pressionada
if (!input(COL3)) tecla6=1; // Verifica se tecla est pressionada

break;
case 3:

// Caso seja 3...


output_d(SEL_LINHA3);
// Seleciona no barramento a linha 3
tecla7=0;
// Limpa a tecla pressionada
tecla8=0;
// Limpa a tecla pressionada
tecla9=0;
// Limpa a tecla pressionada
if (!input(COL1)) tecla7=1; // Verifica se tecla est pressionada
if (!input(COL2)) tecla8=1; // Verifica se tecla est pressionada
if (!input(COL3)) tecla9=1; // Verifica se tecla est pressionada

break;
case 4:
indice=0;

// Caso seja 4...


// Reinicia indice
output_d(SEL_LINHA4);
// Seleciona no barramento a linha 4
teclaC=0;
// Limpa a tecla pressionada
tecla0=0;
// Limpa a tecla pressionada
teclaE=0;
// Limpa a tecla pressionada
if (!input(COL1)) teclaC=1; // Verifica se tecla est pressionada
if (!input(COL2)) tecla0=1; // Verifica se tecla est pressionada
if (!input(COL3)) teclaE=1; // Verifica se tecla est pressionada

break;
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Fim do Programa
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

Prof. Fabio Caldas & Marcos Felipe

Pgina 27

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

Prof. Fabio Caldas & Marcos Felipe

Pgina 28

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

/**********ELABORANDO O DCIMO-PRIMEIRO PROJETO COM MICROCONTROLADOR PIC*********


********************************************************************************
*****OBJETIVO:RELGIO DIGITAL COM DISPLAY DE LCD 16X2 E TECLADO MATRICIAL ******
********************************************************************************
*FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LCD 16X2, GRAVADOR PICKIT2, PROTOBORD
*FONTE DE ALIMENTAO, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E BOTO******
********************************************************************************
****************APRENDER COMO CRIAR FUNES E COMANDOS DO LCD******************/
#Include <16f877.h>
#fuses xt, nolvp, nowdt, nolvp, nobrownout, put, nodebug, noprotect, nowrt, nocpd
#use delay(clock = 4000000)
#Define rs pin_e2 // pino de seleo de modo do display
#Define en pin_e1 // pino de habilitao do display
#define SEL_LINHA1
0b00001110
#define SEL_LINHA2
0b00001101
#define SEL_LINHA3
0b00001011
#define SEL_LINHA4
0b00000111
#define COL1
PIN_A4
#define COL2
PIN_A5
#define COL3
PIN_A0
int indice=0;
int1 tecla0=0, tecla1=0, tecla2=0, tecla3=0, tecla4=0, tecla5=0;
int1 tecla6=0, tecla7=0, tecla8=0, tecla9=0, teclaE=0, teclaC=0;
int HORA=0, MINUTO=0, SEGUNDO=0;
void inicializa(void);
void lcd_inst(char dado) ;
void lcd_dado(char dado) ;
void main(void)
{
inicializa() ; // chama rotina para inicializar o sistema
While(1) // entra em loop infinito
{
SEGUNDO ++;
if (SEGUNDO > 59 || (TECLA1)) // A TECLA1 INCREMENTA O MINUTO
{
SEGUNDO = 0;
MINUTO ++;
}
if (MINUTO > 59 || (TECLA2)) // A TECLA2 INCREMENTA A HORA
{
MINUTO = 0;
HORA ++;
}
if (HORA > 23) HORA = 0;
//lcd_inst(0x01) ; // provoca o apagamento da linha

Prof. Fabio Caldas & Marcos Felipe

Pgina 29

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

//delay_ms(2) ; // aguarda 2 ms
lcd_inst(0x81) ; // posiciona o cursor na linha 1 e coluna 2
printf(lcd_dado, "relogio digital") ; // escreve a frase
lcd_inst(0xc4) ; // posiciona o cursor na linha 2 e coluna 5
printf(lcd_dado,"\f%02u:%02u:%02u", HORA, MINUTO, SEGUNDO);
delay_ms(1000);
}
}
void inicializa(void)
{
setup_wdt(WDT_2304MS);
setup_adc_ports(no_analogs);
set_timer0(0);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
// aguarda 2s
//delay_ms(2) ; comentar essa linha para utilizar no pic simulator
// rotina de inicializao do display
lcd_inst(0x30) ;
delay_ms(3) ;
lcd_inst(0x30) ;
lcd_inst(0x30) ;
lcd_inst(0x38) ;
lcd_inst(0x01) ;
delay_ms(1) ;
lcd_inst(0x0c) ;
lcd_inst(0x06) ;
}
void lcd_inst(char dado)
{
disable_interrupts(global) ; // desliga As interrupes
output_low(rs) ; // pe pino de rs em baixo, modo comando
output_d(dado) ; // pe o dado no PORTD
delay_cycles(2) ; // aguarda 2 us, acomodao
output_high(en) ; // gera pulso de clock
delay_cycles(2) ;
output_low(en) ;
delay_ms(1) ; // aguarda 1ms
enable_interrupts(global) ; // liga As interrupes
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 30

Microcontrolador PIC Programando em C

Prof. Fabio Caldas & Marcos Felipe

void lcd_dado(char dado)


{
disable_interrupts(global) ; // desliga As interrupes
output_high(rs) ; // seta o pino rs, modo dado
output_d(dado) ; // pe o dado no PORTD
delay_cycles(2) ; // aguarda 2us, acomodao
output_high(en) ; // gera pulso de clock
delay_cycles(2) ;
output_low(en) ;
delay_ms(1) ; // aguarda 1ms
enable_interrupts(global) ; // liga As interrupes
}
#int_timer0
void Ist_Timer0(void)
{
indice++;
switch(indice)
{
case 1:
output_c(SEL_LINHA1); // Seleciona no barramento a linha 1
tecla1=0;
// Limpa a tecla pressionada
tecla2=0;
// Limpa a tecla pressionada
tecla3=0;
// Limpa a tecla pressionada
if (!input(COL1)) tecla1=1; // Verifica se tecla est pressionada
if (!input(COL2)) tecla2=1; // Verifica se tecla est pressionada
if (!input(COL3)) tecla3=1; // Verifica se tecla est pressionada
break;
// Liga display selecionado
case 2:

break;

output_c(SEL_LINHA2); // Seleciona no barramento a linha 2


tecla4=0;
// Limpa a tecla pressionada
tecla5=0;
// Limpa a tecla pressionada
tecla6=0;
// Limpa a tecla pressionada
if (!input(COL1)) tecla4=1; // Verifica se tecla est pressionada
if (!input(COL2)) tecla5=1; // Verifica se tecla est pressionada
if (!input(COL3)) tecla6=1; // Verifica se tecla est pressionada
// Liga display selecionado

case 3:
output_c(SEL_LINHA3); // Seleciona no barramento a linha 3
tecla7=0;
// Limpa a tecla pressionada
tecla8=0;
// Limpa a tecla pressionada
tecla9=0;
// Limpa a tecla pressionada
if (!input(COL1)) tecla7=1; // Verifica se tecla est pressionada

Prof. Fabio Caldas & Marcos Felipe

Pgina 31

Microcontrolador PIC Programando em C

break;

Prof. Fabio Caldas & Marcos Felipe

if (!input(COL2)) tecla8=1; // Verifica se tecla est pressionada


if (!input(COL3)) tecla9=1; // Verifica se tecla est pressionada
// Liga display selecionado

case 4:

// Caso seja 4...


// Reinicia indice
output_c(SEL_LINHA4); // Seleciona no barramento a linha 4
teclaC=0;
// Limpa a tecla pressionada
tecla0=0;
// Limpa a tecla pressionada
teclaE=0;
// Limpa a tecla pressionada
if (!input(COL1)) teclaC=1; // Verifica se tecla est pressionada
if (!input(COL2)) tecla0=1; // Verifica se tecla est pressionada
if (!input(COL3)) teclaE=1; // Verifica se tecla est pressionada
indice=0;
break;
// Liga display selecionado

}
}

Prof. Fabio Caldas & Marcos Felipe

Pgina 32