LCD não funciona ...

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

LCD não funciona ...

Mensagempor geraldomelo » 14 Nov 2007 05:36

Ola Pessoal ... gostaria de saber oque esta errado aqui ..... o lcd fica escrevendo um monte de caracteres que não tem nada haver tipo " !#$¨& "

oque pode estar acontecendo hein .... ai vai o código :

#include <16F876A.h>
#device adc=10
#use delay (clock=20000000)
#fuses HS,NOWDT,PUT,BROWNOUT,NOLVP
#use fast_io(a)
#use fast_io(B)
#include <regs_16F87x.h>
#include <mod_lcd_pic16f876a.c>


main()
{
long int valor;

cmcon=0; // desliga comparadores analógicos
set_tris_a (255);
set_tris_b (0);
set_tris_c (0);
portc=0;
porta=0; // inicica o port A todo em 0
portb=0; // inicia o port b em 0
setup_adc_ports (ra0_analog); // faz ra0 entrada de leitura
setup_adc (adc_clock_internal);
set_adc_channel(0); // seleciona canal de conversão
delay_us(20);



While (true) // Enquanto for 1 (verdade)

{

lcd_escreve ('\f'); // apaga ldc

printf (lcd_escreve, "tensao = ");
delay_ms(200);

valor = read_adc ();
delay_us(20);

if (valor>0 && valor<200)
{portb=0;
portb=1;}

If (valor>200 && valor<400)
{portb=0;
portb=2;}

if (valor>400 && valor<600)
{portb=0;
portb=4;}

if (valor>600 && valor<1000)
{portb=0;
portb=8;}

if (valor>1000 && valor<1024)
{ portb=0;
portb=16;}


}

}


aqui vai a biblioteca do Fábio , que eu modifiquei só os pinos nos defines

/************************************************************************/
/* MOD_LCD_PIc16F876A.C - Biblioteca de manipulação de módulo LCD */
/* */
/* Autor: Fábio Pereira */
/* */
/************************************************************************/

// As definições a seguir são utilizadas para acesso aos pinos do display
// caso o pino RW não seja utilizado, comente a definição lcd_rw
#ifndef lcd_enable
#define lcd_enable pin_c0 // pino enable do LCD
#define lcd_rs pin_C2 // pino rs do LCD
//#define lcd_rw pin_C1 // pino rw do LCD
#define lcd_d4 pin_c4 // pino de dados d4 do LCD
#define lcd_d5 pin_c5 // pino de dados d5 do LCD
#define lcd_d6 pin_c6 // pino de dados d6 do LCD
#define lcd_d7 pin_c7 // pino de dados d7 do LCD
#endif

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 linhas
#define lcd_seg_lin 0x40 // Endereço da segunda linha na RAM do LCD

// a constante abaixo define a seqüência de inicialização do módulo LCD
byte CONST INI_LCD[4] = {0x20 | (lcd_type << 2), 0xf, 1, 6};

byte lcd_le_byte()
// lê um byte do LCD (somente com pino RW)
{
byte dado;
// configura os pinos de dados como entradas
input(lcd_d4);
input(lcd_d5);
input(lcd_d6);
input(lcd_d7);
// se o pino rw for utilizado, coloca em 1
#ifdef lcd_rw
output_high(lcd_rw);
#endif
output_high(lcd_enable); // habilita display
dado = 0; // zera a variável de leitura
// lê os quatro bits mais significativos
if (input(lcd_d7)) bit_set(dado,7);
if (input(lcd_d6)) bit_set(dado,6);
if (input(lcd_d5)) bit_set(dado,5);
if (input(lcd_d4)) bit_set(dado,4);
// dá um pulso na linha enable
output_low(lcd_enable);
output_high(lcd_enable);
// lê os quatro bits menos significativos
if (input(lcd_d7)) bit_set(dado,3);
if (input(lcd_d6)) bit_set(dado,2);
if (input(lcd_d5)) bit_set(dado,1);
if (input(lcd_d4)) bit_set(dado,0);
output_low(lcd_enable); // desabilita o display
return dado; // retorna o byte lido
}

void lcd_envia_nibble( byte dado )
// envia um dado de quatro bits para o display
{
// coloca os quatro bits nas saidas
output_bit(lcd_d4,bit_test(dado,0));
output_bit(lcd_d5,bit_test(dado,1));
output_bit(lcd_d6,bit_test(dado,2));
output_bit(lcd_d7,bit_test(dado,3));
// dá um pulso na linha enable
output_high(lcd_enable);
output_low(lcd_enable);
}


