Autor Tópico: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051  (Lida 10950 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

pedrodacruz

  • Visitante
COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Online: 09 de Dezembro de 2007, 17:55 »
Estou fazendo um projeto da escola onde é necessário fazer um relógio, o problema é que eu não estou conseguindo colocar nem uma menssagem na tela do display do meu simulador(proteus). Gostaria que alguém me ajudasse a discubrir o que está errado no meu código(se está).

Observação: o display é conectado diretamento no microcontrolador, ficando a porta p0 reservada para dados e p2 para configuração.

Por favor!!!! Se alguém tiver um código semelhante que comunique diretamente com o display, me mandem!!!!

TEMPO      EQU      60535      ;5.000mcrs
TEMPO2      EQU      15535      ;50.000mcrs
EN      EQU      P2.2
RW      EQU      P2.1      
RS      EQU      P2.0

TECLA0      EQU      0500H      ;ENDEREÇO DA EPROM em que esta "tecla0"
TECLA1      EQU      0510H      ;ENDEREÇO DA EPROM em que esta "tecla1"
TECLA2      EQU      0520H      ;ENDEREÇO DA EPROM em que esta "tecla2"
TECLA3      EQU      0530H      ;ENDEREÇO DA EPROM em que esta "tecla3"

      ORG      0000H
      MOV      R0,#0FFH   ;INICIA R0
      LJMP      INICGERAL
      
      ORG      0030H      ;INICIA R0
AJUSTAR0:   MOV      R0,#0FFH

INICGERAL:   
      MOV      SP,#30H
      MOV      TMOD, #11H   ;TIMER 0 E TIMER 1 NO MODO 1
      MOV      DPTR,#8000H   ;ENDEREÇO QUALQUER DO PORT 0 PARA DISPARAR O WR\
      INC      R0      ;COMO UM PSEUDO I/O MAPEADO.
      CJNE      R0,#04H,INICIO
      JMP      AJUSTAR0

;INICIALIZAÇÃO DO DISPLAY
   
INICIO:      
      CALL      INIC_DISPLAY   ;INICIALIZA DISPLAY
      CLR      RS
      MOV      A,#80H      ;ESCREVE "INSTRUÇÃO" NO DISPLAY
      CALL      WRCAR      ;POSICIONAR O CURSOR
      SETB      RS      ;MUDA PARA "DADOS" NO DISPLAY

TECLAP0:   CJNE      R0,#00H,TECLAP1
      MOV      DPTR,#TECLA0   ;CARREGA ENDEREÇO DA STRING MSG0
      CALL      WRITESTRING   ;ESCREVE MENSAGEM (ESTÁ APARECENDO APENAS UM NEGÓCIO PRETO)
      CALL      ATRASO      ;CHAMA ATRASO
      CALL      LIMPA      ;POSICIONA CURSOR (APARECE O CURSOR)

TECLAP1:   CJNE      R0,#01H,TECLAP2   

      MOV      DPTR,#TECLA1   ;CARREGA ENDEREÇO DA STRING MSG1
      CALL      WRITESTRING   ;ESCREVE MENSAGEM
      CALL      ATRASO      ;CHAMA ATRASO
      CALL      LIMPA      ;POSICIONA CURSOR

TECLAP2:   CJNE      R0,#2H,TECLAP3

      MOV      DPTR,#TECLA2   ;CARREGA ENDEREÇO DA STRING MSG2
      CALL      WRITESTRING   ;ESCREVE MENSAGEM
      CALL      ATRASO      ;CHAMA ATRASO
      CALL      LIMPA      ;POSICIONA CURSOR

TECLAP3:   CJNE      R0,#3H,RETORNA   

      MOV      DPTR,#TECLA3   ;CARREGA ENDEREÇO DA STRING MSG2
      CALL      WRITESTRING   ;ESCREVE MENSAGEM
      CALL      ATRASO      ;CHAMA ATRASO
      CALL      LIMPA      ;POSICIONA CURSOR

RETORNA:   LJMP      INICGERAL

;###################################################################################

; SUB-ROTINAS

INIC_DISPLAY:
      CLR      RS      ;ESCREVE INSTRUÇÃO NO DISPLAY
      MOV      A,#38H      ;00111000B
      CALL      WRCAR
      MOV      A,#38H      ;IDEM ACIMA
      CALL      WRCAR
      MOV      A,#06H      ;00000110B
      CALL      WRCAR
      MOV      A,#0EH      ;00001110B
      CALL      WRCAR
      MOV      A,#01H      ;00000001B(LIMPA DISPLAY)
      CALL      WRCAR
      MOV      A,#0CH      ;DESLIGA CURSOR
      CALL      WRCAR      ;ESCREVE DADOS NO DISPLAY
      SETB      RS      
      CALL      T5MS      ;CHAMA ATRASO 5ms
      RET

WRCAR:
      PUSH      DPL      ;SALVA NA PILHA ÚLTIMO DPTR UTILIZADO(LOW)
      PUSH      DPH      ;SALVA NA PILHA ÚLTIMO DPTR UTILIZADO(HIGH)
      MOV      DPTR,#8000H   ;GERA ENDEREÇO DE I/O MAPEADO
      MOVX      @DPTR,A      ;ESCREVE DADO NO LCD COMO SE FOSSE I/O MAPEADO
      POP      DPH      ;RETORNA DA PILHA ÚLTIMO DPTR UTILIZADO
      POP      DPL      ;RETORNA DA PILHA ÚLTIMO DPTR UTILIZADO
      LCALL      T5MS      ;CHAMA TEMPO DE ESPERA.
      RET

ATRASO:
      MOV      R2,#10D      ;CONTADOR DE lOOPS EM VOLTA DO TIMER1
DENOVO:
      MOV      TL1,#LOW(TEMPO2)
      MOV      TH1,#HIGH(TEMPO2)
      SETB      TR1
      JNB      TF1,$
      CLR      TR1
      CLR      TF1
      DJNZ      R2, DENOVO
      RET

WRITESTRING:
      MOV      A,#00H
      MOVC      A,@A + DPTR   ;"VARRE"(INCREMENTA) O DPTR ATÉ QUE ENCONTRE A LETRA "$" E AÍ PÁRA DE LER
      CJNE      A,#'$',WRITE_NEXT
      SJMP      FINIS_STRING

WRITE_NEXT:
      CALL      WRCAR
      CLR      RS      ;ESCREVE INSTRUÇÃO NO DISPLAY
      MOV      A,#14H      ;00001100B
      CALL      WRCAR      ;DESLOCA O CURSOR
      SETB      RS      ;DESABILITA INTRUÇÕES
      INC      DPTR
      SJMP      WRITESTRING

FINIS_STRING:
      RET

T5MS:
      MOV      TL0,#LOW(TEMPO)
      MOV      TH0,#HIGH(TEMPO)
      SETB      TR0
      JNB      TF0,$
      CLR      TR0
      CLR      TF0
      RET

LIMPA:      CLR      RS      ;ESCREVE NO MODO "INSTRUÇÃO", POSICIONA O CURSOR
      MOV      A,#80H      ;ESCREVE INSTRUÇÃO QUE ESTÁ EM A.
      CALL      WRCAR      ;ESCREVE INSTRUÇÃO QUE ESTÁ EM A.
      SETB      RS      ;VOLTA PARA O MODO DE ESCREVER "DADOS".
      RET
      
      ORG      TECLA0      ;ENDEREÇO DO LABEL "TECLA0": VIDE NO INÍCIO OS EQUATES.
      DB      'TECLA0$'   ;INTRUÇÃO PARA DIZER QUE EM SEGUIDA DELA VEM O TEXTO DO ENDEREÇO DADO POR "TECLA0".
      
      ORG      TECLA1      ;IDEM ACIMA.
      DB      'TECLA1$'

      ORG      TECLA2
      DB      'TECLA2$'

      ORG      TECLA3
      DB      'TECLA3$'

      END

Offline Tverm

  • Hobby
  • ****
  • Posts: 452
  • Sexo: Masculino
  • Portugal
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #1 Online: 09 de Dezembro de 2007, 21:52 »
Vé se isto te ajuda:

http://img502.imageshack.us/img502/3311/inicializaolcdfq8.png
COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051




E       EQU P3.5
RW      EQU P3.6
RS      EQU P3.7

        ORG 0
        MOV TMOD,#00000001B
        SETB TR0
        CLR E
        CLR RW
        CLR RS
        LCALL ENVIA
        MOV P1,#00111000B
        LCALL ENVIA
        MOV P1,#00001111B
        LCALL ENVIA
        MOV P1,#00000001B
        LCALL ENVIA
        MOV P1,#00000110B
        LCALL ENVIA
        setb rs
        MOV P1,#'a'
        lcall envia
 
        LJMP $



ENVIA:  SETB E
        NOP
        NOP
        NOP
        CLR E
        MOV TH0,#HIGH(65536-1843)
        MOV TL0,#LOW(65536-1843)
        CLR TF0
        JNB TF0,$
        RET
« Última modificação: 09 de Dezembro de 2007, 21:55 por Tverm »

Offline ftrevis

  • Novato
  • *
  • Posts: 23
  • Profissão: ftrevis
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #2 Online: 10 de Dezembro de 2007, 17:33 »
Ola Pedro,

Se vc conectou o LCD direto na micro, porque este I/O mapeado na rotina "WRCAR"?
vc pode trocar tudo o que ta la dentro por isso:

WRCAR:
   mov p0,a
   lcall t5ms
   ret

Se não me engano, a porta P0 necessita de PULL-UP externo...

Anexa seu esquema do Proteus, que eu dou uma olhada e testo aqui...

Trevis

Offline fcamargo

  • Produzindo equipamentos e dispositívos
  • CNCMASTER
  • ******
  • Posts: 2974
  • Sexo: Masculino
  • www.faraos.net
    • industria de máquinas
  • Cidade - UF: Curitiba
  • Nome:: Fábio Aurélio Camargo
  • Profissão: fabricante de routers
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #3 Online: 11 de Dezembro de 2007, 01:31 »
heim?
vcs são doidos?

que é isso afinal?

alguem querendo usar om lcd na cnc?

Não entendi nada do código.. qual a linguagem?

Offline Tverm

  • Hobby
  • ****
  • Posts: 452
  • Sexo: Masculino
  • Portugal
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #4 Online: 11 de Dezembro de 2007, 02:43 »
Cara isto é assembly linguagem de programação para microcontroladores/microprocessadores.
E esse codigo ai em cima serve para inicializar um Display LCD para depois de inicializado podermos escrever nele o que quizermos.

Offline fcamargo

  • Produzindo equipamentos e dispositívos
  • CNCMASTER
  • ******
  • Posts: 2974
  • Sexo: Masculino
  • www.faraos.net
    • industria de máquinas
  • Cidade - UF: Curitiba
  • Nome:: Fábio Aurélio Camargo
  • Profissão: fabricante de routers
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #5 Online: 11 de Dezembro de 2007, 06:46 »
hum...
interessante...
vou acompanhar....

Offline Tverm

  • Hobby
  • ****
  • Posts: 452
  • Sexo: Masculino
  • Portugal
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #6 Online: 12 de Janeiro de 2008, 21:38 »
Também estou usando um LCD para informação horária e de temperatura.
Mas meu problema é a aquisição dos dados de temperatura atravez de um TC77 da Microchip  que acontece é que com o meu 8051 DS89C450 não estou a conseguir comunicar atravez do protocolo SPI do sensor.
Deixo abaixo a subrotina de aquisição para alguém me dar uma força.

LE_TEMP:
        CLR CS
        CLR CLK
        NOP
        NOP
        NOP
        NOP
        NOP
        LCALL TEMP_CLK
        JB SI,SINAL_NEG
        MOV R0,#29h
        MOV @R0,#251
        LJMP NOT_BITE

SINAL_NEG:
        MOV R0,#29h
        MOV @R0,#253
       
        MOV R0,#1Eh
        MOV @R0,#0

NOT_BITE:       
        LCALL TEMP_CLK
        MOV R0,#1Eh
        MOV A,@R0
        JB SI,SI_HIGH
        LJMP TEST_8BIT
SI_HIGH:
        INC A
TEST_8BIT:
        INC R6
        CJNE R6,#8,BIT_8
        LJMP BIT_NOT8
BIT_8:  RL A
BIT_NOT8:
        MOV R0,#1Eh
        MOV @R0,A
        CJNE R6,#8,NOT_BITE         
        SETB CS
        LCALL CONVERT_TEMP
        MOV R6,#0       
        RET
       
TEMP_CLK:
        CLR CLK
        MOV TL2,#LOW(65536-46083)
        MOV TH2,#HIGH(65536-46083)       
        CLR T2CON.7       
        JNB T2CON.7,$
        ;NOP
        ;NOP
        ;NOP
        ;NOP
        ;NOP
        SETB CLK
        RET
   

Offline Rudolf Waller

  • Hobby
  • ****
  • Posts: 683
  • Sexo: Masculino
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #7 Online: 13 de Janeiro de 2008, 09:40 »
Grande,
Também estou usando um LCD para informação horária e de temperatura.
Mas meu problema é a aquisição dos dados de temperatura atravez de um TC77 da Microchip 
Não conheço este componente. As informações que vou colocar embaixo se baseiam no que entendi do datasheet dele, tá?

-R6 não é inicializado (com 0, acho),
-SI TEM QUE ESTAR EM NIVEL ALTO para que o dado seja lido corretamente
-Se a temperatura for positiva, a variável em 1Eh não é inicializada

Posso dar umas dicas de programação?
Você usou:
        MOV R0,#29h
        MOV @R0,#251

ACHO que estas 2 instruções podem ser substituídas por:
        MOV 29h,#251

Isso também vale para:
        MOV R0,#1Eh
        MOV A,@R0

Seria melhor usar:
        MOV A,1Eh


O contador de loop é mais eficiente se você usar:
        MOV R6,#8
LOOP:
        xxx
        xxx
        xxx
        DJNZ   R6,LOOP

A instrução DJNZ decrementa o R6 e se, após decrementar, tiver valor diferente de 0, executa um JP LOOP

Você tem 8 registradores R0..R7. Use-os para variáveis temporárias ao invés de usar a RAM interna (1Eh e 29h). Após a leitura da temperatura, transfira o valor que está neste registrador para a RAM.

Espero ter ajudado :)

