Sunteți pe pagina 1din 6

Lcd_lcd #include <16f877A.

h> // microcontrolador utilizado #device adc=10 #fuses xt,nowdt,noprotect,put,brownout,nolvp,nocpd,nowrt // configurao dos fusveis #use delay(clock=4000000) // define o clock do cristal #byte porta = 0x05 // define porta 0x05 como porta #byte portb = 0x06 // define porta 0x06 como portb #byte portc = 0x07 // define porta 0x07 como portc #byte portd = 0x08 // define porta 0x08 como portd #byte porte = 0x09 // define porta 0x09 como porte #define lcd_enable pin_d0 // pino enable do LCD #define lcd_rs pin_d1 // pino rs do LCD #define lcd_db4 pin_d4 // pino de dados d4 do LCD #define lcd_db5 pin_d5 // pino de dados d5 do LCD #define lcd_db6 pin_d6 // pino de dados d6 do LCD #define lcd_db7 pin_d7 // pino de dados d7 do LCD /* Envio de "Nibble" para o LCD */ //Esta rotina l o "Nibble" inferior de uma varivel e envia para o LCD. void envia_nibble_lcd(int dado) { //Carrega as vias de dados (pinos) do LCD de acordo com o nibble lido output_bit(lcd_db4, bit_test(dado,0)); //Carrega DB4 do LCD com o bit DADO<0> output_bit(lcd_db5, bit_test(dado,1)); //Carrega DB5 do LCD com o bit DADO<1> output_bit(lcd_db6, bit_test(dado,2)); //Carrega DB6 do LCD com o bit DADO<2> output_bit(lcd_db7, bit_test(dado,3)); //Carrega DB7 do LCD com o bit DADO<3> //Gera um pulso de enable output_high(lcd_enable); delay_us(250); output_low(lcd_enable); return; } /* Envio de Byte para o LCD */ //Esta rotina ir enviar um dado ou um comando para o LCD conforme abaixo: // ENDEREO = 0 -> a varivel DADO ser uma instruo // ENDEREO = 1 -> a varivel DADO ser um caractere void envia_byte_lcd(boolean endereco, int dado) { output_bit(lcd_rs,endereco); // Seta o bit RS para instruo ou caractere delay_us(250); // Aguarda 100 us para estabilizar o pino do LCD output_low(lcd_enable); // Desativa a linha ENABLE envia_nibble_lcd(dado>>4); // Envia a parte ALTA do dado/comando envia_nibble_lcd(dado & 0x0f); // Limpa a parte ALTA e envia a parte BAIXA do // dado/comando delay_us(250); // Aguarda 40us para estabilizar o LCD return; // Retorna ao ponto de chamada da funo

// ENABLE = 1 // Recomendado para estabilizar o LCD // ENABLE = 0 // Retorna ao ponto de chamada

} void escreve_lcd(int c) { envia_byte_lcd(1,c); } /* Funo para limpar o LCD */ void limpa_lcd() { envia_byte_lcd(0,0x01); delay_ms(250); return; }

// Envia instruo para limpar o LCD // Aguarda 2ms para estabilizar o LCD // Retorna ao ponto de chamada da funo

/*Inicializa o LCD */ void inicializa_lcd() { output_low(lcd_db4); output_low(lcd_db5); output_low(lcd_db6); output_low(lcd_db7); output_low(lcd_rs); output_low(lcd_enable); delay_ms(15); envia_nibble_lcd(0x03); delay_ms(5); envia_nibble_lcd(0x03); delay_ms(5); envia_nibble_lcd(0x03); delay_ms(5); envia_nibble_lcd(0x02); delay_ms(1); envia_byte_lcd(0,0x28); envia_byte_lcd(0,0x0c); limpa_lcd(); envia_byte_lcd(0,0x06); return; }

// Garante que o pino DB4 esto em 0 (low) // Garante que o pino DB5 esto em 0 (low) // Garante que o pino DB6 esto em 0 (low) // Garante que o pino DB7 esto em 0 (low) // Garante que o pino RS esto em 0 (low) // Garante que o pino ENABLE esto em 0 (low) // Aguarda 15ms para estabilizar o LCD // Envia comando para inicializar o display // Aguarda 5ms para estabilizar o LCD // Envia comando para inicializar o display // Aguarda 5ms para estabilizar o LCD // Envia comando para inicializar o display // Aguarda 5ms para estabilizar o LCD // CURSOR HOME Envia comando para 0 o contador // Aguarda 1ms para estabilizar o LCD // FUNCTION SET - Configura o LCD para 4 bits, // DISPLAY CONTROL - Display ligado, sem cursor // Limpa o LCD // ENTRY MODE SET - Desloca o cursor para a direita // Retorna ao ponto de chamada da funo

