LCD con 8051

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
 
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.
 
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
 
;***************************************************************************
; :LOL: :LOL: :LOL:
;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 ' '
 
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
 
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.-
 
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
 
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
 
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
 
Atrás
Arriba