Abraços,
Rudolf

Offline Tverm

  • Hobby
  • ****
  • Posts: 452
  • Sexo: Masculino
  • Portugal
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #8 Online: 13 de Janeiro de 2008, 11:36 »
Valeu grande Rudolf.

Vou ler com mais atenção todas as suas dicas e depois tentar solucionar meu problema.

Ao longo da tarde posto como as coisas vão por aqui.

Um abraço e Obrigado

Offline Tverm

  • Hobby
  • ****
  • Posts: 452
  • Sexo: Masculino
  • Portugal
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #9 Online: 13 de Janeiro de 2008, 14:38 »
Boa tarde de novo Rudolf.

Citar
-R6 não é inicializado (com 0, acho),
Sim isso esta a acontecer no inicio do codigo.
 
Citar
-SI TEM QUE ESTAR EM NIVEL ALTO para que o dado seja lido corretamente
Pode explicar melhor, tenho que por o SI/O a nivel alto tes de uma aquisição de dados?
Ja tentei e tambem não tenho mudanças significativas.
O que esta a acontecer é o seguinte eu tento ler o valor do sensor e guardo na RAM onde estão guardados os valores da seguinte forma (23:59:23 +022ºC) em 15 espaços de memoria de 0x20h a 0x2Eh.
Depois o que estou a visualizar é o relogio a funcionar devidamente
e a temperatura a variar de valor entre 255 e 0. 
   