void lcd_envia_byte( boolean endereco, byte dado )
{
// coloca a linha rs em 0
output_low(lcd_rs);
// aguarda o display ficar desocupado
//while ( bit_test(lcd_le_byte(),7) ) ;
// configura a linha rs dependendo do modo selecionado
output_bit(lcd_rs,endereco);
delay_us(100); // aguarda 100 us
// caso a linha rw esteja definida, coloca em 0
#ifdef lcd_rw
output_low(lcd_rw);
#endif
// desativa linha enable
output_low(lcd_enable);
// envia a primeira parte do byte
lcd_envia_nibble(dado >> 4);
// envia a segunda parte do byte
lcd_envia_nibble(dado & 0x0f);
}


void lcd_ini()
// rotina de inicialização do display
{
byte conta;
output_low(lcd_d4);
output_low(lcd_d5);
output_low(lcd_d6);
output_low(lcd_d7);
output_low(lcd_rs);
#ifdef lcd_rw
output_high(lcd_rw);
#endif
output_low(lcd_enable);
delay_ms(15);
// envia uma seqüência de 3 vezes 0x03
// e depois 0x02 para configurar o módulo
// para modo de 4 bits
for(conta=1;conta<=3;++conta)
{
lcd_envia_nibble(3);
delay_ms(5);
}
lcd_envia_nibble(2);
// envia string de inicialização do display
for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}

void lcd_pos_xy( byte x, byte y)
{
byte endereco;
if(y!=1)
endereco = lcd_seg_lin;
else
endereco = 0;
endereco += x-1;
lcd_envia_byte(0,0x80|endereco);
}

void lcd_escreve( char c)
// envia caractere para o display
{
switch (c)
{
case '\f' : lcd_envia_byte(0,1);
delay_ms(2);
break;
case '\n' :
case '\r' : lcd_pos_xy(1,2);
break;
case '\b' : lcd_envia_byte(0,0x10);
break;
default : lcd_envia_byte(1,c);
break;
}
}

char lcd_le( byte x, byte y)
// le caractere do display
{
char valor;
// seleciona a posição do caractere
lcd_pos_xy(x,y);
// ativa rs
output_high(lcd_rs);
// lê o caractere
valor = lcd_le_byte();
// desativa rs
output_low(lcd_rs);
// retorna o valor do caractere
return valor;
}


obrigado

Geraldo ..
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor ze » 14 Nov 2007 06:23

desliga comp analógicos cmcon=0xff;
não vi lcd_init() no main();
obs pessoal: suas rotinas lcd poderiam ser MUI+ simples.
abrç;
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor geraldomelo » 15 Nov 2007 05:26

Ola pessoal ..Bom , agora funcionou ... Lellis , tava faltando o LCD_ini() ... não tinha reparado ... bom , mas agora vem as duvidas ... e são várias ... hehh .. vamos lá :

1ª) Como eu não estou usando o R/W do lcd (está aterrado) então a parte da biblioteca para a leitura do pino não está sendo usada ( está comentada conforme recomendado) , então o meu portC , onde esta ligado meu LCD , seria só saída , pois então eu fui usar fast_io (c) , e usei o trisC para saida , mas ai não funciona , o LCD fica loko ... queria fazer isso , pois economiza umas 100 linhas de código .. gostaria de saber como fazer para funcionar ...

2ª) No caso de eu querer mandar os comandos do próprio LCD , como abaixo , como faria ?? :

$FE, 1 Clear display
' $FE, 2 Return home
' $FE, $0C Cursor off
' $FE, $0E Underline cursor on
' $FE, $0F Blinking cursor on
' $FE, $10 Move cursor left one position
' $FE, $14 Move cursor right one position
' $FE, $80 Move cursor to beginning of first line
' $FE, $C0 Move cursor to beginning of second line

existem outros comandos ?? ou mesmo funções da biblioteca além de apagar o display e posicionar o cursor ??

3ª) Ainda não sei , ou é meio confuso para mim , o uso desses simbolos "\ " e "%" .. exemplo : \f , \r , %lu , %u ... alguém poderia explicar melhor , ou dar alguns exemplos ? com certeza deve ter outros , tem alguma tabelinha doque cada um faz ?/

4ª) Por ultimo , ,Lellis , porque vc disse que as rotinas lcd poderiam ser MUI mais simples ? poderia nos dar umas dicas ???


quanta pergunta hein pessoal ,,, podem mandar a conta pra mim depois ... heheh

abraços

Geraldo
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor ze » 16 Nov 2007 08:36

veja minhas rotinas lcd no post:

http://asm51.eng.br/phpBB/viewtopic.php ... highlight=

Veja um uso do sprintf usei-o numa função itoa() - (obs:se já tem na sua biblioteca, use-a) :

char* itoa(int value, char *string)
{
sprintf(string, "%d", value);
return string;
}

{
unsigned int t1;
...
itoa(t1,txt);
msgdsp(0,4,txt);
...
}

No começo parece difícil, mas depois piora. No final voce descobre que é impossível.
abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor ze » 16 Nov 2007 09:59

Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x