Escrita em LCD

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Escrita em LCD

Mensagempor lucflores » 04 Dez 2006 15:40

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
lucflores
Nibble
 
Mensagens: 90
Registrado em: 16 Nov 2006 15:39

Mensagempor Wagner de Queiroz » 04 Dez 2006 16:24

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

Seja Livre, Use Linux
Avatar do usuário
Wagner de Queiroz
Word
 
Mensagens: 872
Registrado em: 11 Out 2006 13:38
Localização: Barueri-SP

Re: Escrita em LCD

Mensagempor R.B.Sanchez » 04 Dez 2006 16:28

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.
R.B.Sanchez
Byte
 
Mensagens: 103
Registrado em: 13 Out 2006 19:14
Localização: Guarulhos / SP

Mensagempor lucflores » 04 Dez 2006 17:57

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.
lucflores
Nibble
 
Mensagens: 90
Registrado em: 16 Nov 2006 15:39

Mensagempor pomboeletronic » 04 Dez 2006 19:39

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
Avatar do usuário
pomboeletronic
Nibble
 
Mensagens: 67
Registrado em: 04 Dez 2006 14:44

Mensagempor R.B.Sanchez » 04 Dez 2006 19:41

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.
R.B.Sanchez
Byte
 
Mensagens: 103
Registrado em: 13 Out 2006 19:14
Localização: Guarulhos / SP

Mensagempor R.B.Sanchez » 04 Dez 2006 19:45

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.
R.B.Sanchez
Byte
 
Mensagens: 103
Registrado em: 13 Out 2006 19:14
Localização: Guarulhos / SP

Mensagempor lucflores » 04 Dez 2006 21:30

Fico muuuuito agradecido por vocês, vou testar amanha pela manhã e posto aqui se funfo tudo OK, por enquanto obrigado....
lucflores
Nibble
 
Mensagens: 90
Registrado em: 16 Nov 2006 15:39

Mensagempor lucflores » 05 Dez 2006 09:32

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 $ ?
lucflores
Nibble
 
Mensagens: 90
Registrado em: 16 Nov 2006 15:39

Mensagempor brasilma » 05 Dez 2006 09:43

Normal não é, vc pode fazer com que a rotina suprima este ultimo caracter.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor lucflores » 05 Dez 2006 09:48

vou tentar, Valeu....
lucflores
Nibble
 
Mensagens: 90
Registrado em: 16 Nov 2006 15:39

Mensagempor psycoman » 05 Dez 2006 09:53

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.
psycoman
Bit
 
Mensagens: 35
Registrado em: 28 Nov 2006 07:56

Mensagempor lucflores » 05 Dez 2006 10:02

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...
lucflores
Nibble
 
Mensagens: 90
Registrado em: 16 Nov 2006 15:39

Mensagempor Renie » 05 Dez 2006 10:33

Olá Psycoman!

Dê uma olhada no tutorial disponível no meu site:

www.reniemarquet.cjb.net
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor psycoman » 05 Dez 2006 12:24

duvida qual a diferenca dos modos 8bits e 4 bits ?
psycoman
Bit
 
Mensagens: 35
Registrado em: 28 Nov 2006 07:56

Próximo

Voltar para 8051

Quem está online

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

x