Ir ao conteúdo

Ajuda com LCD


graccula

Posts recomendados

Postado

Pessoal,

Procurei por tópicos sobre comunicação do LCD com o 8051. Achei nada. Será que estou procurando com as palavras chaves erradas?

Alguém tem experiência com a comunicação com o LCD? Na verdade, atualmente eu estou precisando de uma dica de como testar se o LCD está funcionando corretamente, pois eu fiz um programa seguindo todas as instruções que eu achei em um tutorial, e no simulador funciona. Na hora que eu gravo o programa no 8051, nem sinal de vida do LCD.

E eu fiz um teste para gravar uma programação que piscasse um LED e funcionou. Ou seja, não é problema no processo de gravação nem de execução... Deve ser alguma coisa bem *****, mas empaquei.

Alguém sabem uma forma simples de verificar se o LCD está funcionando? Tipo, para testar auto-falantes, o teste mais básico é encostar uma pilha nos terminais. E o LCD? Tem alguma coisa pra fazer ele acender sem ser via programação?

Ah! Pelo menos consegui fazer acender o backlight!

PS.: Mais tarde eu posto a programação que estou usando e o modelo do LCD.

Obrigado,

Renato

Postado

De qqer forma, estou usando o LCD Winstar WH1602A, que pelo datasheet (http://www.winstar.com.tw/products_detail_ov.php?ProID=21) dá pra ver que ele usa o controlador KS0066. O MCU que estou usando é um AT89S52.

O código é esse:

Editado, 20080702 2207

Organizei os códigos assim:

Hello World LCD - Primeira versão que eu peguei de uma revista. Funciona, mas é mais complicado pois o código fica responsável por ativar/desativar o ENABLE do LCD.

Hello World LCD v2 - Nesta versão eu achei outro exemplo que utiliza I/O Mapeado. Ou seja, eu liguei o LCD na porta P0 e estou utilizando o WR\ para "conversar" automaticamente com o LCD. Desse jeito eu não preciso utilizar o RW para consultar o Busy e também não preciso ficar lidando com o EN.

Veja os códigos acima em PDF no endereço: http://lcd8051.4shared.com

[]s

  • Membro VIP
Postado

Renato, sei que não é culpa, mas fica horrível de entender o programa sem tabulação aqui. Sugiro que faça como eu: Se o programa for curto, capture a tela e mostre como imagem, se for longo, imprima em PDF e hospede no 4shared e poste o link. OK?

mais uma coisa... evite escrever tudo em maiúsculo, só se for mais fácil pra você.

Postado
Renato, sei que não é culpa, mas fica horrível de entender o programa sem tabulação aqui. ... evite escrever tudo em maiúsculo, só se for mais fácil pra você.

Soschip, é verdade, ficou horroroso. Vou editar o post. Até mesmo porque eu gosto de criar esses posts, pois como eletrônica para mim é um hobby eu fico as vezes um tempo sem estudar, com esses posts eu revejo as coisas que eu penei pra aprender.

Vou dar um tapa lá. Valeu!

[]s

Renato

Postado
fopi você quem fez o programa? se sim, poderia também comenta-lo? por favor.

Lucas, eu peguei esse código de uma revista. Vou fazer os comentários para você e vou publicar de uma forma melhor, como o soschip sugeriu...

Mas já te adianto que estou usando outro código, pois esse está usando uma forma de acessar o LCD que não é a melhor. Agora estou usando um código que simula I/O mapeado para acessar o LCD. Ficou bem mais clean!

Vou postar os dois códigos para termos como referencia. Vale lembrar que no simulador eu consegui fazer os dois programas funcionar. E no real, nenhum! Mas eu chego lá!

[]s

Renato

Postado

Ah!

Mais duas coisas:

1. Quando um programa atinge o "END", o que o MCU faz? Termina efetivamente e pára no estado que o programa o deixou, ou reinicia começando o programa novamente? Pergunto isso pois no simulador do Proteus, toda vez que o END é atingido, o simulador começa tudo de novo... ???

2. Outra coisa, tenho separado as coisas da seguinte forma:

org 40h - aqui vai o programa principal.

org 100h - aqui vão as funções.

org 1FFF - aqui vai o END.

A dúvida é se o programa principal não tiver um long jump para o end, ele vai executar todas as linhas das funçoes até atingir o end, ou ele pula automaticamente?

  • Membro VIP
Postado

Só uma dica para melhorar...

ao invés de:

LCALL INIT_LCD ;

LCALL CLEAR_LCD

MOV A, #'H'

LCALL WRITE_TEXT

MOV A, #'E'

LCALL WRITE_TEXT

MOV A, #'L'

LCALL WRITE_TEXT

MOV A, #'L'

LCALL WRITE_TEXT

MOV A, #'O'

LCALL WRITE_TEXT

MOV A, #' '

LCALL WRITE_TEXT

MOV A, #'W'

LCALL WRITE_TEXT

MOV A, #'O'

LCALL WRITE_TEXT

MOV A, #'R'

LCALL WRITE_TEXT

MOV A, #'L'

LCALL WRITE_TEXT

MOV A, #'D'

LCALL WRITE_TEXT

tente isto:

____________mov Rn,#11d ;Rn = r0 a r7 e 11 é o número de caracteres.

_______________________;você pode pegar até 255 caracteres nesta rotina

____________mov dptr,0600h ;qualquer endereço onde colocará a frase.

____________clr a ;zera acumulador para não somar na próxima instrução

pega: _______movc a,@a+dptr ;pega o caractere

____________ LCALL WRITE_TEXT; seu código

____________inc dptr;aponta próximo caractere

____________djnz Rn,pega ;decrementa Rn e se não zerou, pega próximo

;

;

;

;

;

org 0600h ; tabela

db 'HELLO WORLD'

---------------------------

não fica melhor???

Do jeito que fez, já pensou se fosse colocar uma frase de 32 caracteres...

E se fosse display de 40 x 4...

  • Membro VIP
Postado

ps. esqueci da intrução --> inc dptr

mas já coloquei acima.

Quando você usa db, está definindo byte ou bytes

Entre ' ', vale o código ASCII do caractere dentro dos apóstrofos.

Quando compilar, verá no código HEX a sequencia de códigos ASCII a partir do endereço determinado por org xxxx.

Veja as páginas 26, 27, ... deste manual: http://www.acebus.com/download/Win8051.pdf

Lembrando que DB, DW, ORG, etc não fazem parte do set de instruções, mas sim das IDEs.

Pra entender melhor, só estudando as instruções de cada.

Postado
pode explicar como é isso com o DB?

Lucas, complementando a informação do soschip, DB é um tipo de alias para um endereço de memória, como um campo de um banco de dados mesmo. você usa o ORG para dizer qual endereço de memória aquele banco começa e a partir dali você pode ir inserindo informações, como mensagens, mapeamento de teclas, etc.

Apenas lembre-se que cada DB está apontado para um endereço de memória. Não coloque mais informação que o endereço de memória do DB seguinte.

[]s

Renato

Postado
ps. esqueci da intrução --> inc dptr

mas já coloquei acima.

soschip, eu vi seu código. Estou usando alguma coisa parecida na segunda versão do meu código. Fica bem melhor mesmo.

O que eu estou intrigado agora é com a documentação do KS0066U, que é o controlador do LCD que eu comprei.

Nessa documentação, diz que o MC ao ser ligado já faz uma rotina de iniciação parecida com a que estou fazendo via código. E o mais interessante é que enquanto isso, ele mantém o Busy Flag em alto.

Aí fiquei pensando com meus botõe: será que não estou enviando um monte de instruções para o LCD enquanto ele está ocupado fazendo um boot? Pode ser exatamente esse o problema, afinal de contas eu não estou verificando na minha programação se o LCD está pronto para receber informações, eu simplesmente saio disparando comandos...

Bom, vou estudar mais, depois volto.

Abraço

Renato

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!