Moderadores: andre_luis, 51, guest2003, Renie
#include <16F876A.h>
#device adc=10
#use delay(clock=4000000)
#fuses xt,nolvp,nowdt
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição de Saídas *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#define RS PIN_B0 // Pino de seleção de modo do display
#define EN PIN_B1 // Pino de habilitação do display
#define D7 PIN_B5 // Pino de dados 7
#define D6 PIN_B4 // Pino de dados 6
#define D5 PIN_B3 // Pino de dados 5
#define D4 PIN_B2 // Pino de dados 4
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Prototipagem de Funções *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd(void);
void lcd_inst4(unsigned char dado);
void lcd_inst(unsigned char dado);
void lcd_dado(char dado);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Bloco Principal de Programa *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void main(void)
{
inicializa_lcd(); //Chama função de inicialização lcd
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); //Frequência Externa
//Prescaler 1:1
setup_adc(ADC_CLOCK_DIV_8); // Configura clock da conversão
setup_adc_ports(RA0_ANALOG); // Configura A/D
set_adc_channel(0); // Lê a entrada 0
while(1)
{
long frequencia=0;
float tensao;
tensao=read_adc()*0.1212; //Lê tensão e multiplica por constante
//para achar tensão AC
lcd_inst(0x86); //Posiciona o cursor na segunda linha
printf(lcd_dado,"%03.2f V",tensao); //Mostra a tensão medida
set_timer1(0); //Inicia com contador zerado
delay_ms(1000); //Delay de 1 segundo
frequencia=get_timer1(); //Pega a frequência medida
lcd_inst(0xC6); //Posiciona o cursor na segunda linha
printf(lcd_dado,"%03lu Hz",frequencia);//Mostra a frequência medida
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Rotina de Inicialização de LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd(void)
{
lcd_inst4(0b00000011);
delay_ms(15);
lcd_inst4(0b00000011);
delay_ms(15);
lcd_inst4(0b00000011);
delay_ms(15);
lcd_inst4(0b00000010);
delay_ms(15);
lcd_inst(0b00101000);
delay_ms(15);
lcd_inst(0b00001100);
delay_ms(15);
lcd_inst(0b00000110);
delay_ms(15);
lcd_inst(0b00000001);
delay_ms(100);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Rotina de Envio de Comando para o LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void lcd_inst4(unsigned char dado)
{
output_low(RS); //Limpa o pino RS, modo comando
delay_us(100);
if (dado & 0b00001000) output_high(D7); //Se o bit estiver em 1 liga a saída
else output_low(D7); //Caso contrário desliga a linha
if (dado & 0b00000100) output_high(D6); //Se o bit estiver em 1 liga a saída
else output_low(D6); //Caso contrário desliga a linha
if (dado & 0b00000010) output_high(D5); //Se o bit estiver em 1 liga a saída
else output_low(D5); //Caso contrário desliga a linha
if (dado & 0b00000001) output_high(D4); //Se o bit estiver em 1 liga a saída
else output_low(D4); //Caso contrário desliga a linha
delay_us(100);
output_high(EN); //Gera pulso de enable
delay_us(150); //Aguarda 150 us
output_low(EN);
delay_ms(5); //Faz a inicialização do display
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Rotina de Envio de Comando para o LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void lcd_inst(unsigned char dado)
{
output_low(RS); //Limpa o pino RS, modo comando
delay_us(100);
if (dado & 0b10000000) output_high(D7); //Se o bit estiver em 1 liga a saída
else output_low(D7); //Caso contrário desliga a linha
if (dado & 0b01000000) output_high(D6); //Se o bit estiver em 1 liga a saída
else output_low(D6); //Caso contrário desliga a linha
if (dado & 0b00100000) output_high(D5); //Se o bit estiver em 1 liga a saída
else output_low(D5); //Caso contrário desliga a linha
if (dado & 0b00010000) output_high(D4); //Se o bit estiver em 1 liga a saída
else output_low(D4); //Caso contrário desliga a linha
delay_us(100);
output_high(EN); //Gera pulso de enable
delay_us(1); //Aguarda 150 us
output_low(EN);
if (dado & 0b00001000) output_high(D7); //Se o bit estiver em 1 liga a saída
else output_low(D7); //Caso contrário desliga a linha
if (dado & 0b00000100) output_high(D6); //Se o bit estiver em 1 liga a saída
else output_low(D6); //Caso contrário desliga a linha
if (dado & 0b00000010) output_high(D5); //Se o bit estiver em 1 liga a saída
else output_low(D5); //Caso contrário desliga a linha
if (dado & 0b00000001) output_high(D4); //Se o bit estiver em 1 liga a saída
else output_low(D4); //Caso contrário desliga a linha
delay_us(10);
output_high(EN); //Gera pulso de enable
delay_us(150); //Aguarda 150 us
output_low(EN);
delay_ms(5); //Faz a inicialização do display
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Rotina de Envio de Dados para o LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void lcd_Dado(char dado)
{
output_high(RS); //Limpa o pino RS, modo comando
delay_us(100);
if (dado & 0b10000000) output_high(D7); //Se o bit estiver em 1 liga a saída
else output_low(D7); //Caso contrário desliga a linha
if (dado & 0b01000000) output_high(D6); //Se o bit estiver em 1 liga a saída
else output_low(D6); //Caso contrário desliga a linha
if (dado & 0b00100000) output_high(D5); //Se o bit estiver em 1 liga a saída
else output_low(D5); //Caso contrário desliga a linha
if (dado & 0b00010000) output_high(D4); //Se o bit estiver em 1 liga a saída
else output_low(D4); //Caso contrário desliga a linha
delay_us(10);
output_high(EN); //Gera pulso de enable
delay_us(1); //Aguarda 150 us
output_low(EN);
if (dado & 0b00001000) output_high(D7); //Se o bit estiver em 1 liga a saída
else output_low(D7); //Caso contrário desliga a linha
if (dado & 0b00000100) output_high(D6); //Se o bit estiver em 1 liga a saída
else output_low(D6); //Caso contrário desliga a linha
if (dado & 0b00000010) output_high(D5); //Se o bit estiver em 1 liga a saída
else output_low(D5); //Caso contrário desliga a linha
if (dado & 0b00000001) output_high(D4); //Se o bit estiver em 1 liga a saída
else output_low(D4); //Caso contrário desliga a linha
delay_us(10);
output_high(EN); //Gera pulso de enable
delay_us(150); //Aguarda 150 us
output_low(EN);
delay_ms(3); //Faz a inicialização do display
}
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante