Está en la página 1de 10

Ejemplo del uso del display LCD HD44780 en modo

4 bits con el 8052


Ejemplo del uso del display LCD HD44780 en modo
Ejemplo del uso del display LCD HD44780 en modo
4 bits con el 8052
4 bits con el 8052
Carlos Canto Q.
MICROCONTROLADORES
EJEMPLO DE CONEXIN Y PROGRAMACIN DE UN MDULO LCD A UN 8051
(EN MODO 4 BITS )
Carlos Canto Q.
MICROCONTROLADORES
Implementar un programa, tal que, al energizar el sistema Implementar un programa, tal que, al energizar el sistema
que aparezca en el display LCD el siguiente mensaje: que aparezca en el display LCD el siguiente mensaje:
-- --BIENVENIDOS A BIENVENIDOS A- -
- -SAN LUIS POTOS SAN LUIS POTOS
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
DB7
DB6
DB5
DB4
P1.7
P1.6
P1.5
P1.4
P1.3
RS E R/ W
P1.2
10 K
+5V
DB3 DB2 DB1 DB0
PROGRAMCIN DEL LCD EN MODO 4 BITS , PARA DESPELGAR UN MENSAJE DE 32 CARACTERES
Carlos Canto Q.
MICROCONTROLADORES
Inicializar contador
de caracters
Inicializar contador
de caracters
Leer de la memoria
caracter del mensaje
Leer de la memoria
caracter del mensaje
Escribir al LCD nibble
alto del caracter
Escribir al LCD nibble
alto del caracter
Escribir al LCD nibble
bajo del caracter
Escribir al LCD nibble
bajo del caracter
Espera 15 ms
Espera 15 ms
Incrementar contador
de caracters
Incrementar contador
de caracters
contador de
caracteres=32?
contador de
caracteres=32?
Contador de
carcter =16?
Contador de
carcter =16?
Espera 40 s
Espera 40 s
fin
fin
Cambia a lnea 2
Cambia a lnea 2
si
si
No
No
Inicializar LCD
en modo 4 bits
Inicializar LCD
en modo 4 bits
Carlos Canto Q.
MICROCONTROLADORES
CACRACTER 31
CACRACTER 31
CACARCTER 30
CACARCTER 30
CACARCTER 29
CACARCTER 29
CACRACTER 28
CACRACTER 28
0000
CACRCATER 6
CACRCATER 6
CARACTER 5
CARACTER 5
CARACTER4
CARACTER4
CARACTER 3
CARACTER 3
CARACTER 2
CARACTER 2
CARACTER 1
CARACTER 1
CARACTER 0
CARACTER 0
Programa
Programa
400H+1FH
MEMORIA DE PROGRAMA
FORMA DE UBICAR CON EL ENSAMBLADOR , EL MENSAJE
EN LA MEMORIA DE PROGRAMA
; Mensajes en ASCII a desplegar en el LCD
ORG TABLA
TABLA: DB --BIENVENIDOS A-
DB -SAN LUIS POTOSI
; Mensajes en ASCII a desplegar en el LCD
ORG TABLA ORG TABLA
TABLA: DB TABLA: DB -- --BIENVENIDOS A BIENVENIDOS A- -
DB DB - -SAN LUIS POTOSI SAN LUIS POTOSI
400H+00
;DEFINICION DE SIMBOLOS USADOS EN EL PROGRAMA
RS EQU P1.3 ;selector de registro
EN EQU P1.2 ;habilitador del LCD
FUNC_SET_8 EQU 30h ; Seleccin de bus de 8 bits
FUNC_SET_4 EQU 20h ; Seleccin de bus de 4 bits
FUNC_SET_4x2 EQU 28h ; Seleccin de bus de 4 bits , 2 lneas, 5x7
CLEAR_LCD EQU 01h ; limpia el display
DISPLAY_OFF EQU 08h ; Apaga el display y cursor
ENTRY_MODE_SET EQU 04h ; No desplaza el display
TABLA EQU 400H ;inicio de los mensajes
LINEA_2 EQU 0C0H ;direccin de inicio de la lnea 2
DELAY_40 EQU 1 ;Tiempo de espera > 40s
DELAY_100 EQU 2 ; tiempo de espera > 100s
DELAY_1.64 EQU 34d ; tiempo de espera > 1.64 ms
DELAY_4.1 EQU 92d ; tiempo de espera >4.1 ms
DELAY_8 EQU 180d ;tiempo de espera >8ms
;DEFINICION DE SIMBOLOS USADOS EN EL PROGRAMA
RS EQU P1.3 ; RS EQU P1.3 ;selector de registro
EN EN EQU P1.2 ; EQU P1.2 ;habilitador del LCD
FUNC_SET FUNC_SET_8 EQU 30h _8 EQU 30h ; Seleccin de bus de 8 bits
FUNC_SET FUNC_SET_4 EQU 20h _4 EQU 20h ; Seleccin de bus de 4 bits
FUNC_SET FUNC_SET_4x2 EQU 28h _4x2 EQU 28h ; Seleccin de bus de 4 bits , 2 lneas, 5x7
CLEAR_LCD CLEAR_LCD EQU 01h EQU 01h ; limpia el display
DISPLAY_OFF DISPLAY_OFF EQU 08h EQU 08h ; Apaga el display y cursor
ENTRY_MODE_SET ENTRY_MODE_SET EQU 04h EQU 04h ; No desplaza el display
TABLA EQU 400H TABLA EQU 400H ;inicio de los mensajes
LINEA_2 EQU 0C0H LINEA_2 EQU 0C0H ;direccin de inicio de la lnea 2
DELAY_40 EQU 1 DELAY_40 EQU 1 ;Tiempo de espera > 40s
DELAY_100 EQU 2 DELAY_100 EQU 2 ; tiempo de espera > 100s
DELAY_1.64 EQU 34d DELAY_1.64 EQU 34d ; tiempo de espera > 1.64 ms
DELAY_4.1 EQU 92d DELAY_4.1 EQU 92d ; tiempo de espera >4.1 ms
DELAY_8 EQU 180d DELAY_8 EQU 180d ;tiempo de espera >8ms
Carlos Canto Q.
MICROCONTROLADORES
Programa para desplegar un mensaje de 32 caracteres al LCD
Programa para desplegar un mensaje de 32 caracteres al LCD
MAIN:
LJMP INICIO
ORG 200H
INICIO: CLR RS ;seleccionar registro de instruccin
CLR EN
MOV R3,#DELAY_8
CALL ESPERA ;espera > 15 ms para que Vcc se estabilice
CALL ESPERA
LCALL INIT_LCD ;Inicializar el LCD en modo 4 bits
MOV R0,#00
MOV DPTR,#TABLA
OTRO: CALL LEE_CHAR
SET RS ;seleccin del registro de datos
CALL ESCRIBE_LCD_4
MOV R3,#DELAY_40
CALL ESPERA
INC R0
CJNE R0,#20H,LINEA_1 ; es el ltimo caracter del mensaje?
END: SJMP END
LINEA_1: CJNE R0,#10H,OTRO ;es el ltimo carcter de la lnea 1?
MOV A,#LINEA_2 ; si es as, pasa a la lnea 2
CLR RS ;selecciona el registro de instruccin
CALL ESCRIBE_LCD_4 ;carga el contador de direccin (AC) con 40h
MOV R3,#DELAY_40
CALL ESPERA
SJMP OTRO ;ve a leer el siguiente caracter
MAIN: MAIN:
LJMP LJMP INICIO INICIO
ORG 200H ORG 200H
INICIO: INICIO: CLR RS CLR RS ;seleccionar registro de instruccin
CLR EN CLR EN
MOV R3, MOV R3,#DELAY #DELAY_8 _8
CALL ESPERA CALL ESPERA ;espera > 15 ms para que Vcc se estabilice
CALL ESPERA CALL ESPERA
LCALL LCALL INIT_LCD INIT_LCD ;Inicializar el LCD en modo 4 bits
MOV R0,#00 MOV R0,#00
MOV DPTR, MOV DPTR,#TABLA #TABLA
OTRO: OTRO: CALL CALL LEE_CHAR LEE_CHAR
SET RS SET RS ;seleccin del registro de datos
CALL CALL ESCRIBE_LCD ESCRIBE_LCD_4 _4
MOV R3, MOV R3,#DELAY #DELAY_40 _40
CALL ESPERA CALL ESPERA
INC R0 INC R0
CJNE R0, CJNE R0,#20H,LINEA #20H,LINEA_1 _1 ; es el ltimo caracter del mensaje?
END: END: SJMP END SJMP END
LINEA_1: CJNE R0, LINEA_1: CJNE R0,#10H,OTRO #10H,OTRO ;es el ltimo carcter de la lnea 1?
MOV A, MOV A,#LINEA #LINEA_2 _2 ; si es as, pasa a la lnea 2
CLR RS CLR RS ;selecciona el registro de instruccin
CALL CALL ESCRIBE_LCD ESCRIBE_LCD_4 _4 ;carga el contador de direccin (AC) con 40h
MOV R3, MOV R3,#DELAY #DELAY_40 _40
CALL ESPERA CALL ESPERA
SJMP OTRO SJMP OTRO ;ve a leer el siguiente caracter
Carlos Canto Q.
MICROCONTROLADORES
fin fin
INICIALIZACIN DEL MDULO LCD HD44780 EN MODO 4 BITS SIN
CHEQUEO DE BF
MICROCONTROLADORES
DISPLAY LCD
Carlos Canto Q.
RsIR
RsIR
AFUNC_SET_8
AFUNC_SET_8
A CLEAR_LCD
A CLEAR_LCD
CARGA_LCD
CARGA_LCD
Power on
ESPERA 4.1 ms
ESPERA 4.1 ms
ESPERA 15ms
ESPERA 15ms
CARGA_LCD
CARGA_LCD
ESPERA 1.64 ms
ESPERA 1.64 ms
AFUNC_SET_8
AFUNC_SET_8
ESPERA 100s
ESPERA 100s
AFUNC_SET_8
AFUNC_SET_8
AFUNC_SET_4
AFUNC_SET_4
ESPERA 40 s
ESPERA 40 s
AFUNC_SET_4X2
AFUNC_SET_4X2
ESPERA 40 s
ESPERA 40 s
ADISPLAY_OFF
ADISPLAY_OFF
ESPERA 40 s
ESPERA 40 s
ESPERA 40 s
ESPERA 40 s
CARGA_LCD
CARGA_LCD
ESPERA 4.1 ms
ESPERA 4.1 ms
CARGA_LCD
CARGA_LCD
CARGA_LCD
CARGA_LCD
CARGA_LCD
CARGA_LCD
CARGA_LCD
CARGA_LCD
A ENTRY_MODE_SET
A ENTRY_MODE_SET
CARGA_LCD
CARGA_LCD
Fin de inicializacin
Fin de inicializacin
INICIALIZACIN DEL MDULO LCD HD44780 EN MODO 4 BITS SIN
CHEQUEO DE BF
MICROCONTROLADORES
DISPLAY LCD
Carlos Canto Q.
MOV A, MOV A,#FUNCION_SET #FUNCION_SET_8 _8
CALL CALL ESCRIBE_LCD ESCRIBE_LCD_8 _8
MOV R3,DELAY_4.1 MOV R3,DELAY_4.1
CALL ESPERA CALL ESPERA
MOV A, MOV A,#FUNCION_SET #FUNCION_SET_8 _8
CALL CALL ESCRIBE_LCD ESCRIBE_LCD_8 _8
MOV R3, MOV R3,#DELAY #DELAY_100 _100
CALL ESPERA CALL ESPERA
MOV A, MOV A,#FUNCION_SET #FUNCION_SET_8 _8
CALL CALL ESCRIBE_LCD ESCRIBE_LCD_8 _8
MOV R3, MOV R3,#DELAY #DELAY_4.1 _4.1
CALL ESPERA CALL ESPERA
MOV A, MOV A,#FUNCION_SET #FUNCION_SET_4X2 _4X2
CALL CALL ESCRIBE_LCD ESCRIBE_LCD_8 _8
MOV R3, MOV R3,#DELAY #DELAY_40 _40
CALL ESPERA CALL ESPERA
MOV A, MOV A,#DISPALY_OFF #DISPALY_OFF
CALL CALL ESCRIBE_LCD ESCRIBE_LCD_4 _4
MOV R3, MOV R3,#DELAY #DELAY_40 _40
CALL ESPERA CALL ESPERA
MOV A, MOV A,#CLEAR_LCD #CLEAR_LCD
CALL CALL ESCRIBE_LCD ESCRIBE_LCD_4 _4
MOV R3, MOV R3,#DELAY #DELAY_1.64 _1.64
CALL ESPERA CALL ESPERA
MOV A, MOV A,#ENTRY_MODE_SET #ENTRY_MODE_SET
CALL CALL ESCRIBE_LCD ESCRIBE_LCD_4 _4
MOV R3, MOV R3,#DELAY #DELAY_40 _40
CALL ESPERA CALL ESPERA
RET RET
;Subrutina para leer un carcter de la memoria
MOV A,R0
MOVC A ,@A+DPTR
MOV R1,A
RET
;Subrutina para leer un carcter de la memoria
MOV A,R0
MOVC A ,@A+DPTR
MOV R1,A
RET
LEE_CHAR:
LEE_CHAR:
Carlos Canto Q.
MICROCONTROLADORES
CACRACTER 31
CACRACTER 31
CACARCTER 30
CACARCTER 30
CACARCTER 29
CACARCTER 29
CACRACTER 28
CACRACTER 28
0000
CACRCATER 6
CACRCATER 6
CARACTER 5
CARACTER 5
CARACTER4
CARACTER4
CARACTER 3
CARACTER 3
CARACTER 2
CARACTER 2
CARACTER 1
CARACTER 1
CARACTER 0
CARACTER 0
Programa
Programa
400H+1FH
MEMORIA DE PROGRAMA
ESCRIBE_LCD_4:
; subrutina para cargar un caracter al LCD en modo 4 bits
ORL A,#00001111b ;forzar a 1s el nibble bajo
SETB EN ;sube lnea EN
MOV C,RS ;lee el valor de lnea RS
MOV ACC.2,C ;copia RS en acumulador para no alterarla
MOV P1,A ;enva al LCD el nibble alto de A
CLR EN
MOV A,R1 ;lee de nuevo carcter salvado en R1
SWAP A ;intercambia nibble alto y nibble bajo
SETB EN ;sube la lnea EN
MOV ACC.2,C
ORL A,#00001111b
MOV P1,A ;enva al LCD el nibble bajo
CLR EN
RET
ESCRIBE_LCD ESCRIBE_LCD_4: _4:
; subrutina para cargar un caracter al LCD en modo 4 bits
ORL A, ORL A,#00001111b #00001111b ;forzar a 1s el nibble bajo
SETB EN SETB EN ;sube lnea EN
MOV MOV C,RS C,RS ;lee el valor de lnea RS
MOV ACC.2,C MOV ACC.2,C ;copia RS en acumulador para no alterarla
MOV P1,A MOV P1,A ;enva al LCD el nibble alto de A
CLR EN CLR EN
MOV MOV A,R1 A,R1 ;lee de nuevo carcter salvado en R1
SWAP A SWAP A ;intercambia nibble alto y nibble bajo
SETB EN SETB EN ;sube la lnea EN
MOV ACC.2,C MOV ACC.2,C
ORL A, ORL A,#00001111b #00001111b
MOV P1,A MOV P1,A ;enva al LCD el nibble bajo
CLR EN CLR EN
RET RET
Carlos Canto Q.
MICROCONTROLADORES
ESCRIBE_LCD_8:
; subrutina para cargar el LCD en modo 8 bits
ORL A,#00001111b ;forzar a 1s el nibble bajo
SETB EN ;sube lnea EN
MOV C,RS ;lee el valor de lnea RS
MOV ACC.2,C ;copia RS en acumulador para no alterarla
MOV P1,A ;enva al LCD el nibble alto de A
CLR EN
RET
ESCRIBE_LCD ESCRIBE_LCD_8: _8:
; subrutina para cargar el LCD en modo 8 bits
ORL A, ORL A,#00001111b #00001111b ;forzar a 1s el nibble bajo
SETB EN SETB EN ;sube lnea EN
MOV MOV C,RS C,RS ;lee el valor de lnea RS
MOV ACC.2,C MOV ACC.2,C ;copia RS en acumulador para no alterarla
MOV P1,A MOV P1,A ;enva al LCD el nibble alto de A
CLR EN CLR EN
RET RET
Carlos Canto Q.
MICROCONTROLADORES
;Subrutina Delay
DELAY: MOV R2,#23d
AQU: DJNZ R2,AQU
DJNZ R3,DELAY
RET
;Subrutina Delay
DELAY: MOV R2,#23d
AQU: DJNZ R2,AQU
DJNZ R3,DELAY
RET
ESPERA_40:
ESPERA_40:
Carlos Canto Q.
MICROCONTROLADORES
SWAP A
SWAP A
Funci Funci n: n: Intercambiar los nibbles del acumulador
Descripci Descripci n: n: SWAP A intecambia los nibbles de bajo y alto orden del
acumulador (bits 3-0 y bits7-4). La operacin tambin puede ser
pensada como una instruccin de rotacin de 4 bits. Las banderas no
se afectan..
Ejemplo: Ejemplo: El Acumulador tiene el valor OC5H (1100010B). La
instruccin SWAP A deja cargado el valor 5CH (01011100B)
Bytes: 1
Ciclos: 1
cdigo:
Operaci Operaci n: n: SWAP A
(A3-0) (A7-4)

