Página 1 de 2
Escrita em LCD

Enviado:
04 Dez 2006 15:40
por lucflores
Ola
Eu costumo escrever em LCD da seguite maneira:
;PARA ESCREVER OI NO LCD
CALL INICIALIZA ;INICIALIZA O DISPLAY
CALL DELAY ;TEMPO
MOV P0,#'O' ;CARREGA "O" NO P0 ONDE ESTA LIGADO O LCD
CALL ESC ;ESCREVE NO LCD
MOV P0,#'I'
CALL ESC
FIM
Mas isso me serve quando é para escrever pouca coisa como faço para escrever frases e depois muda-las sem precisar fazer desse jeito de enviar letra por letra, ja vi métodos com tabela tais como:
tabela lcd:
db 'oi'
mas ou menos assim, mas não me lembro direito como funciona alguem saberia me informar?
Obrigado

Enviado:
04 Dez 2006 16:24
por Wagner de Queiroz
Como vc esta usando asm
tenta endereçamento indexado.
- Código: Selecionar todos
org 0600h
db 'Mensagem$' ; Minha mensagem com $ no final.
; Pode ser qualquer caracter que nao seja usado na mensagem como 00h
org 0000h
mov R0,5FFh ; Coloca em R0 o valor do endereco da mensagem menos 1
loop: inc R0 ; Incrementa R0
MOV Acc,@R0 ; Coloca o byte apontado por @R0 no acumulador
CJNE @R0,'$',LOOP ; Compara byte com $ que indica fim da mensagem.
LCALL EscreveLCD ; Chama rotina que vai escrever no display
Re: Escrita em LCD

Enviado:
04 Dez 2006 16:28
por R.B.Sanchez
Boa tarde.
Utilizo deste modo, para grandes mensagens ou em grandes quantidades o programa fica enxuto.
INI: CALL INILCD ;CHAMA INICIALIZAÇÃO DO LCD
TELA: MOV DPTR,#FRASE ;PREPARA 1ª MENSAGEM NA LINHA 1
MOV P0,#080h
CALL COMAND
CALL ESCCAR ;ESCREVE 1ª MENSAGEM
FRASE: DB 'MENSAGEM 01$'
END
Atenciosamente,
Renato.

Enviado:
04 Dez 2006 17:57
por lucflores
FIZ EXATAMENTE O QUE TU DISSE RENATO MAS NÃO FUNFA, TO INICIALIZANDO NA BOA, POIS MANDO ESCREVER UM CARACTER QUALQUER ANTES DE ENVIAR A MENSAGEM, MAS A MENSAGEM NÃO APAREÇE.
UMA DÚVIDA, POR QUE QUE TEM O MOV P0,#080H SE O VALOR TA NO DPTR ?
COMO A MCU VAI SABER QUE É PARA ENVIAR UMA MENSAGEM GRANDE ASSIM?
Ate quantos caracteres eu posso enviar assim que nem tu disse??
A pergunta pode ser idiota, mas eu realmente não consigo entender. Ha desculpem por te escrito em caixa alta so agora percebi.

