Ir ao conteúdo
  • Cadastre-se

LCD 8051, Assembly - AJUDA


Posts recomendados

Amigos,

Estou com um sério problema ao tentar simular esse circuito abaixo.

Quando dou play no programa nao aparece nada, apenas liga o display e não aparece a mensagem.

Segue o circuito e o código em anexo

Código:

RS EQU P2.1
E EQU P2.0
INICIO: ACALL CONFIG
MOV A,#80H
ACALL INST
MOV A,#58H
ACALL DADO
;
CONFIG: MOV A,#38H
ACALL INST
ACALL INST
MOV A,#06H
ACALL INST
MOV A,#0EH
ACALL INST
MOV A,#01H
ACALL INST
RET
;
DADO: MOV P0,A
SETB RS
SETB E
ACALL TEMPO
CLR E
RET
;
INST: MOV P0,A
CLR RS
SETB E
ACALL TEMPO
CLR E
RET
;
TEMPO: MOV R0,#255
DJNZ R0,$
RET

ops, quando colei o código, falto o "END" mas foi so isso mesmo.

post-795055-13884957488672_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Me parece que seus delays não estão adequados aos tempos exigidos pelo LCD entre um comando e outro.

tente colocar uma rotina de delay de 2mS entre cada comando e escrita que der ao LCD.

Abs.

O tempo atual é de 51mS, diminui pra 2mS e não deu em nada.

Reparei agor aque fica aparecendo essa mensagem no "SIMULATION LOG":

"CONTROLLER RECEIVED COMMAND WHILST BUSY"

Outras sugestões.

Obg.

up. Preciso logo dessa ajuda, hehhe

grato

Link para o comentário
Compartilhar em outros sites

Não sei programar o 8051, mas dá para entender o assembly. Saiba que o LCD lê um comando quando o Enable está em zero. Portanto você deve começar com esse pino setado, e executar um pulso para a leitura do dado ou comando.



RS EQU P2.1
E EQU P2.0
INICIO: ACALL CONFIG
MOV A,#80H
ACALL INST
MOV A,#58H
ACALL DADO
;
CONFIG:
SETB E
CLR RS
MOV A,#38H
ACALL INST
ACALL INST
MOV A,#06H
ACALL INST
MOV A,#0é
ACALL INST
MOV A,#01H
ACALL INST
RET
;
DADO: MOV P0,A
SETB RS
CLR E
ACALL TEMPO
SETB E
RET
;
INST: MOV P0,A
CLR RS
CLR E
ACALL TEMPO
SETB E
RET
;
TEMPO: MOV R0,#255
DJNZ R0,$
RET

Link para o comentário
Compartilhar em outros sites

Não sei programar o 8051, mas dá para entender o assembly. Saiba que o LCD lê um comando quando o Enable está em zero. Portanto você deve começar com esse pino setado, e executar um pulso para a leitura do dado ou comando.



RS EQU P2.1
E EQU P2.0
INICIO: ACALL CONFIG
MOV A,#80H
ACALL INST
MOV A,#58H
ACALL DADO
;
CONFIG:
SETB E
CLR RS
MOV A,#38H
ACALL INST
ACALL INST
MOV A,#06H
ACALL INST
MOV A,#0é
ACALL INST
MOV A,#01H
ACALL INST
RET
;
DADO: MOV P0,A
SETB RS
CLR E
ACALL TEMPO
SETB E
RET
;
INST: MOV P0,A
CLR RS
CLR E
ACALL TEMPO
SETB E
RET
;
TEMPO: MOV R0,#255
DJNZ R0,$
RET

Justamente, depende do valor que o LCD lê, as vezes lê com 0, as vezes com 1, depende se for catodo ou anodo comum. Falei *****?

Link para o comentário
Compartilhar em outros sites

ItaloAndrade,

Todos os LCDs com o controlador HD44780 ou equivalente têm o enable ativado com 0. Sinceramente nunca vi um display lcd 16x2 que não fosse assim.

navarmn,

Use esse simulador para testar a lógica de como você usa o LCD:

http://www.dinceraydin.com/djlcdsim/djlcdsim.html

Me ajudou muito!

Link para o comentário
Compartilhar em outros sites