Offline ftrevis

  • Novato
  • *
  • Posts: 23
  • Profissão: ftrevis
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #10 Online: 24 de Janeiro de 2008, 10:35 »
Uma rotinazinha para estudo de um calendário.


; Este eh um exemplo de Calendário, com resolucao em segundos
; A Calendário deve ser chamada a cada 1 segundo
; Fabio Trevisan, 28/06/2001

;Variáveis utilizadas pelo calendário
segundo         equ     08h             ;variavel segundos
minuto          equ     09h             ;variavel minutos
hora            equ     0ah             ;variavel horas
dia             equ     0bh             ;variavel dias
mes             equ     0ch             ;variavel mes
ano             equ     0dh             ;variavel ano
temp            equ     0eh             ;variavel temporaria para calculo dos dias


;***********************************************************************************
; Rotina Calendário
;
;***********************************************************************************
                          ;Ja Fe Mr Ab Ma Ju Jl Ag St Ot Nv Dz
diasmes:        db      00,32,29,32,31,32,31,32,32,31,32,31,32

Calendario:
        mov     r0,#segundo             ;r0 aponta para segundos
        inc     segundo                 ;incremento segundos
        cjne    @r0,#60,Sai             ;se=60 então zera e incrementa minutos
;minutos
        inc     r0                      ;r0 aponta para minutos
        mov     segundo,#0              ;zero os segundos
        inc     minuto                  ;incremento minutos
        cjne    @r0,#60,Sai             ;se=60 então zera e incrementa horas