Enviado:
04 Dez 2006 19:39
por pomboeletronic
no programa abaixo, para escrever outras mensagens basta acrescentar no fim do programa a mensagem desejada. por exemplo vamos escrever na linha 2 a mensagem "linha2"
basta acrescentar este codigo:
;******************************************
clr di ;LCD no modo instrução prepara o lcd para escrever na linha 2
mov a,#C0H ;coloca o cursor na linha 2 coluna 1
lcall write ;Envia instrução
mov dptr,#mensagemL2 ;Move "Mensagem" (linha 2) para DPTR
lcall escreve2
mensagemL2: db " linha 2 $"
;**************************************
para ecrever na mesma linha basta escrever
mov a,#0 ;Coloca 0 em acc
mov dptr,#msg7 ;Move "msg7" para dptr
lcall escreve2 ;Desvia para escreve2
msg7: db "Tecla 7 $"
;inicio do programa
#include <89S8252.inc> ;arquivo com informações sobre microcontrolador....
DI bit P1.5 ;0=instrução 1=dado
EN bit P1.6 ;0=desabilitado 1=habilitado
display equ P0
ORG 0
ljmp principal
principal:
clr DI ; Lcd no modo instruçao
clr EN ;desabilita lcd
lcall clear ;limpa lcd
lcall escreve ;rotina para escrita no lcd
ljmp $
;----------------------sub rotinas--------------
clear:
push acc ;Salva acc
clr di ;LCD no modo instrução
mov a,#38H ;caracter 5x7
lcall write ;Envia instrução
lcall write
mov a,#0cH ;cursor off, blink off
lcall write ;Envia instrução
mov a,#01H ;coloca o cursor na linha 1 coluna 1
lcall write ;Envia instrução
pop acc ;Restaura acc
ret ;Retorna
;-------------
write:
setb en ;Habilita LCD
mov display,a ;Coloca acc no display (P0)
lcall delay_1 ;Chama rotina de atraso
lcall delay_1 ;Chama rotina de atraso
lcall delay_1 ;Chama rotina de atraso
lcall delay_1 ;Chama rotina de atraso
lcall delay_1 ;Chama rotina de atraso
lcall delay_1 ;Chama rotina de atraso
lcall delay_1 ;Chama rotina de atraso
lcall delay_1 ;Chama rotina de atraso (atraso total em torno de 2ms pa CLK = 22MHz)
clr en ;Desabilita LCD
ret ;Retorna
;-------------
delay_1:
mov r0,#255 ;Coloca 255 em R0
aqui: djnz r0,aqui ;Decrementa R0. Enquanto não for 0, permanece aqui
ret ;Retorna
;-------------
escreve:
mov dptr,#mensagemL1 ;Move "Mensagem" (linha 1) para DPTR
lcall escreve2
clr di ;LCD no modo instrução
mov a,#C0H ;coloca o cursor na linha 2 coluna 1
lcall write ;Envia instrução
mov dptr,#mensagemL2 ;Move "Mensagem" (linha 2) para DPTR
lcall escreve2
ret
;-------------
escreve2:
mov a,#0 ;Coloca 0 em acc
movc a,@a+dptr ;Acc recebe acc + dptr
setb di ;LCD no modo dado
lcall write ;Envia dado
cjne a,#'$',desvio ;Enquanto acc não dor "$", vai para desvio
ret ;Retorna
;-----------
desvio:
inc dptr ;Incrementa dptr
ljmp escreve2 ;Desvia para escreve2
;-----------
mensagem1: db "LAB. ELETRONICA $"
end

Enviado:
04 Dez 2006 19:41
por R.B.Sanchez
Boa noite.
Para funcionar certo ainda falta a rotina de escrita e a de seleção de dado / instrução. O valor #080H corresponde a instrução para selecionar a 1ª coluna da 1ª linha.
No caso inicializa-se o LCD; move o valor contido em DB (pseudo-instrução para gerar um tabela / reserva posição para dados) para o DPTR (registrador de 16 bits); seleciona-se o cursor em uma posição entre as linhas e colunas; escreve este endereço de posição; escreve a sequência de caracter a partir da posição e das opções realizadas na inicialização.
Qualquer dúvida fico a disposição
Atenciosamente,
Renato.