O amigo Italo esta confundidod o LCD com display de sete segmentos, LCD utilizam um controlador baseado no CI HD44780.

É interessante antes de qualquer coisa dar um delay de aproximadamente 15mS para garantir a correta estabilização da fonte de alimentação.

outra coisa, sugiro que em vez de fazer para dar uma instrução:



assim

INST: MOV P0,A
CLR RS
CLR E
ACALL TEMPO
SETB E
RET

faça assim:


INST: MOV P0,A
CLR RS
SETB E
NOP
NOP
NOP
CLR E
ACALL TEMPO
RET

e a Rotina de Config assim:


CONFIG:
[B][I]CLR E[/I][/B]
CLR RS
MOV A,#38H
ACALL INST
ACALL INST
MOV A,#06H
ACALL INST
MOV A,#0é
ACALL INST
MOV A,#01H
ACALL INST
RET

aplique as alterações e veja o que muda.

Abs.

Link para o comentário
Compartilhar em outros sites

O amigo Italo esta confundidod o LCD com display de sete segmentos, LCD utilizam um controlador baseado no CI HD44780.

É interessante antes de qualquer coisa dar um delay de aproximadamente 15mS para garantir a correta estabilização da fonte de alimentação.

outra coisa, sugiro que em vez de fazer para dar uma instrução:



assim

INST: MOV P0,A
CLR RS
CLR E
ACALL TEMPO
SETB E
RET

faça assim:


INST: MOV P0,A
CLR RS
SETB E
NOP
NOP
NOP
CLR E
ACALL TEMPO
RET

e a Rotina de Config assim:


CONFIG:
[B][I]CLR E[/I][/B]
CLR RS
MOV A,#38H
ACALL INST
ACALL INST
MOV A,#06H
ACALL INST
MOV A,#0é
ACALL INST
MOV A,#01H
ACALL INST
RET

aplique as alterações e veja o que muda.

Abs.

Felipe, não vi o porque da instrução 3xNOP e depois da CLR E e ainda dar ACALL TEMPO.

De qualquer forma fiz as devidas alterações que você recomendou e nada ainda =/

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

você está usando este circuito que postou fielmente ou acrescentou os outros componentes vitais para o micrcontrolador?

se eu não me enganoo 8051 não tem oscilador interno

e o proteus é um simulador fiel

se não colocar o oscilador externo e nem o hardware de reset

com certeza não irá funcionar.

também não escqueça do pino 31 alimentado com vcc.

abraço.

Link para o comentário
Compartilhar em outros sites

hey amigo, eu estou aprendendo codigo assembly, e estou precisamente aprender LCD, e notei ai uma coisa no seu codigo

CONFIG:

CLR E

CLR RS

MOV A,#38H

ACALL INST

ACALL INST

MOV A,#06H

ACALL INST

MOV A,#

ACALL INST

MOV A,#01H

ACALL INST

RET

repare na linha a vermelho, com especial atenção na parte verde

e mais uma coisa, qual a diferença de uma rotina "lcall" ou "acall"??

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...

Galera já compilei o codigo em asm,não dar nenhum erro, mas na hora de testa no proteus tudo liga mas nada funciona.. ,

meu projeto é esse ai o

Ao teclar um número inteiro natural em um teclado telefônico (matriz 4X3 => quatro linhas

por três colunas);

O mesmo deverá ser apresentado em um display LCD de duas linhas por quatro colunas,

conectados (teclado e display LCD) a um microcontrolador da família 51;

Se o número teclado for PAR piscar um LED VERMELHO, também conectado ao mesmo

microcontrolador da família 51, na cadência de um segundo a quantidade de vezes que

representa o número par teclado;

Se o número teclado for IMPAR piscar um LED VERDE, conectado, também, ao mesmo

microcontrolador da família 51, na cadência de dois segundo a quantidade de vezes que

representa o número ímpar teclado.

download do código melhor editado >> http://www.2shared.com/fadmin/31079979/4b35a515/pp2.txt.html

todo projetado para rodar no at89c2051..

meu Código em asm:

;*******************************************************************************
; CONFIGURAÇÃO PADRÃO DO SISTEMA *
;*******************************************************************************
$MOD51
$TITLE(DISPLAY LCD)
$PAGEWIDTH(132)
$DEBUG
$OBJECT
$NOPAGING

