32
Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe Prof.º Fabio Caldas & Marcos Felipe Página 1 Apostila Microcontroladores PIC Programando em C Professores Fabio Caldas & Marcos Felipe

Apostila PIC

  • Upload
    jef

  • View
    161

  • Download
    19

Embed Size (px)

DESCRIPTION

Apostila portugues sobre microcontroladores PIC. Com vários projetos prontos e discrição dos comandos que o PIC receberá.

Citation preview

Page 1: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 1

Apostila Microcontroladores PIC

Programando em C

Professores

Fabio Caldas

&

Marcos Felipe

Page 2: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 2

/******************ESSE EXEMPLO BUSCA MOSTRAR A ESTRUTURA BÁSICA**************** ******************* 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 FREQUÊNCIA DE CLOCK DE ATÉ 20 MHZ. *****/ #FUSES NOWDT, XT, BROWNOUT, NOPUT, NOPROTECT, NOCPD, NOLVP /********************** AQUI TRATAMOS DOS CONFIGURATIONS BITS. E SÃO NECESSÁRIOS PARA O FUNCIONAMENTO BÁSICO DO MICROCNTROLADOR. ABAIXO SERÁ RELACIONADO AS POSSÍ VEIS CONFIGURAÇÕES COM SUAS EXPLICAÇÕES. MASTER CLEAR (MCLR OU NOMCLR) É O RESET DO MICROCONTROLADOR BROWN OUT (BROWNOUT OU NO BROWNOUT) PERMITE QUE O PRECESSADOR SEJA RESETADO SE A TENSÃO DE ALIMENTAÇÃO CAIA ABAIXO DE 4V. WATCH DOG TIMER (WDT OU NOWDT) O CÃO 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 ENERGIZAÇÃO. LOW VOLTAGE PROGRAM (LVP OU NOLVP) PERMITE PROGRAMAR O PIC EM BAIXA TENSÃO. CODE PROTECT (PROTECT OU NOPROTECT) PROTEGE A MEMÓRIA INTERNA CONTRA LEITURA DE OUTROS PROGRAMADORES. DATA EE READ PROTECT(CPD OU NOCPD) IDEM AO ANTERIOR PORÉM NA MEMÓRIA 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 FUNÇÃO 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 INÍCIO DO BLOCO. // BLOCO DE COMANDOS; }// FECHAMENTO DE CHAVE INDICA FIM DE BLOCO.

Page 3: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 3

/***************************EXERCÍCIO DE FIXAÇÃO******************************** ******************************************************************************** ******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 COMENTÁRIO DE UMA LINHA APENAS. // A CONTRABARRA SEGUIDO DE ESTERISTICO (/* */ INDICA COMENTÁRIO DE MULTIPLAS LINHAS /* DEPOIS QUE O CÓDIGO É CRIADO, SERÁ PRECISO GERAR UM ARQUIVO HEX. QUE É A LINGUAGEM QUE A MÁQUINA ENTENDE. ESSE PROCESSO CHAMAMOS DE COMPILAR. PARA EXECUTAR A COMPILAÇÃO BASTA PRECIONARMOS NO TECLADO F9 OU MENU -> COMPILE -> F9*/ Anote sua observação: _____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Page 4: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 4

/************ELABORANDO O PRIMEIRO PROJETO COM MICROCONTROLADOR PIC************* ******************************************************************************** ******OBJETIVO: FAZER UM LED ACENSER AO APERTAR UM BOTÃO*************************** ******************************************************************************** ***FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LED, BOTÃO, FONTE DE ALIMENTAÇÃO*** ***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); } }

Page 5: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 5

/************ELABORANDO O SEGUNDO PROJETO COM MICROCONTROLADOR PIC************** ******************************************************************************** ******OBJETIVO: FAZER UM UM LED PISCAR NUM DETERMINADO TEMPO (PISCA-PISCA)****** ******************************************************************************** ***FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LED, BOTÃO, FONTE DE ALIMENTAÇÃO*** ***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); } } }

Page 6: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 6

/************ELABORANDO O TERCEIRO PROJETO COM MICROCONTROLADOR PIC************* ******************************************************************************** *****************OBJETIVO: ESCREVER EM BINÁRIO DE 1 ATÉ 256********************* ******************************************************************************** **FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, 8 LED's, BOTÃO, FONTE DE ALIMENTAÇÃO ***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; } }

Page 7: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 7

/*************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 ALIMENTAÇÃO, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E BOTÃO****** ******************************************************************************** *********************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; } } }

Page 8: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 8

Page 9: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 9

/*************ELABORANDO O QUINTO PROJETO COM MICROCONTROLADOR PIC************** ******************************************************************************** ***************OBJETIVO: CONSTRUIR UM CONVERSOR ANALÓGICO DIGITAL*************** ******************************************************************************** ***FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LED, BOTÃO, FONTE DE ALIMENTAÇÃO*** ***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); } }

Page 10: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 10

Page 11: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 11

/************* ELABORANDO O SEXTO PROJETO COM MICROCONTROLADOR PIC************** ******************************************************************************** ****************OBJETIVO:MANIPULAR UM DISPLAY DE LCD 16X2 ********************** ******************************************************************************** *FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LCD 16X2, GRAVADOR PICKIT2, PROTOBORD *FONTE DE ALIMENTAÇÃO, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E BOTÃO****** ******************************************************************************** ****************APRENDER COMO CRIAR FUNÇÕES 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 seleção de modo do display #Define en pin_e1 // pino de habilitação 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 inicialização 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

Page 12: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 12

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 interrupções output_low(rs) ; // põe pino de rs em baixo, modo comando output_d(dado) ; // põe o dado no PORTD delay_cycles(2) ; // aguarda 2 us, acomodação output_high(en) ; // gera pulso de clock delay_cycles(2) ; output_low(en) ; delay_ms(1) ; // aguarda 1ms enable_interrupts(global) ; // liga As interrupções }

Page 13: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 13

void lcd_dado(char dado) { disable_interrupts(global) ; // desliga As interrupções output_high(rs) ; // seta o pino rs, modo dado output_d(dado) ; // põe o dado no PORTD delay_cycles(2) ; // aguarda 2us, acomodação output_high(en) ; // gera pulso de clock delay_cycles(2) ; output_low(en) ; delay_ms(1) ; // aguarda 1ms enable_interrupts(global) ; // liga As interrupções }

Page 14: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 14

/************* ELABORANDO O SÉTIMO 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 ALIMENTAÇÃO, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E SENSOR***** ******************************************************************************** ****************APRENDER COMO CRIAR FUNÇÕES 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 PIN_E2 // Pino de seleção de modo do display #define EN PIN_E1 // Pino de habilitação do display 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(); // Chama rotina para inicializar o sistema while(1) // Entra em loop infinito { restart_wdt(); // Limpa o wdt atualiza_tela1(); atualiza_tela2(); } } 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 conversão 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); // Inicializa o display delay_ms(3); Lcd_Inst(0x30); Lcd_Inst(0x30); Lcd_Inst(0x38); Lcd_Inst(0x01); delay_ms(1);

Page 15: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 15

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); // Desliga as interrupções output_low(RS); // Põe pino de RS em baixo, modo comando output_d(dado); // Põe o dado no portd delay_cycles(2); // Aguarda 2 us, acomodação output_high(EN); // Gera pulso de clock delay_cycles(2); output_low(EN); delay_ms(1); // Aguarda 1ms enable_interrupts(GLOBAL); // Liga as interrupções } void Lcd_Dado(char dado) { disable_interrupts(GLOBAL); // Desliga as interrupções output_high(RS); // Seta o pino RS, modo dado output_d(dado); // Põe o dado no portd delay_cycles(2); // Aguarda 2us, acomodação output_high(EN); // Gera pulso de clock delay_cycles(2); output_low(EN); delay_ms(1); // Aguarda 1ms enable_interrupts(GLOBAL); // Liga as interrupções }

Page 16: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 16

Page 17: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 17

/***************ELABORANDO O OITAVO PROJETO COM MICROCONTROLADOR PIC************* ******************************************************************************** ***********OBJETIVO: TRANSMITIR O VALOR DO CANAL AD VIA SERIAL RS232************ ******************************************************************************** FERRAMENTAS UTILIZADAS:MICROCONTROLADOR, SENSOR, FONTE DE ALIMENTAÇÃO, 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); } }

Page 18: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 18

Page 19: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 19

/***************ELABORANDO O NONO PROJETO COM MICROCONTROLADOR PIC************ ******************************************************************************** ***********OBJETIVO: DESENVOLVER UMA ROTINA PARA TECLADO MATRICIAL************** ******************************************************************************** FERRAMENTAS UTILIZADAS:MICROCONTROLADOR, SENSOR, FONTE DE ALIMENTAÇÃO, 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);

Page 20: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 20

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); // 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

Page 21: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 21

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 } }

Page 22: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 22

/*********ELABORANDO O DÉCIMO PROJETO COM MICROCONTROLADOR PIC********* ******************************************************************************** ************OBJETIVO: DESENVOLVER UMA ROTINA PARA PWM CCP1 E CCP2*************** ******************************************************************************** FERRAMENTAS UTILIZADAS:MICROCONTROLADOR, SENSOR, FONTE DE ALIMENTAÇÃO, 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 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Configurações para gravação * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #fuses xt,nolvp,wdt,nolvp,nobrownout,put,nodebug,noprotect,nowrt,nocpd // Configurações da Máquina // 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 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Definição e inicialização das variáveis * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ //Aqui iremos definir as variáveis 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 // Seleção da linha 1 #define SEL_LINHA2 0b00001101 // Seleção da linha 2 #define SEL_LINHA3 0b00001011 // Seleção da linha 3 #define SEL_LINHA4 0b00000111 // Seleção da linha 4 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Entradas * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ //Aqui iremos definir as entradas do sistema #define COL1 PIN_A4 #define COL2 PIN_A5 #define COL3 PIN_A0 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Saídas * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ //Aqui iremos definir as saídas do sistema #define RS PIN_E2 // Pino de seleção de modo do display #define EN PIN_E1 // Pino de habilitação do display /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Prototipagem das funções *

Page 23: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 23

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ //Aqui iremos declarar todas as funções definidas pelo usuário 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 } } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Inicialização do Sistema * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void Inicializa(void) { delay_ms(2000); setup_adc_ports(no_analogs); // Todos os AD´s desligados setup_ccp1(CCP_PWM); // Confirura modo CCP para PWM setup_ccp2(CCP_PWM);

Page 24: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 24

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 interrupção de timer 0 enable_interrupts(GLOBAL); // Habilita todas as interrupções 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);

Page 25: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 25

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% * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

Page 26: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 26

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 interrupções output_low(RS); // Põe pino de RS em baixo, modo comando output_d(dado); // Põe o dado no portd delay_cycles(2); // Aguarda 2 us, acomodação output_high(EN); // Gera pulso de clock delay_cycles(2); output_low(EN); delay_ms(1); // Aguarda 1ms enable_interrupts(GLOBAL); // Liga as interrupções } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Rotina para escrever dados no display * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void Lcd_Dado(char dado) { disable_interrupts(GLOBAL); // Desliga as interrupções output_high(RS); // Seta o pino RS, modo dado output_d(dado); // Põe o dado no portd delay_cycles(2); // Aguarda 2us, acomodação output_high(EN); // Gera pulso de clock delay_cycles(2); output_low(EN); delay_ms(1); // Aguarda 1ms enable_interrupts(GLOBAL); // Liga as interrupções } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Tratamento da Interrupção de Timer 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #int_timer0 void Ist_Timer0(void) { indice++; // Incrementa indice switch(indice) // Seleção de casos com indice

Page 27: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 27

{ 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: // Caso seja 4... indice=0; // 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 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

Page 28: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 28

Page 29: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 29

/**********ELABORANDO O DÉCIMO-PRIMEIRO PROJETO COM MICROCONTROLADOR PIC********* ******************************************************************************** *****OBJETIVO:RELÓGIO DIGITAL COM DISPLAY DE LCD 16X2 E TECLADO MATRICIAL ****** ******************************************************************************** *FERRAMENTAS UTILIZADAS: MICROCONTROLADOR, LCD 16X2, GRAVADOR PICKIT2, PROTOBORD *FONTE DE ALIMENTAÇÃO, COMPILADOR PCW, SIMULADOR PIC SIMULATOR IDE E BOTÃO****** ******************************************************************************** ****************APRENDER COMO CRIAR FUNÇÕES 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 seleção de modo do display #Define en pin_e1 // pino de habilitação 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

Page 30: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 30

//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 inicialização 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 interrupções output_low(rs) ; // põe pino de rs em baixo, modo comando output_d(dado) ; // põe o dado no PORTD delay_cycles(2) ; // aguarda 2 us, acomodação output_high(en) ; // gera pulso de clock delay_cycles(2) ; output_low(en) ; delay_ms(1) ; // aguarda 1ms enable_interrupts(global) ; // liga As interrupções }

Page 31: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 31

void lcd_dado(char dado) { disable_interrupts(global) ; // desliga As interrupções output_high(rs) ; // seta o pino rs, modo dado output_d(dado) ; // põe o dado no PORTD delay_cycles(2) ; // aguarda 2us, acomodação output_high(en) ; // gera pulso de clock delay_cycles(2) ; output_low(en) ; delay_ms(1) ; // aguarda 1ms enable_interrupts(global) ; // liga As interrupções } #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: 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 break; // 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

Page 32: Apostila PIC

Microcontrolador PIC Programando em C Prof.º Fabio Caldas & Marcos Felipe

Prof.º Fabio Caldas & Marcos Felipe Página 32

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_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 } }