Ir ao conteúdo
  • Cadastre-se

LCD16x1 com problemas


Caio Humberto Francisco

Posts recomendados

Boa tarde galera!

A um tempo atrás comprei um display de 16x1 da winstar (WH1601A-yyh-jtk#), ainda não tinha utilizado ele e hoje resolvi soldar os conectores para plugar na minha placa de desenvolvimento e brincar um pouco, gravei o pic16f877a com o hex de exemplo que veio com a placa de desenvolvimento e para minha surpresa só aparece no display blocos pretos e até a metade, suspeito que o display veio com problema, ou a placa de desenvolvimento/hex com problema, ou na soldagem eu estraguei tudo kkk Segue a imagem do display, se alguém tiver alguma ideia eu agradeço.

2cn70ya.jpg

Grato,

Link para o comentário
Compartilhar em outros sites

Boa noite Caio.

Você pode testar o display fora da placa com 5V nos pinos VSS e VCC usando um trimpot no pino contraste (VE) para ver se todos os blocos funcionam bem.

Caso todos os blocos apareçam e o ajuste de contraste funcione bem, verifique a sua programação e se a inicialização do display está correta.

Link para o comentário
Compartilhar em outros sites

Boa noite!

ricardospimentel vou fazer sim o teste no display, agradeço a dica.

Queiros19 segue o código exemplo que veio com a placa, uma coisa que eu só observei agora, o exemplo é para display de 16 por 2 e eu estou utilizando 16 x 1, os pinos eu acredito que estão certos, segue imagem.

#include<pic.h>

__CONFIG(0x1832);

#define rs RA0
#define rw RA1
#define e RA2

char nome[ ] = {"NM:Caio"};

void init();
void lcd_init();
void write(char x);
void lcd_enable();
void delay();
void writelcd(char *pt);

void main()
{
init();
lcd_init();

{
writelcd(nome);
PORTD = 0XC0;
lcd_enable();
}
while (1);
}

void init()
{
ADCON1 = 0X07;
RA1=1;
TRISA = 0X00;
TRISD = 0X00;
}

void lcd_init()
{
PORTD = 0X1;
lcd_enable();
PORTD = 0X38;
lcd_enable();
PORTD = 0X0e;
lcd_enable();
PORTD = 0X06;
lcd_enable();
PORTD = 0X80;
lcd_enable();
}

void write(char x)
{
PORTD = x;
rs = 1;
rw = 0;
e = 0;
delay();
e = 1;
}

void lcd_enable()
{
rs = 0;
rw = 0;
e = 0;
delay();
e = 1;
}

void delay()
{
int i;
for (i = 0;i < 5000;i++);
}

void writelcd(char *pt)
{
while(*pt)
write(*pt++);
}

96jdqd.png

Link para o comentário
Compartilhar em outros sites

Tem algumas falhas na sua rotina de inicialização.

1. Os pinos RS e RW devem estar em nível baixo na inicialização:

Pino "RS": 0=Comando e 1=Dados;

Pino "RW": 0=Gravação no display e 1=Leitura;

2. O byte que você enviou para o display foi o "0x38" que o inicializa como um display 16x2, no seu caso seria:

0x30

[Corrigindo aqui: Tanto faz nessa fase de inicialização que na sequência das três vezes, que por alguns é desprezada, seja usado o octeto 30h, 38h ou mesmo 3Fh, pois os 4 bits menos significativos não importam nesta fase]

3. Introduza na sua inicialização alguns delays afim de garantir que ele esteja pronto para se comunicar com o microcontrolador. Entre cada bit enviado para o barramento, podes usar 15ms.

4. A cada byte [nibble, ou comando] enviado, pulse o pino EN com 1 → 0 e não 0 → 1, pois enquanto o pino EN estiver no nível alto ele permanecerá estático.

[Na verdade, parece que tanto faz se a forma do pulso ENABLE é de 0 para um ou o inverso, o que deve saber neste caso é que o bit será contado na quina de transição do nível alto pro baixo]

Link para o comentário
Compartilhar em outros sites

Queiros19, o código não é meu não kkkk, eu comprei uma placa de desenvolvimento para o pic16f877, eu não achei o link dele mas achei o manual aqui, é xingilingi estava com um preço bom e ai comprei, o custo beneficio é muito ruim, tem que ficar configurando por jumper e o CD de exemplo é todo bugado, esse código que postei é do exemplo ou seja não estou aprendendo nada com a placa kkkkk

ricardospimentel, fiz as alterações que você disse mas não funcionou, eu comprei um display 16x2 hoje, e no final de semana vou soldar os conectores e testar, pois acho que eu queimei esse 16x1 :)

aphawk, que biblioteca você indica, eu prefiro CCS com PIC-C :) achei mais fácil de entender kkk

Vou procurar outro exemplo no google, mas acho que eu queimei mesmo o LCD pois eu liguei invertido ;/

Link para o comentário
Compartilhar em outros sites

Bom galera, o display 16x1 esta com problema e virou lixo :).

Seguindo a dica do aphawk eu pesquisei sobre as bibliotecas e achei essas http://www.ccsinfo.com/forum/viewtopic.php?t=24661, como eu gosto do CCS (PIC-C) utilizei esse.

O fonte pode ser baixado neste link

neste link

O esquema da placa de desenvolvimento pode ser visto aqui

Agradeço a ajuda de todos.

Moderador, pode fechar o post.

Link para o comentário
Compartilhar em outros sites

Legal, só acrescentando uma informaçãozinha até encerrar o tópico, eu fui conferir a sequência de inicialização, mas manualmente, e é assim mesmo:

►Liga o display;

►Espera os 15ms (como iniciei manualmente, por mais rápido que eu consiga pulsar meu dedo numa tecla, jamais conseguiria desrespeitar tal tempo);

►Pulsa três vezes a instrução [30h] ou [0011 0000] nos pinos de barramento. Mesmo sabendo que em cada um dos intervalos devemos ter um tempo preciso ditado pelos datasheets, é possível iniciá-lo usando tempos de 5ms para mais e até deixar de se usar os três pulsos dando apenas uma vez o comando [30h];

►Envia o comando para dizer ao display o tamanho dele que se for um display 16x1 será [30h] e se for de duas linhas [38h];

►Agora para efeito de prova, é interessante que se ponha o cursor a piscar, igual à linha de comando do DOS ou Linux dando ao display a instrução de [0Fh]. Sugiro que leia o datasheet de um lcd 16x2 ou do Chip HD44780 para ver outras instruções, bem como a manipulação do cursor;

Com isso o display já estará pronto para receber e manipular caracteres, só lembrando que a cada instrução ou byte ou nibble enviado ao display, deve-se pulsar o pino ENABLE de 0 para 1 e retorná-lo a 0, acho que é possível que se faça o inverso fazendo com que o lcd leia os bits de uma outra maneira e ainda o pino RW e RS devem sempre estar com seu nível lógico em 0.

Para se enviar os caracteres o pino RS deve estar em nível 1 e para cada byte (no modo 8 bits) ou nibble (em modo 4 bits) o pino ENABLE deve ser pulsado.

Isso feito na minha placapão funcionou, mas na MCU é o mesmo processo e recomendo novamente que leia os dataxites dos displays afim de entender seu funcionamento e elaborar seu driver de vídeo bem enxuto e de acordo com a sua necessidade.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!