;*******************************************************************************
; DEFINIÇÃO DAS VARIÁVEIS DO SISTEMA *
;*******************************************************************************
RS BIT P3.4 ;DEFINE O BIT P3.4 COMO REGISTER SELECT = RS
EN BIT P3.5 ;DEFINE O BIT P3.4 COMO ENABLE = EN
LED BIT P3.7 ;DEFINE O BIT P3.7 COMO CONEXÃO DO LED

ORG 0000H ;INICIO DA MEMORIA DE PROGRAMA
;*******************************************************************************
; ALOCAÇÃO DO VETOR DE INTERRUPÇÕES *
;*******************************************************************************
RESETE: LJMP INIC ;PULA A AREA DO VETOR DE INTERRUPCAO

ORG 0003H ;INICIO DO VETOR DE INTERRUPCAO EXTERNA 0
INTEX0: RETI ;RETORNA E RESTAURA A LÓGICA DE INTERRUPÇÃO

ORG 000BH ;INICIO DO VETOR DE TIMER/COUNTER 0
TIME0: RETI ;RETORNA E RESTAURA A LÓGICA DE INTERRUPÇÃO

ORG 0013H ;INICIO DO VETOR DE INTERRUPCAO EXTERNA 1
INTEX1: RETI ;RETORNA E RESTAURA A LÓGICA DE INTERRUPÇÃO

ORG 001BH ;INICIO DO VETOR DE TIMER/COUNTER 1
TIME1: RETI ;RETORNA E RESTAURA A LÓGICA DE INTERRUPÇÃO

ORG 0023H ;INICIO DO VETOR DE SERIAL
SERIAL: RETI ;RETORNA COM LOGICA DE INTERR RESTAURADA

ORG 0030H ;INÍCIO DA AREA DO PROGRAMA PRINCIPAL
;*******************************************************************************
; DESENVOLVIMENTO DO PROGRAMA *
;*******************************************************************************
INIC: CLR P3.0 ;LIMPA A PORTA
CLR P3.1 ;LIMPA A PORTA
CLR F0 ;LIMPA FLEG
LCALL INILCD ;INICIALIZA O LCD E SUA SUB-ROTINA
esp: LCALL TECLAD ;CHAMA A SUB-ROTINA PARA TESTA O TECLADO
JNB F0,ESP ;FAZ COM QUE O TECLADO SEMPRE SEJA SUPERVISIONADO ATE QUANDO UMA TECLA SEJA PRECIONADA
MOV A,R3 ;MOVE O VALOR DIGITADO PARA O ACUMULADOR
ADD A,#030H ;SOMA 30H PARA EQUIVALER COM A TABELA ASCII
MOV P1,A ;COLOCA O NUMERO NA P1
LCALL WRLCD ;ESCREVE O NUMERO DIGITADO NO LCD
LCALL PISCA ;CHAMA SUB-ROTINA PARA PISCAR O LED


INICIO: MOV R4,#10H ;CONTADOR DE INTERRUPÇÃO DO TIMER0

;*******************************************************************************
; DESENVOLVIMENTO DAS SUBROTINA DO PROGRAMA PRINCIPAL *
;*******************************************************************************

INILCD: CLR P3.1 ;LIMPA PORTA
CLR P3.7 ;POE 0 EM REGISTRADOR
MOV P1,#001H ;LIMPA TELA DO LCD
LCALL WRLCD ;PREPARA PARA ESCREVER NA LCD
MOV P1,#002H ;PREPARA A LCD PARA ESCREVER a partir DA ESQUERDA
LCALL WRLCD ;SETA BIT NA P3.1
MOV P1,#006H ;DESLOCA O CURSOR A PARA ESQUERDA
LCALL WRLCD ;CHAMA INTRUÇÃO DE ESCRITA NO LCD
MOV P1,00EH ;PREPARA PARA ESCREVER NO PROXIMO ENDEREÇO 00EH
LCALL WRLCD ;CHAMA INTRUÇÃO DE ESCRITA NO LCD
MOV P1,#038H ;INSTRUÇÃO PARA MANTER O CURSOR
LCALL WRLCD ;CHAMA INTRUÇÃO DE ESCRITA NO LCD
SETB P3.0 ;SETA UM BIT NA EM RS
RETI ;RETORNA