;horas
        inc     r0                      ;r0 aponta para horas
        mov     minuto,#0               ;zero os minutos
        inc     hora                    ;incremento horas
        cjne    @r0,#24,Sai             ;se=60 então zera e incrementa dias
;dias
        inc     r0                      ;r0 aponta para dias
        mov     hora,#0                 ;zero as horas
        inc     dia                     ;incremento dias
       
        mov     a,mes                   ;descubro quantos dias tem o mes
        mov     dptr,#diasmes           ;para comparar corretamente
        movc    a,@a+dptr               ;pego o numero de dias da tabela diasmes
        mov     temp,a                  ;coloco o numero de dias na variavel temp
        mov     a,dia                   ;carrego dia para a comparacao
        cjne    a,temp,Sai              ;se=28,30 ou 31 então dia=1 e incrementa mes
;meses
        inc     r0                      ;r0 aponta para mes
        mov     dia,#1                  ;o mes começa no dia primeiro!
        inc     mes                     ;incremento mes
        cjne    @r0,#13,Sai             ;se=13 então zera e incrementa anos

        mov     mes,#1                  ;mes=1 pois nao existe mes zero!
        inc     ano                     ;incremento ano
Sai:   
        ret
       

Offline Guga

  • Hobby
  • ****
  • Posts: 434
  • Sexo: Masculino
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #11 Online: 06 de Março de 2008, 21:59 »
Senhores da eletônica, programação e microcontroladores, deixe-me expor meu problema...
Estou querendo fazer um mostrador digital de rpm do meu spindle, mas usando como referencia a tensão do potenciometro de saida do meu invresor de frequencia cfw-10, este potenciometro é de 5k e trabalha de 0 a 10V, a minha idéia é converter essa tensão em numeros de 0 a 18.000  no display, ou seja 0V = 0 RPM  e  10V = 18.000 RPM, alguém pode me ajudar a programar e a construir um circuito destes?
« Última modificação: 06 de Março de 2008, 22:08 por Guga »

Offline F.Gilii

  • Administrador
  • CNCMASTER
  • *******
  • Posts: 13796
  • Sexo: Masculino
  • Consultoria, Automação e Construção de Máquinas
  • Cidade - UF: Atibaia - SP
  • Nome:: Fabio Gilii
  • Profissão: Tec. Mecanica de Precisão
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #12 Online: 07 de Março de 2008, 08:16 »
Guga,

Veja no manual do seu CFW10 o parametro 208 - ajustando-o, o mostrador do proprio CFW10 pode mostrar por exemplo a rpm do spindle...

moschen

  • Visitante
Re: COMUNICAÇÃO COM DISPLAY LCD ATRAVÉS DO 8051
« Resposta #13 Online: 05 de Dezembro de 2008, 14:02 »
Boa tarde...

Meu nome é junior e estou fazendo um trabalho de escola e gostaria de saber se alguém possui uma rotina de relógio digital.

Desde já agradeço a atenção
Júnior

 

/** * */