# LCD con 8051



## arcadi (Dic 27, 2007)

Hola;

pido ayuda porque estoy haciendo un trabajo de informática, y no estoy seguro de lo que he hecho este bien.

El trabajo consiste en: mostrar en un LCD lo que llega en un 8051 por un puerto serie (con ensamblador).

Lo que no entiendo bien es como controlar el LCD, porque se recopilar los codigos en serie y tener la letra final dentro de un registro, pero no se como pasarla en el LCD.

Muchas gracias a todos, y feliz año nuevo


----------



## tiopepe123 (Dic 27, 2007)

Primero busca como controlar una lcd alfanumerica.

Basicamente se trata de:
Inicializarla:cursos,numero de lineas....

Imprimir: envias codigos ascii, o sea quieres una A pues envias el 65.

Puedes buscar ejemplos para ATMEL.

La inicializacion es casi el 95%,8%enviar los caractes y poco mas.

Recuerda que es un dispositivo lento, metele retardos de algunos 100us, despues ya los rebajaras. Lento pero seguro.

Si es de 2 filas, mejor que mejor, mientras que solo te salga la primera fila, es que inicializas mal, cuando se iluminen las dos filas ya lo tienes bien. Esto lo veras con el potenciometro de contraste.


----------



## arcadi (Dic 28, 2007)

Muchas gracias, me has ayudado mucho. 

Pero tengo unas dudas, he encontrado las comandas de control en ensamblador, y no entiendo bien algunas "rutinas" del programa. Pido si alguien me puede explicar por encima la rutina WRITE_LCD, INT_LCD y WAIT_LCD. Cuando dice DATA, se refiere a los puertos P1. Muchas gracias maestros .

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 
CLR RS 
SETB RW 
MOV DATA,#0FFh 
SETB EN 
MOV A,DATA 
JB ACC.7,WAIT_LCD 
CLR EN
CLR RW 
RET


INIT_LCD:
CLR RS
MOV DATA,#38h
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV DATA,#0Eh
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV DATA,#06h
SETB EN
CLR EN
LCALL WAIT_LCD
RET



CLEAR_LCD:
CLR RS
MOV DATA,#01h
SETB EN
CLR EN
LCALL WAIT_LCD
RET



WRITE_TEXT:
SETB RS
MOV DATA,A
SETB EN
CLR EN
LCALL WAIT_LCD
RET


----------



## Mary Christian Valera (Feb 24, 2008)

;***************************************************************************
;    
;Escuela de Telecomunicaciones
;Fundamento de Micro
;
;          Programa para el Funcionamiento del TECLADO LOS LED`S Y LA LCD
;
; 			       Mary Christian 							    
;***************************************************************************
;*********************************VARIABLES*********************************

        FILA1   BIT     P2.0
        FILA2   BIT     P2.1
        FILA3   BIT     P2.2
        FILA4   BIT     P2.3
        COLM1   BIT     P2.4
        COLM2   BIT     P2.5
        COLM3   BIT     P2.6

        BITS    DATA    20H                            

        TECLA   EQU     30H
        CHEQUEO BIT     BITS.0

        E       EQU   P3.1
        RS      EQU   P3.0
	BUSDATO EQU   P1

;******************************INICIO DEL ROGRAMA****************************
ORG     00H

INICIO:
         MOV  P0,#00000000H
         MOV  P2,#0FFH
         CALL MENSAJE1  
         MOV  P0,#11111111H 
         CALL MENSAJE2       

LEER:           
         CALL TECLADO
         JNB  CHEQUEO,LEER
         MOV  A,TECLA
         CJNE A,#1H,LEER2
         CALL MENSAJE3
         JMP  LEER

LEER2:
        CJNE  A,#2H,LEER3
        CALL  MENSAJE4
        JMP   LEER


LEER3:
        CJNE  A,#3H,LEER4
        CALL  MENSAJE5
        JMP   LEER


LEER4:
        CJNE  A,#4H,LEER
        CALL  MENSAJE6
        CALL  LUCES
        JMP   LEER

;***********************   PRINCIPAL    *******************************

LUCES:

        CALL  MENSAJE7
        CALL  GIRAR_L
        CALL  GIRO_L
        CALL  RETARDO1S
        CALL  GIRAR_R
        CALL  GIRO_R

;***************************************************************************
GIRAR_L:
        MOV   R5,#8
        MOV   A,#11111110B

GIRO_L:
        MOV   P0,A
        CALL  RETARDO1S
        RL    A
        DJNZ  R5,GIRO_L
        RET

GIRAR_R:
        MOV   R5,#8
        MOV   A,#01111111B
GIRO_R:
        MOV   P0,A
        CALL  RETARDO1S
        RR    A
        DJNZ  R5,GIRO_R
        RET

;*********************        MENSAJES          ****************************

MENSAJE1:                                 ;PRUB@ 2 LCD

         CALL  INI_LCD2
         MOV   BUSDATO,#80H
         CALL  CONTROL_LCD
         MOV   DPTR, #MENSAJ1
         CALL  IMPRIME_LCD

         CALL  LINEA_2

         RET

MENSAJE2:                                 ;PRUB@ 1 L€D`S
         CALL  INI_LCD2
         MOV   BUSDATO,#80H
         CALL  CONTROL_LCD
         MOV   DPTR, #MENSAJ2
         CALL  IMPRIME_LCD

         CALL  LINEA_2

         RET

