10
Lcd_lcd #include <16f877A.h> // microcontrolador utilizado #device adc=10 #fuses xt,nowdt,noprotect,put,brownout,nolvp,nocpd,nowrt // configuração dos fusíveis #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 variável 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); // ENABLE = 1 delay_us(250); // Recomendado para estabilizar o LCD output_low(lcd_enable); // ENABLE = 0

Programa

Embed Size (px)

Citation preview

Page 1: Programa

Lcd_lcd

#include <16f877A.h> // microcontrolador utilizado #device adc=10 #fuses xt,nowdt,noprotect,put,brownout,nolvp,nocpd,nowrt // configuração dos fusíveis#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 variável e envia para o LCD.void envia_nibble_lcd(int dado)

{//Carrega as vias de dados (pinos) do LCD de acordo com o nibble lidooutput_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 enableoutput_high(lcd_enable); // ENABLE = 1delay_us(250); // Recomendado para estabilizar o LCDoutput_low(lcd_enable); // ENABLE = 0return; // Retorna ao ponto de chamada}

/* Envio de Byte para o LCD */

//Esta rotina irá enviar um dado ou um comando para o LCD conforme abaixo:// ENDEREÇO = 0 -> a variável DADO será uma instrução// ENDEREÇO = 1 -> a variável DADO será um caractere

void envia_byte_lcd(boolean endereco, int dado){output_bit(lcd_rs,endereco); // Seta o bit RS para instrução ou caracteredelay_us(250); // Aguarda 100 us para estabilizar o pino do LCDoutput_low(lcd_enable); // Desativa a linha ENABLEenvia_nibble_lcd(dado>>4); // Envia a parte ALTA do dado/comandoenvia_nibble_lcd(dado & 0x0f); // Limpa a parte ALTA e envia a parte BAIXA do // dado/comandodelay_us(250); // Aguarda 40us para estabilizar o LCDreturn; // Retorna ao ponto de chamada da função

Page 2: Programa

}

void escreve_lcd(int c) {envia_byte_lcd(1,c); } /* Função para limpar o LCD */void limpa_lcd(){envia_byte_lcd(0,0x01); // Envia instrução para limpar o LCDdelay_ms(250); // Aguarda 2ms para estabilizar o LCDreturn; // Retorna ao ponto de chamada da função}

/*Inicializa o LCD */

void inicializa_lcd(){output_low(lcd_db4); // Garante que o pino DB4 estão em 0 (low)output_low(lcd_db5); // Garante que o pino DB5 estão em 0 (low)output_low(lcd_db6); // Garante que o pino DB6 estão em 0 (low)output_low(lcd_db7); // Garante que o pino DB7 estão em 0 (low)output_low(lcd_rs); // Garante que o pino RS estão em 0 (low)output_low(lcd_enable); // Garante que o pino ENABLE estão em 0 (low)delay_ms(15); // Aguarda 15ms para estabilizar o LCDenvia_nibble_lcd(0x03); // Envia comando para inicializar o displaydelay_ms(5); // Aguarda 5ms para estabilizar o LCDenvia_nibble_lcd(0x03); // Envia comando para inicializar o displaydelay_ms(5); // Aguarda 5ms para estabilizar o LCDenvia_nibble_lcd(0x03); // Envia comando para inicializar o displaydelay_ms(5); // Aguarda 5ms para estabilizar o LCDenvia_nibble_lcd(0x02); // CURSOR HOME Envia comando para 0 o contadordelay_ms(1); // Aguarda 1ms para estabilizar o LCDenvia_byte_lcd(0,0x28); // FUNCTION SET - Configura o LCD para 4 bits,envia_byte_lcd(0,0x0c); // DISPLAY CONTROL - Display ligado, sem cursorlimpa_lcd(); // Limpa o LCDenvia_byte_lcd(0,0x06); // ENTRY MODE SET - Desloca o cursor para a direitareturn; // Retorna ao ponto de chamada da função}

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

Page 3: Programa

#include<lcd_lcd.h> // inclui a rotina do lcd#fuses xt,nowdt,noprotect,put,brownout,nolvp,nocpd,nowrt // configuração dos fusíveis#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 // transistor display#define rb4 pin_b4 // transistor pwm#define Display1 pin_b7 // Display 1 ligado ao pino pin_b6#define Display2 pin_b6 // Display 2 ligado ao pino pin_b7#define botao0 pin_b0 // botao no pin b0#define botao1 pin_a1 // botao no pin b1#define botao2 pin_a2 // botao no pin b2#define botao3 pin_a3 // botao no pin b3byte h = (0b01110110); // h byte a = (0b01110111); // a byte const digito[] = { 0b10111111, // 0 Define cada segmento 0b10000110, // 1 dos valores mostrados 0b11011011, // 2 no display de LEDs 0b11001111, // 3 em binário para ficar 0b11100110, // 4 mais fácil de codificar 0b11101101, // 5 cada dígito dos valores 0b11111101, // 6 mostrados no display. 0b10000111, // 7 0b11111111, // 8 0b11100111}; // 9

/******************** interrupcao ********************/void intr(){inicializa_lcd(); // inicializa o LCDwhile (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; }}

Page 4: Programa

/******************** lcd ********************/

void lcd_total(){ setup_adc_ports (no_analogs); // SET PORTAS ADC COMO NO_ANALOGS

while (true) //loop infinito { output_high (Rb4); // SET 1 RB4 output_high (Rb5); // SET 1 RB5 envia_byte_lcd(0,0x80); // COLOCA O CURSOR DO LCD P/ A ESQ DA 1ªLINHA printf(escreve_lcd,"engenharia"); // ESCREVE ENGENHARIA envia_byte_lcd(0,0xc0); // COLOCA O CURSOR DO LCD P/ A ESQ DA 2ª LINHA printf(escreve_lcd,"mecatronica"); // ESCREVE MECATRONICA delay_ms(2000); // espera 2 segundos break; // 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); //SET A PORTA DE SAIDA output_high (Rb4); // SET 1 RB4

output_low (Rb5); // SET 0 RB5 while (TRUE) //loop infinito {

limpa_lcd(); //LIMPA O LCD set_adc_channel(0); //SET CANAL DE ADC delay_us(100); // DELAY DE 100 MICRO SEG. duty=read_adc(); // LE A PORTA ADC duty=duty*1000; duty=duty/1023; set_pwm1_duty(duty); // SET SAIDA COMO DUTY

break; // interrompe o loop }; }/************************* sete segmentos **************************/void sete_seg() // Função principal{ int contador; // variável de contagem int unidade, dezena; // unidades da variável contador

setup_adc_ports(NO_ANALOGS); // Configura analógicos setup_adc(ADC_OFF); // ADC desligado setup_psp(PSP_DISABLED); // PSP desligado

Page 5: Programa

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(); // limpa lcd unidade = contador / 10; // Calcula a unidade dezena = contador - (unidade * 10); // Calcula a dezena output_low (Rb4); // Set 0 RB4 output_high (Rb5); // Set 1 Rb5 output_c (digito[unidade]); // Apresenta Digito[unidade_do_contador] output_high (Display1); // Habilita display 1 delay_ms (50); // DELAY 50 MICRO SEGUNDOS output_low (Rb4); // SET 0 RB4 output_high (Rb5); // SET 1 RB5 output_low (Display1); // Desabilita display 1 output_c (digito[dezena]); // Apresenta Digito [dezena_do_contador] output_high (Display2); // Habilita display 2 delay_ms (50); // Aguarda 50ms para dar uma pausa no PIC output_low (Display2); // Desabilita display 2 }break; //Interrompe o loop infinito }}

/******************** voltiemtro ********************/void volt(){float valor;

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

Page 6: Programa

printf(esc_lcd,"%2.4f"valor); //escrever a variavel delay_ms(30); //delay para escrever no display (pode ser necessario

//mudar de acordo com o display printf(esc_lcd,"V"); // escreve V no display após a tensao lida break; // interrompe o loop infinito }}/************************* Rotina principal **************************/void main () //programa principal{

// configura os trisset_tris_a(0b00001111); // configuração da direção dos pinos de I/O aset_tris_b(0b00000001); // configuração da direção dos pinos de I/O bset_tris_c(0b00000000); // configuração da direção dos pinos de I/O cset_tris_d(0b00000000); // configuração da direção dos pinos de I/O dset_tris_e(0b00000000); // configuração da direção dos pinos de I/O e

// inicializa os portsporta=0x00; // limpa porta //set 0 para todas as portas aportb=0x00; // limpa portb //set 0 para todas as portas bportc=0x00; // limpa portc //set 0 para todas as portas cportd=0x00; // limpa portd //set 0 para todas as portas dporte=0x00; // limpa porte //set 0 para todas as portas e

port_b_pullups(true); // habilita pull-ups port b

while (true) // loop infinito {

if (!input(pin_b1)) //se pino b1 = 0 {lcd_total(); //executa programa lcd engenharia mecatronica}else if (!input(pin_b2)) //se pino b2 = 0 {sete_seg(); //executa programa contador no sete segmentos}else if (!input(pin_b0)) //se pino b0 = 0 {intr(); //executa programa interrupcao}else if (!input(pin_b3)) //se pino b3 = 0 {motor(); //executa programa motor pwm}

else volt(); //executa programa voltimetro

}