AT89c52 + LCD + PROTEUS

Hola a todos

tengo un problema en proteus... tengo un programa que hice para el mircro 98c52 y que haciendo el circuito en una protoboard me funciona... pero no en el proteus... alguien me puede dar una mano?


adjunto código assembler y esquemático
Código:
mov p0,#00h
mov p1,#00h

acall espera
    mov p0,#38h
acall enable

acall espera
    mov p0,#0eh
acall enable

acall espera
    mov p0,#01h
acall enable

acall espera
    mov p0,#06h
acall enable

acall espera
    mov p0,#80h
acall enable


acall espera

;--------------------------

clr p1.1
setb p1.0

mov p0,#'T'
acall enable
acall espera
mov p0,#'e'
acall enable
acall espera
mov p0,#'m'
acall enable
acall espera
mov p0,#'p'
acall enable
acall espera
mov p0,#':'
acall enable
acall espera
mov p0,#' '
acall enable
acall espera



ciclo:

mov p0,p2
acall enable
acall espera

ajmp ciclo

espera:

mov r4,#0ffh
ciclo3:
mov r5,#0ffh
ciclo1:
    djnz r5,ciclo1
    djnz r4,ciclo3
ret

enable:

setb p1.2
mov r6,#0ffh
ciclo6:
    djnz r5,ciclo6
clr p1.2

ret


end

[IMG]https://www.forosdeelectronica.com/files/lcd_139.jpg[/IMG]

OJO! que el programa supuestamente muestra los datos que se estan leyendo del puerto P2 pero no tengo conectado nada aun por que estoy pegado en la parte de visualizacion del LCD

tambien he probado con este código

DB0 EQU P0.0
DB1 EQU P0.1
DB2 EQU P0.2
DB3 EQU P0.3
DB4 EQU P0.4
DB5 EQU P0.5
DB6 EQU P0.6
DB7 EQU P0.7
EN EQU P1.2
RS EQU P1.0
RW EQU P1.1
LLDATA EQU P0

SETB RW
CLR EN

LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'H'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'W'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT

WAIT_LCD:

      CLR EN ;Start LCD command
      CLR RS ;It's a command
      SETB RW ;It's a read command
      MOV LLDATA,#0FFh ;Set all pins to FF initially
      SETB EN ;Clock out command to LCD
      MOV A,LLDATA ;Read the return value
      JB ACC.7,WAIT_LCD ;If bit 7 high, LCD still busy
      CLR EN ;Finish the command
      CLR RW ;Turn off RW for future commands
      RET

INIT_LCD:

      CLR RS
      MOV LLDATA,#38h
      SETB EN
      CLR EN
      LCALL WAIT_LCD
      CLR RS
      MOV LLDATA,#0Eh
      SETB EN
      CLR EN
      LCALL WAIT_LCD
      CLR RS
      MOV LLDATA,#06h
      SETB EN
      CLR EN
      LCALL WAIT_LCD
      RET

CLEAR_LCD:

      CLR RS
      MOV LLDATA,#01h
      SETB EN
      CLR EN
      LCALL WAIT_LCD
      RET

WRITE_TEXT:

      SETB RS
      MOV LLDATA,A
      SETB EN
      CLR EN
      LCALL WAIT_LCD
      RET

END

y con ninguno puedo visualizar algo en el LCD
 

Adjuntos

  • lcd_139.jpg
    lcd_139.jpg
    46 KB · Visitas: 90
Última edición por un moderador:
Chavon..soy de bs as argentina
Tambien estoy tratando de usar ese [!·"()$/!(")$] micro, con un lcd
El problema mio es que yo tengo que setear un contador o un timer y visualizar una cuenta ascendente
Agregame al mail q dice aca en el foro y hablamos

salu2
 
Pasa con cualquier micro.
Busca las librerías adecuadas para las subrutinas.
En las normales espera a que cambie el estado del bit de mayor peso (hablo de cabeza). Pues antes de chequear temporiza ( a 4Mhz con 20ms va bien) y luego chequea. Creo que lo solucioné así.
Saludos
 
hola a todos tengo un pequeño problema tengo un circuito en proteus con un at89c52 y un lcd en el momento solo quiero mostrar algo por el lcd el resto del circuito todavía lo tengo en espera , hice un lenguaje en ensamblador pero ese lcd no me quiere mostrar nada si alguien me pudiera decir o no se tal vez dar un tip para que el lcd muestre aunque sea una letra le agradecería adjunto el esquema del circuito y el programa que hice en lenguaje ensamblador

aquí esta el programa y el circuito esta en el archivo adjunto :rolleyes:


Código:
; escritura de datos en un LCD embebido típico.

lcd_wr_inst equ 0000H
lcd_wr_dado equ 0002H
lcd_rd_inst equ 0001H
lcd_rd_dado equ 0003H

    XM    EQU 'M' 

;========================================================================
; Programa principal
;========================================================================
ORG 0H
    MOV SP,#50H
    MOV TMOD,#11H ; TIMER1 / TIMER0 no modo 1
    CLR EA ;
    CALL inicia_lcd
    MOV R7,#0FFH
loop:   
    MOV A,XM     ; 
    CALL wr_dado



          
    INC R7
    MOV A,R7
    MOV DPTR,#mensagem
    MOVC A,@A+DPTR       ; 
    CJNE A,#0FFH,cont ; 
    JMP fin
cont:
    CALL wr_dado   ; escribe datos en el LCD
    JMP loop
fin:
JMP fin
;=======================================================================
; Rutinas de soporte al programa principal
;=======================================================================
    ORG 100H
inicia_lcd: ; rutina de inicializacion del LCD

    MOV A,#3CH ; 2 lineas / matriz 7x10
    CALL wr_inst

    CALL tempo ; delay de 15mS
    MOV A,#3CH ; 2 lineas / matriz 7x10
    CALL wr_inst
    
    MOV A,#3CH ; 2 lineas / matriz 7x10
    CALL wr_inst    
    CALL tempo ; delay de 15mS
    
    MOV A,#08H ;  Apaga display
    CALL wr_inst
    
    MOV A,#0EH ; enciende Display
    CALL wr_inst
    
    MOV A,#01H ; Borra el display
    CALL wr_inst
    
    MOV A,#06H ; Establece el modo de entrada
    CALL wr_inst
    
    RET

wr_inst:                 ; Escribe instrucciones en el LCD
    MOV DPTR,#lcd_wr_inst
    MOVX @DPTR,A
    RET

wr_dado:          ; Escribe dato en el LCD
    MOV DPTR,#lcd_wr_dado
    MOVX @DPTR,A
    RET

rd_inst:           ; 
    MOV DPTR,#lcd_rd_inst
    MOVX A,@DPTR    ; 
    RET
rd_dado:         ; lee dato
    MOV DPTR,#lcd_rd_dado ; depende de la utlima operacion del LCD
    MOVX A,@DPTR ; retorna em A
    RET
;=========================================================
; Temporizacion de  15 mS / clock 24 MHz => 50.000 ciclos
;=========================================================
tempo:
    MOV DPTR,#30000 ; 
    MOV TH1,DPH
    MOV TL1,DPL
    SETB TR1     ; inicia timer1
    JNB TF1,$    ; ciclo de incremento => 50.0000
    CLR TR1
    CLR TF1 ; prepara para proxima chamada
    RET
mensagem:     ; Constante enviada al LCD
    DB 'Microprocesadores', 0FFH
    
END ; obligatorio.
 

Adjuntos

  • circuito_167.jpg
    circuito_167.jpg
    258.1 KB · Visitas: 82
Última edición por un moderador:
Atrás
Arriba