MENSAJE3:                                 ;PRUB@ 3 TKL2  
         CALL  INI_LCD2
         MOV   BUSDATO,#80H
         CALL  CONTROL_LCD
         MOV   DPTR, #MENSAJ3
         CALL  IMPRIME_LCD

         CALL  LINEA_2

         RET

MENSAJE4:                                 ;PRUB@ 1 Y 2 B?€N
         CALL  INI_LCD2
         MOV   BUSDATO,#80H
         CALL  CONTROL_LCD
         MOV   DPTR, #MENSAJ4
         CALL  IMPRIME_LCD

         CALL  LINEA_2

         RET

MENSAJE5:                                 ;PRUB@ 3 €X?TOS@
         CALL  INI_LCD2
         MOV   BUSDATO,#80H
         CALL  CONTROL_LCD
         MOV   DPTR, #MENSAJ5
         CALL  IMPRIME_LCD

         CALL  LINEA_2

         RET

MENSAJE6:                                 ;@LUMN@:  M@RY CH
         CALL  INI_LCD2
         MOV   BUSDATO,#80H
         CALL  CONTROL_LCD
         MOV   DPTR, #MENSAJ6
         CALL  IMPRIME_LCD

         CALL  LINEA_2

         RET


MENSAJE7:                                 ;C.I: 
         CALL  INI_LCD2
         MOV   BUSDATO,#80H
         CALL  CONTROL_LCD
         MOV   DPTR, #MENSAJ7
         CALL  IMPRIME_LCD

         CALL  LINEA_2

         RET


;*************   RUTINA PARA OBTENER EL DATO POR TECLADO    *****************
TECLADO:         
                MOV P2,#0FFH
                CLR CHEQUEO
                CLR FILA1

UNO:            
                JB COLM1,DOS
                CALL TEMPO
                MOV TECLA,#1H
                MOV A,#'1'
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

DOS:            
                JB COLM2,TRES
                CALL TEMPO
                MOV TECLA,#2H
                MOV A,#'2'
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

TRES:           
                JB COLM3,CUATRO
                CALL TEMPO
                MOV TECLA,#3H
                MOV A,#'3'
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

CUATRO:         
                SETB FILA1
                CLR FILA2
                JB COLM1,CINCO
                CALL TEMPO
                MOV TECLA,#4H
                MOV A,#'4'
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

CINCO:          
                JB COLM2,SEIS
                CALL TEMPO
                MOV TECLA,#5H
                MOV A,#'5'
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

SEIS:           
                JB COLM3,SIETE
                CALL TEMPO
                MOV TECLA,#6H
                MOV A,#'6'
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

SIETE:          
                SETB FILA2
                CLR FILA3
                JB COLM1,OCHO
                CALL TEMPO
                MOV TECLA,#7H
                MOV A,#'7'
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

OCHO:           
                JB COLM2,NUEVE
                CALL TEMPO
                MOV TECLA,#8H
                MOV A,#'8'
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

NUEVE:          
                JB COLM3,DIEZ
                CALL TEMPO
                MOV TECLA,#9H
                MOV A,#'9'
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