void esc_lcd(char c) { switch (c) { case '\f' : envia_byte_lcd(0,1); // SE CASO O DADO ENVIADO FOR FLOAT delay_ms(2); break; case '\n' : envia_byte_lcd(0,0xc0);break;// ENVIA DADO PARA LINHA 2 default : envia_byte_lcd(1,c); break;// SE CASO O DADO ENVIADO FOR CARACTERE } }

#include<lcd_lcd.h> // inclui a rotina do lcd #fuses xt,nowdt,noprotect,put,brownout,nolvp,nocpd,nowrt // configurao dos fusveis #use delay(clock=4000000) // define o clock do cristal #byte porta = 0x05 // define porta 0x05 como porta #byte portb = 0x06 // define porta 0x06 como portb #byte portc = 0x07 // define porta 0x07 como portc #byte portd = 0x08 // define porta 0x08 como portd #byte porte = 0x09 // define porta 0x09 como porte #define rb5 pin_b5 #define rb4 pin_b4 #define Display1 pin_b7 #define Display2 pin_b6 #define botao0 pin_b0 #define botao1 pin_a1 #define botao2 pin_a2 #define botao3 pin_a3 byte h = (0b01110110); byte a = (0b01110111); byte const digito[] = { 0b10111111, 0b10000110, 0b11011011, 0b11001111, 0b11100110, 0b11101101, 0b11111101, 0b10000111, 0b11111111, 0b11100111}; // transistor display // transistor pwm // Display 1 ligado ao pino pin_b6 // Display 2 ligado ao pino pin_b7 // botao no pin b0 // botao no pin b1 // botao no pin b2 // botao no pin b3 // h // a // 0 Define cada segmento // 1 dos valores mostrados // 2 no display de LEDs // 3 em binrio para ficar // 4 mais fcil de codificar // 5 cada dgito dos valores // 6 mostrados no display. // 7 // 8 // 9

/******************** interrupcao ********************/ void intr() { inicializa_lcd(); // inicializa o LCD while (true) //loop infinito { output_high (Rb4); // SET 1 RB4 output_high (Rb5); // SET 1 RB5 envia_byte_lcd(0,0x80); // COLOCA O CURSO DO LCD NA PRIMEIRA LINHA printf(escreve_lcd,"interrupcaoo"); //ESCREVE INTERRUPCAO output_c (a); // Apresenta A NO DISPLYA 7 SEGMENTOS DA DIREITA output_high (Display1); // Habilita display 1 delay_ms (50); // Aguarda 50ms para dar uma pausa no PIC output_low (Display1); // Desabilita display 1 output_c (h); // Apresenta H NO DISPLYA 7 SEG DA ESQUERDA output_high (Display2); // Habilita display 2 delay_ms (50); // Aguarda 50ms para dar uma pausa no PIC output_low (Display2); // Desabilita display 2 break; } }

/******************** lcd ********************/ void lcd_total() { setup_adc_ports (no_analogs); while (true) { output_high (Rb4); output_high (Rb5); envia_byte_lcd(0,0x80); printf(escreve_lcd,"engenharia"); envia_byte_lcd(0,0xc0); printf(escreve_lcd,"mecatronica"); delay_ms(2000); break; } }

// SET PORTAS ADC COMO NO_ANALOGS //loop infinito // SET 1 RB4 // SET 1 RB5 // COLOCA O CURSOR DO LCD P/ A ESQ DA 1LINHA // ESCREVE ENGENHARIA // COLOCA O CURSOR DO LCD P/ A ESQ DA 2 LINHA // ESCREVE MECATRONICA // espera 2 segundos // interrompe o loop

/************************* motor pwm **************************/ void motor() { float duty; setup_ADC_ports(ALL_ANALOG); // SET PORTAS ADC COMO ALL_ANALOGS delay_us(15); // delay de 15 microsegundos setup_timer_2(T2_DIV_BY_4,250,1); //SET TIMER 2 1 A CADA 250 ms setup_ccp1(CCP_PWM); output_high (Rb4); output_low (Rb5); while (TRUE) { limpa_lcd(); set_adc_channel(0); delay_us(100); duty=read_adc(); duty=duty*1000; duty=duty/1023; set_pwm1_duty(duty); break; }; //SET A PORTA DE SAIDA // SET 1 RB4 // SET 0 RB5 //loop infinito //LIMPA O LCD //SET CANAL DE ADC // DELAY DE 100 MICRO SEG. // LE A PORTA ADC

// SET SAIDA COMO DUTY // interrompe o loop

} /************************* sete segmentos **************************/ void sete_seg() // Funo principal { int contador; // varivel de contagem int unidade, dezena; // unidades da varivel contador

setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED);

// Configura analgicos // ADC desligado // PSP desligado

setup_spi(SPI_SS_DISABLED); // SPI delsigado setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);// Configura Timer 0 setup_timer_1(T1_DISABLED); // Configura Timer 1 setup_timer_2(T2_DISABLED,0,1); // Configura Timer 2

while (true) // Loop infinito { for (contador = 0; contador != 20; contador++) // Contagem de 00 at 20 { limpa_lcd(); unidade = contador / 10; dezena = contador - (unidade * 10); output_low (Rb4); output_high (Rb5); output_c (digito[unidade]); output_high (Display1); delay_ms (50); output_low (Rb4); output_high (Rb5); output_low (Display1); output_c (digito[dezena]); output_high (Display2); delay_ms (50); output_low (Display2); } break; } } // limpa lcd // Calcula a unidade // Calcula a dezena // Set 0 RB4 // Set 1 Rb5 // Apresenta Digito[unidade_do_contador] // Habilita display 1 // DELAY 50 MICRO SEGUNDOS // SET 0 RB4 // SET 1 RB5 // Desabilita display 1 // Apresenta Digito [dezena_do_contador] // Habilita display 2 // Aguarda 50ms para dar uma pausa no PIC // Desabilita display 2 //Interrompe o loop infinito

/******************** voltiemtro ********************/ void volt() { float valor; inicializa_lcd(); setup_adc_ports(AN0); setup_adc(ADC_CLOCK_DIV_2); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); envia_byte_lcd(0,0x80); printf(esc_lcd,"Tensao"); while(true) { output_high (Rb4); output_high (Rb5); set_adc_channel(0); delay_ms(1); valor = read_adc(); valor=valor*5/1023; envia_byte_lcd(0,0xc0); // SET 1 RB4 // SET 1 RB5 //faz a leitura do canal 0 do adc //delay obrigatorio do canal adc //transfere o valor para a variavel //converte de binario para decimal //vai para a segunda linha do lcd // inicializa o LCD // SET PORTA DE ENTRADA TENSO AN0 // CLOCK ADC DIVIDIDO POR 2 // DESATIVA PSP // DESATIVA SPI //move o lcd para o primeiro caractere //ESCREVE TENSAO NO DISPLAY //LOOP INFINITO

printf(esc_lcd,"%2.4f"valor); delay_ms(30); printf(esc_lcd,"V"); break; }

//escrever a variavel //delay para escrever no display (pode ser necessario //mudar de acordo com o display // escreve V no display aps a tensao lida // interrompe o loop infinito

} /************************* Rotina principal **************************/ void main () //programa principal {

// configura os tris set_tris_a(0b00001111); set_tris_b(0b00000001); set_tris_c(0b00000000); set_tris_d(0b00000000); set_tris_e(0b00000000);

// configurao da direo dos pinos de I/O a // configurao da direo dos pinos de I/O b // configurao da direo dos pinos de I/O c // configurao da direo dos pinos de I/O d // configurao da direo dos pinos de I/O e

// inicializa os ports porta=0x00; // limpa porta portb=0x00; // limpa portb portc=0x00; // limpa portc portd=0x00; // limpa portd porte=0x00; // limpa porte port_b_pullups(true); while (true) {

//set 0 para todas as portas a //set 0 para todas as portas b //set 0 para todas as portas c //set 0 para todas as portas d //set 0 para todas as portas e // habilita pull-ups port b // loop infinito

if (!input(pin_b1)) { lcd_total(); } else if (!input(pin_b2)) { sete_seg(); } else if (!input(pin_b0)) { intr(); } else if (!input(pin_b3)) { motor(); } else volt(); }

//se pino b1 = 0 //executa programa lcd engenharia mecatronica //se pino b2 = 0 //executa programa contador no sete segmentos //se pino b0 = 0 //executa programa interrupcao //se pino b3 = 0 //executa programa motor pwm //executa programa voltimetro

S-ar putea să vă placă și