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