DIEZ:           
                SETB FILA3
                CLR FILA4
                JB COLM1,ONCE
                CALL TEMPO
                MOV TECLA,#'*'
                MOV A,TECLA
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

ONCE:           
                JB COLM2,DOCE
                CALL TEMPO
                MOV TECLA,#0H
                MOV A,#'0'
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

DOCE:           
                JB COLM3,TRECE
                CALL TEMPO
                MOV TECLA,#'#'
                MOV A,TECLA
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                CALL DELAY
                SETB CHEQUEO
                MOV P2,#0FFH
                RET

TRECE:          
                MOV P2,#0FFH
                CALL DELAY
                RET


 ;****************************************************************;
 ;   RUTINA PARA INICIALIZAR Y CONFIGURAR LA LCD PARA DOS LINEAS  ;
 ;****************************************************************;

 INI_LCD2:      MOV P1,#01H         ;LIMPIAR PANTALLA
                CALL CONTROL_LCD
                MOV P1,#02H         ;RETORNAR CURSOR
                CALL CONTROL_LCD
                MOV P1,#06H         ;ENTRY MODE SET
                CALL CONTROL_LCD
                MOV P1,#0EH         ;ON/OFF
                CALL CONTROL_LCD
                MOV P1,#38H         ;2 LINEA
                CALL CONTROL_LCD
                CALL RATO
                CALL RATO
                RET

  ;***************************************************************;
  ;  RUTINA PARA REGRESAR AL CURSOR A LA COLUMNA O DE LA PRIMERA  ;
  ;                      FILA DE LA LCD                           ;
  ;***************************************************************;

  REGRE_CURSOR: MOV P1,#02H          ;RETORNAR CURSOR
                CALL CONTROL_LCD
                RET

  ;***************************************************************;
  ;            RUTINA PARA PASAR A LA SIGUIENTE LINEA             ;  
  ;***************************************************************;

  LINEA_2:      MOV P1, #11000000B
                CALL CONTROL_LCD
                RET

  ;***************************************************************;
  ;      RUTINA QUE PROPORCIONA SEÑAL DE CONTROL A LA LCD         ;
  ;***************************************************************;

  CONTROL_LCD:  SETB E
                CLR RS
                CALL RATO
                CLR E
                RET

  ;*****************************************************************;
  ; RUTINA QUE PROPORCIONA LAS SEÑALES DE CONTROL A LA LCD PARA     ;
  ; ENVIAR POSTERIORMENTE UNA PALABRA DE DATO                       ;
  ;*****************************************************************;


   ESCRITURA_LCD:       SETB E              ;E=1
                        SETB RS             ;RS=1
                        CALL RATO
                        CLR E               ;E=0
                        CLR RS              ;RS=0
                        RET

   RATO:        MOV R0, #04H
   LONGITUD:    MOV R1, #0FFH
   LONGI:       DJNZ R1, LONGI
                DJNZ R0, LONGITUD
                RET

  ;*******************************************************************;
  ; RUTINA QUE DA INTRUCCIONES A LA LCD PARA QUE LIMPIE LA PANTALLA   ;
  ;*******************************************************************;

  BARRIDO_LCD:  MOV P1,#01H
                CALL CONTROL_LCD
                RET

  ;**********************************************************************;
  ; RUTINA ENCARGADA DE IMPRIMIR EN LA PANTALLA UNA CADENA DE CARACTERES ;
  ; CON DB ' ' Y COLOCADAS EN EL DPTR                                    ;
  ;**********************************************************************;

  IMPRIME_LCD:  MOV R3,#00H
  REPITA:       
                MOV A,#00H
                MOVC A,@A+DPTR
                MOV BUSDATO,A
                CALL ESCRITURA_LCD
                INC DPTR
                INC R3
                CJNE R3,#16,REPITA
                CALL  RETARDO1S
                CALL  RETARDO1S
                CALL  RETARDO1S
                CALL  RETARDO1S
                CALL  RETARDO1S

                RET


;**************************RUTINAS DE TIEMPO*********************************

TIEMPO:         MOV R0,#03      ;0.0014 SEG APROX
BA1:            MOV R1,#05
BA2:            MOV R2,#10
BA3:            DJNZ R2,BA3
                DJNZ R1,BA2
                DJNZ R0,BA1
                RET