WRLCD: SETB P3.1 ;SETA O BIT NA PORTA P3.1
CLR P3.1 ;LIMPA A PORTA P3.1
LCALL DELAY ;ESPERA
RET ;RETORNA

TECLAD: MOV R3,#001H ;NUMERO PRECIONADO
MOV R4,#004H ;QUANTATIVO DE LINHAS
MOV A,#0FEH ;VAI TESTA AS LINHAS
NEXT: MOV P1,A ;SETA OS PINOS DE P1.1 A P1.7
JNB P1.4,SETAF0 ;SE P1.4 = 0 ,DAR SINAL NA FLAG.0
INC R3 ;SE NÃO INCREMENTA R3
JNB P1.5,SETAF0 ;SE P1.5 = 0 ,DAR SINAL NA FLAG.0
INC R3 ;SE NÃO INCREMENTA R3
JNB P1.6,SETAF0 ;SE P1.6 = 0 ,DAR SINAL NA FLAG.0
INC R3 ;SE NÃO INCREMENTA R3
RL A ;TESTE DE LINHAS
DJNZ R4,NEXT ;DECREMENTA R4 POIS NÃO PRECINADO NENHUA TECLA
RET ;RETORNA
SETAF0: SETB F0 ;SETA A FLAG 0 POIS UMA TECLA FOI PRECIONADA O VALOR ESTA EM R3
RET ;RETORNA

PISCA: JNB P3.4,PAR ;SE O P1.0 FOR 0 LOGO ESTE E PAR

PISCA1: JNB P3.7,IMPAR ;SE O P1.0 FOR 0 LOGO ESTE E IMPAR

IMPAR: SETB P3.7 ;LIGA LED IMPAR
LCALL DELAY ;ESPERA 2 SEGUNDOS AINDA FAZER OUTRO DELAY PARA 2SEG

CLR P3.1 ;DESLIGA O LED POR 1 SEGUNDO
LCALL DELAY ;ESPERA 2 SEGUNDOS
DJNZ R3,IMPAR ;VOLTA TODA A ROTINA ATE R3=0

RET

PAR: SETB P3.4 ;LIGA LED PAR
LCALL DELAY ;ESPERA 1 SEGUNDO
CLR P3.0 ;LIMPA LCD
LCALL DELAY ;ESPERA 1 SEGUNDO
DJNZ R3,PAR ;VOLTA TODA A ROTINA ATE R3=0
RET



DELAY: MOV TMOD,#001H ;C/COM NO MOD01 =16 BIT'S
MOV TCON,#00H ;INICIAL FLAG OVFLOW E T/COM DESLIG
MOV R3,#010H ;MOVER DA RAM PARA R2
REPETE: MOV TH0,#00BH ;
MOV TL0,#0DBH
SETB TR0 ;LIGA
FIKQUI: JNB TF0,FIKQUI ;
CLR TF0 ;
DJNZ R3,REPETE ;
CLR TR0 ;

RET ;


UMSEG: MOV TMOD,#001H ;PROGRAMA O T/C0 COMO TEMPORIZADOR DE 16 BITS

END ;INDICA FIM DO PROGRAMA AO COMPILADOR

beleza aguardo pois estou quebrando a cabeça a 5 dias e nada de resultado..

post-977620-13884962863773_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Qual compilador ASM voce recomenda?

Ainda não achei um que me sentisse a vontade.

eu andei fuçando muito a net e encontrei varios tipos

vou citar alguns.

>> mcu8051ide muito bom

>>asm51 excelente mas só serve para familia 51

>> Ride7 da raisonance muito completo esse é de mais

link para download http://www.mcu-raisonance.com/arm-download.html.

espero ter ajudado apesar de ser muito leigo ainda nesta área.:confused::wacko:

Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...

Prezados amigos,

 

 

    Estou fazendo uma matéria na faculdade e o professor ensinou alguns comandos em assembly porém apenas o básico e agora passou um trabalho que devemos analisar 03 números quaisquer amazenados nos endereços da RAM 47H,48H e 49H, os mesmos devem ser ordenados em ordem decrescente e armazenados nos registros R1, R2 e R3, por favor alguém poderia me ajudar ?

 

Existe o comando if em assembly ?

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...