Carlos Canto Q.
MICROCONTROLADORES
Nibble alto
Nibble alto
Nibble bajo
Nibble bajo
Carlos Canto Q.
MICROCONTROLADORES
Rutina generadora de retardos (ESPERA)
R2 N0
R2 N0
R2=0
?
R2=0
?
Ret
Ret
R3 R3-1
R3 R3-1
R2 R2-1
R2 R2-1
R3=0
?
R3=0
?
ESPERA
ESPERA
PROGRAMA FUENTE
MOV R3,#N1
LCALL ESPERA
.
.
.
.
;Subrutina ESPERA
ESPERA_40:
DELAY: MOV R2,#N0
AQU: DJNZ R2,AQU
DJNZ R3,DELAY
RET
NO
NO
SI
SI
Antes de invocar a esta subrutina se debe
cargar R3 con el correspondiente N1
Antes de invocar a esta subrutina se debe Antes de invocar a esta subrutina se debe
cargar R3 con el correspondiente N1 cargar R3 con el correspondiente N1
Carlos Canto Q.
MICROCONTROLADORES
CLCULO DEL RETARDO GENERADO POR LA RUTINA DELAY (>=40s) C C LCULO DEL RETARDO GENERADO POR LA RUTINA DELAY (>=40 LCULO DEL RETARDO GENERADO POR LA RUTINA DELAY (>=40 s) s)
2s R3 R3 24 DJNZ R3,DELAY
2S 1 24 RET
2s(R2xR3) R2xR3 24 DJNZ R2,AQUI AQU:
1S ( R3 ) R3 12 MOV R3,#N0 DELAY:
t ttotal total
# de ejecuciones # de ejecuciones # de T # de T Mnem Mnem nico nico Etiqueta Etiqueta
Si suponemos que ; fosc=12 Mhz T=(1/12)s
t tTOT TOT= [1R3+ = [1R3+2R2xR3 2R2xR3+2R3 +2] +2R3 +2] s s =[ =[2R2xR3 2R2xR3+3R3+2] +3R3+2] s s
R3(2R2+3) = R3(2R2+3) = t tTOT TOT- -2 ; 2R2+3=( 2 ; 2R2+3=(t tTot Tot- -2)/ 2)/R3 R3 R2 R2 = [( = [(t tTOT TOT- -2)/2R3] 2)/2R3]- -3/2 ; 3/2 ;
si si R3=1 R3=1 para para t tTOT TOT=50 =50 s s entonces calculamos entonces calculamos
N0=[(50 N0=[(50- -2)/2] 2)/2]- -1.5=22.5~23 tenemos que para conseguir un retardo 1.5=22.5~23 tenemos que para conseguir un retardo
> de 40 > de 40 s s R2=23 R2=23
Carlos Canto Q.
MICROCONTROLADORES
CLCULO PARA OBTENER EL RETARDO >= 4.1 mS C C LCULO PARA OBTENER EL RETARDO >= 4.1 LCULO PARA OBTENER EL RETARDO >= 4.1 mS mS
R2=[( R2=[(t tTOT TOT - -2)/2R3] 2)/2R3]- -3/2 ; ya que R2=23 3/2 ; ya que R2=23 para para t tTOT TOT=50 =50 s s
Despejando R3, tenemos que: Despejando R3, tenemos que:
R3=( R3=(t tTOT TOT- -2)/(2R2+3) ;sustituimos 2)/(2R2+3) ;sustituimos t tTOT TOT= 4.5 = 4.5 ms ms= 4500 = 4500 s s
y R2=23 y R2=23
Tenemos que: R3= 4498/[2(23)+3]=4498/49=91.8 ~92 Tenemos que: R3= 4498/[2(23)+3]=4498/49=91.8 ~92
Finalmente con: Finalmente con:
R2=23 R2=23 y y R3=92 R3=92 obtenemos un retardo > de 4.1 obtenemos un retardo > de 4.1 ms ms
Carlos Canto Q.
MICROCONTROLADORES
CLCULO PARA OBTENER EL RETARDO >= 100S C C LCULO PARA OBTENER EL RETARDO >= 100 LCULO PARA OBTENER EL RETARDO >= 100 S S
R3=( R3=(t tTOT TOT- -2)/(2R2+3) ;sustituimos 2)/(2R2+3) ;sustituimos t tTOT TOT=100 =100 s s
Tenemos que: R3= 98/49 =2 Tenemos que: R3= 98/49 =2
Finalmente con: Finalmente con:
R2=23 R2=23 y y R3=2 R3=2 obtenemos un retardo > de 100 obtenemos un retardo > de 100 s s
Carlos Canto Q.
MICROCONTROLADORES
CLCULO PARA OBTENER EL RETARDO >= 1.64mS C C LCULO PARA OBTENER EL RETARDO >= 1.64mS LCULO PARA OBTENER EL RETARDO >= 1.64mS
R3=( R3=(t tTOT TOT- -2)/(2R2+3) ;sustituimos 2)/(2R2+3) ;sustituimos t tTOT TOT=1,640 =1,640 s s
Tenemos que: R3=1638/49 =33.43~34 Tenemos que: R3=1638/49 =33.43~34
Finalmente con: Finalmente con:
R2=23 R2=23 y y R3=34 R3=34 obtenemos un retardo > de 1.64 obtenemos un retardo > de 1.64 m ms s
Carlos Canto Q.
MICROCONTROLADORES
CLCULO PARA OBTENER EL RETARDO >= 15 mS C C LCULO PARA OBTENER EL RETARDO >= 15 LCULO PARA OBTENER EL RETARDO >= 15 mS mS
Si cargamos R3 con 180 Si cargamos R3 con 180
Tenemos que : Tenemos que :
t tTOT TOT=[R3(2R2+3)+2] =[R3(2R2+3)+2] s s= 180(49) +2=8822 = 180(49) +2=8822 s s
t tTOT TOT=8.822ms =8.822ms
Por lo tanto si invocamos 2 veces esta subrutina Por lo tanto si invocamos 2 veces esta subrutina
obtenemos un retardo de obtenemos un retardo de 17.644 17.644 ms ms > 15ms > 15ms

También podría gustarte