TEMPO:          MOV R0,#20      ;0.08 SEG APROX
TEMP:           MOV R1,#20
TEM:            MOV R2,#100
TE:             DJNZ R2,TE
                DJNZ R1,TEM
                DJNZ R0,TEMP
                RET

DELAY:          MOV R0,#20      ;0.12 SEG APROX
BU1:            MOV R1,#40
BU2:            MOV R2,#70
BU3:            DJNZ R2,BU3
                DJNZ R1,BU2
                DJNZ R0,BU1
                RET

RETARDO1S:      MOV R0,#36      ; 1 SEG APROX
RE3:            MOV R1,#50
RE2:             MOV R2,#254
RE1:            DJNZ R2,RE1
                DJNZ R1,RE2
                DJNZ R0,RE3
                RET

;************************************************************************
;                            TABLA DE MENSAJES
;************************************************************************

  MENSAJ1:     DB '  PRUB@ 2 LCD   ' 
  MENSAJ2:     DB '  PRUB@ 1 L€D`S '
  MENSAJ3:     DB '  PRUB@ 3 TKL2  '
  MENSAJ4:     DB 'PRUB@ 1 Y 2 B?€N'
  MENSAJ5:     DB 'PRUB@ 3 €X?TOS@ ' 
  MENSAJ6:     DB '@LUMN@: M@RY CH '
  MENSAJ7:     DB '   '


----------



## angelzero23 (Jun 7, 2009)

Hola soy nuevo en este foro soy estudiante de ingenieria electronica y me parece impresionante su manejo de microprocesadores, podrian recomendarme un tutorial o libro en español, aparte del manual del 8051, gracias de ante mano


----------



## manumanu2 (Nov 16, 2009)

Yo tb estudio electronica y estoy con el micro de atmel, el 89c52. La cuestion es que ando buscando algunos ejmplos en c, ya que mucho asm no manejo y prefiero hacerlo en c. Pero estoy medio permidod con el tema de display  por ejemplo, librerias y ese tipo de cosas. Cualquier ayuda que puedan darme seria buenisimo...
Mi mail por las dudas es: manuelsantiago901@hotmail.com
Gracias!!!
manu.-


----------



## Search Xtreme (Nov 16, 2009)

Que buen aporte mi amigo, precisamente estoy por comenzar el tema del LCD y estoy usando un micro con el core del 8051 saludos y gracias


----------



## pedropablooa (Jun 14, 2010)

Hola que tal, estoy haciendo un proyecto de control de una piscina climatizada mediante microcontrolador 8051. Quiero colocar una pantalla lcd para mostrar las lecturas de temperatura y humedad. 
Ya tengo el valor de la temperatura y la humedad dentro de la memoria y me gustaría que apareciera algo así en el displey:

Tª agua-> 23º C  Humedad-> 60%
         Tª aire-> 28º C

Me podría alguie explicar como hacer las rutinas, y mandarme algun ejemplo si tienes.

Gracias un saludo


----------



## cosmefulanito04 (Jun 14, 2010)

Aca tenes un buen tutorial del asunto:

http://8052.com/tutlcd

Si estas usando C, es muy sencillo pasar ese codigo de assembler a C. Otro consejo, es no usar el pin RW y hacer una rutina de espera usando for.


----------



## pedropablooa (Jun 27, 2011)

Hola tengo una pregunta para vosotros. Para imprimir en el LCD un dato que tengo en la memoria del micro que tengo que colocar? Tengo en la memoria un valor de la temperatura ya dividido en UNIDADES y DECENAS y quiero que aparezca. He utilizado las rutinas que he visto en esta página. Para que aparezca una letra la coloco entre comillas pero para que me aparezca el valor que tengo en memoria no se como hacerlo
MOV A,#'T'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'M'
LCALL WRITE_TEXT
MOV A,#'P'
LCALL WRITE_TEXT

MOV A, DECENAS   ????
LCALL WRITE_TEXT
MOV A, UNIDADES  ????
LCALL WRITE_TEXT


----------



## Scooter (Jun 27, 2011)

Necesitas convertir el valor numérico a ascii que es lo que entiende el micro.
Ahora tengo prisa pero te postearé unas rutinas "un poco" mas elaboradas que lo que has  puesto


----------



## pedropablooa (Jun 27, 2011)

gracias me sería de gran ayuda


----------