Enviado:
04 Dez 2006 19:45
por R.B.Sanchez
Segue um exemplo das rotinas as quais mencionei:
;******************************************************************************
; ROTINA DE INICIALIZAÇÃO DO LCD
;******************************************************************************
INILCD: MOV P0,#039H ;inicializacao do display
CALL COMAND
MOV P0,#06H ;deslocamento do cursor a direita
CALL COMAND
MOV P0,#0CH ;mensagem aparente- cursor nao piscante
CALL COMAND
MOV P0,#01H ;limpa display
CALL COMAND
MOV P0,#080h ;posiciona cursor
CALL COMAND
RET
;******************************************************************************
; ROTINA DE MENSAGEM LCD
;******************************************************************************
ESCCAR: MOV A,#0
MOVC A,@A+DPTR
CJNE A,#'$',ESCPRO ;jump se acumulador for igual a zero (nova posicao)
;volta para escrever outro caracter
SJMP FIM
ESCPRO: MOV P0,A ;move o conteudo de A para P0 (lcd)
CALL DADO
INC DPTR
SJMP ESCCAR
FIM: RET
;******************************************************************************
; ROTINA DE COMANDO LCD
;******************************************************************************
COMAND: CLR P3.7 ;identifica comando
SETB P3.6 ;clock para display
CLR P3.6
JMP TEMPO1
;******************************************************************************
; ROTINA DE DADO LCD
;******************************************************************************
DADO: SETB P3.7 ;identifica dado
SETB P3.6 ;clock para display
CLR P3.6
JMP TEMPO1 ;jump para tomar mais tempo de um dado
Atenciosamente,
Renato.

Enviado:
04 Dez 2006 21:30
por lucflores
Fico muuuuito agradecido por vocês, vou testar amanha pela manhã e posto aqui se funfo tudo OK, por enquanto obrigado....

Enviado:
05 Dez 2006 09:32
por lucflores
Bom dia so para informar que funcionou beleza e mais uma vez agradeço a todos so tem uma coisa.
Quando envio a mensagem ex:
mesnsegem1: "OI $"
faço a comparação ( CJNE A,#'$',desvio )
mas no display aperece o $ mesmo assim, isso é normal? ficar aparecendo $ ?

Enviado:
05 Dez 2006 09:43
por brasilma
Normal não é, vc pode fazer com que a rotina suprima este ultimo caracter.

Enviado:
05 Dez 2006 09:48
por lucflores
vou tentar, Valeu....

Enviado:
05 Dez 2006 09:53
por psycoman
Aproveitando o topico de LCD gostaria de pedir uma ajuda, um tecnico amigo meu me arrmou um LCD 16x2 com controlado HD4478, vcs tem algum exemplo dele e da pinagem ? eustou dando uma olhada na internet, e no search daqui nao achei B)
grato.

Enviado:
05 Dez 2006 10:02
por lucflores
Cara, a maioria dos lcd 16x2 tem pinagem padrão, olha nesse link aqui a pinagem.
http://www.clcomercial.com.br/downloads ... h1602b.pdf
e aqui tem um conjunto de instruções padrões para lcds mais comuns:
0Eh à Display aceso com cursor fixo.
0Fh à Display aceso com cursor intermitente.
0Ch à Display aceso sem o cursor.
08h à Display apagado.
07h à Escreve deslocando a mensagem a esquerda.
05h à Escreve deslocando a mensagem a direita.
06h à Escreve deslocando o cursor a direita.
04h à Escreve deslocando o cursor a esquerda.
01h à Limpa display e retorna o cursor para a 1ª posição.
14h à Desloca somente o cursor a direita.
10h à Desloca somente o cursor a esquerda.
1Ch à Desloca cursor + mensagem a direita.
18h à Desloca cursor + mensagem a esquerda.
C0h à Desloca cursor para segunda linha primeira posição.
80h à Desloca cursor para primeira linha, primeira posição.
todo LCD tem que ser inicializado antes de enviar algum dado, tem que enviar um código de inicialização, que alguns números acima para poder ser inicializado de maneira correta antes de se enviar algum dado. por acaso sabe isso, se não grita ai, que te envio. Valeu...

Enviado:
05 Dez 2006 10:33
por Renie
Olá Psycoman!
Dê uma olhada no tutorial disponível no meu site:
www.reniemarquet.cjb.net

Enviado:
05 Dez 2006 12:24
por psycoman
duvida qual a diferenca dos modos 8bits e 4 bits ?