Un LCD (Liquid Crystal Display) es un dispositivo de visualización gráfica para presentación de caracteres, símbolos o incluso dibujos.
Un LCD 16x2 dispone de 2 filas de 16 caracteres cada una. cada caracter se muestra en un a Matríz de 5x7 puntos (pixeles). Está gobernado por un microcontrolador Hitachi 44780 que facilita la comunicación con otros dispositivos.
Características:
- Pantalla de caracteres ASCII, caracteres Kanji y Griegos.
- Desplazamiento de caracteres hacia la izquierda o hacia la derecha.
- Memoria de 40 caracteres por linea.
- Movimiento del cursor.
- Programación de 8 caracteres por el usuario.
- Conexión mediante interfaz de 4 u 8 bit.
Funcionamiento
La comunicación puede hacerse de 2 maneras: Con bus de 4 bits o con bus de 8 bits. Se utilizará bus de 8 bits por la mayor simplicidad de implementarlo en Assembler.
Las líneas de datos son Tri-state, es decir, cuando el LCD no está habilitado sus pines de datos tienen alta impedancia.
Nº PIN
|
DESCRIPCION
| |
1
|
VSS
|
GND
|
2
|
VDD
|
VDD (5 V)
|
3
|
V0
|
Contraste ( 0 a +5V )
|
4
|
RS
|
Registro de control/Registro de datos:
RS=0 Selección registro de control
RS=1 Selección registro de datos
|
5
|
R/W
|
Lectura/Escritura:
R/W=0 Escritura (Write)
R/W=1 Lectura (Read)
|
6
|
E
|
Habilitación:
E=0 Deshabilitado
E=1 Habilitado
|
7-14
|
D0-D7
|
Bus de datos bidireccional.
|
Juego de Instrucciones del LCD con controlador Hitachi 44780
Clear Display
Borrar y colocar el cursor en la primera posición (dirección 0). Pone el bit I/D a 1 por defecto.
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
Home
Colocar el cursor en la posición de inicio (dirección 0) y hacer que el display comience a desplazarse desde la posición original. El contenido de la memoria RAM de datos de visualización (DD RAM) permanece invariable. La dirección de la memoria RAM de datos para la visualización (DD RAM) se pone a 0.
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
X
|
Entry Mode Set
Establecer la dirección de movimiento del cursor y especificar si la visualización se desplaza a la siguiente posición de la pantalla o no. Estas operaciones se ejecutan durante la lectura o escritura de la DD RAM o CG RAM. Para visualizar normalmente poner el bit S=0.
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
I/D
|
S
|
Display ON/OFF Control
Activar o desactivar poniendo en ON/OFF tanto el LCD (D) como el cursor (C) y establecer si este último debe o no parpadear (B).
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
D
|
C
|
B
|
Cursor or Display Shift
Mover el cursor y desplazar el LCD sin cambiar el contenido de la memoria de datos de visualización DD RAM.
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
0
|
0
|
0
|
0
|
0
|
1
|
S/C
|
R/L
|
X
|
X
|
Function Set
Establecer el tamaño de interface con el bus de datos (DL), número de líneas del LCD (N) y tipo de carácter (F).
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
0
|
0
|
0
|
0
|
1
|
DL
|
N
|
F
|
X
|
X
|
Set the CG RAM Address
El módulo LCD además de tener definidos todo el conjunto de caracteres ASCII permite al usuario definir 4 u 8 caracteres. La composición de estos caracteres se va guardando en una memoria llamada CG RAM con capacidad para 64 bytes. Cada carácter definido por el usuario se compone de 16 u 8 bytes que se almacenan en sucesivas posiciones de la CG RAM.
Mediante esta instrucción se establece la dirección de memoria CG RAM a partir de la cual se irán almacenando los bytes que definen un carácter. Ejecutando este comando todos los datos que se lean o escriban posteriormente lo harán desde esta memoria CG RAM.
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
0
|
0
|
0
|
1
|
Dirección de la CG RAM
|
Set the DD RAM Address
Los caracteres o datos a visualizar se almacenan en una memoria llamada DD RAM para luego pasar a la pantalla.
Mediante esta instrucción se establece la dirección de la memoria DD RAM a partir de la cual se almacenarán los datos a visualizar. Ejecutando este comando todos los datos que se escriban o lean posteriormente lo harán desde esta memoria DD RAM.
Las direcciones 80h a 8Fh corresponden a los 16 caracteres del primer renglón y las direcciones C0h a CFh a los 16 caracteres del segundo renglón, para este modelo de LCD.
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
0
|
0
|
1
|
Dirección de la DD RAM
|
Read Busy Flag and Address
El módulo LCD tarda un cierto tiempo para ejecutar las instrucciones, tiempo en que no se debe enviar otra instrucción. Para ello dispone de un flag BUSY (ocupado) que indica que se está ejecutando una instrucción.
Esta instrucción de lectura informa del estado de dicho flag además de proporcionar el valor del contador de direcciones de la CG RAM o de la DD RAM según la última que se haya empleado.
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
0
|
1
|
BF
|
Dirección de la CG RAM o DD RAM
|
Write data to CG or DD RAM
Comando para escribir en la memoria DD RAM los datos que se quieren presentar en pantalla, en código ASCII.
Igualmente se escribe en la memoria CG RAM los bytes para generar caracteres definidos por el usuario.
Previamente se direcciona la memoria DD RAM o la memoria CG RAM en la que se quiere escribir datos.
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
1
|
0
|
Código ASCII o byte del carácter gráfico
|
Read Data from CG RAM or DD RAM
Comando para leer los datos almacenados en la memoria DD RAM, en código ASCII.
Igualmente se lee de la memoria CG RAM los bytes de los caracteres definidos por el usuario.
Previamente se direcciona la memoria DD RAM o la memoria CG RAM de la que se quiere leer los datos.
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
1
|
1
|
Código ASCII o byte del carácter gráfico
|
Programa que incluye subrutinas para mostrar dos lineas de caracteres en el LCD 16x2.
Diagrama de Conexión:
Prueba:
Programa en Assembler:
;----------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa para control de LCD con controlador Hitachi 44780
;2x16 lineas
;Configuracion de pines:
;RA0: RS (Pin 4)
;RA1: R/W (Pin 5)
;RA2: E (Pin 6)
;RB0-RB7: D0-D7 (Pines 7-14)
;----------------------------------------------------------
include "p16f84a.inc"
LIST P=16f84a
__CONFIG _WDT_OFF & _XT_OSC
COUNT1 equ 0x0C
COUNT2 equ 0x0D
CURSOR equ 0x0E
org 0x00 ; Inicio de Programa
BEGIN: bsf STATUS,5; Inicio configuracion E/S
clrf PORTB ; Puerto B como salida
clrf PORTA ; Puerto A como salida
bcf STATUS,5; Fin configuracion E/S
clrf PORTA
call DELAY
START: call INI ; Inicializacion de LCD
movlw 0x01 ; b'00000001' Clear display
call REG
movlw 0x06 ; b'00000110' Incrementa cursor I/D=1
call REG ; y visualizacion modo normal S=0
movlw 0x0C ; b'00001100' Display ON D=1
call REG ; Cursor OFF C=0 y Parpadeo OFF B=0
movlw 0x80 ; Direccion inicio de almacenamiento
call REG ; de datos (Linea 1 comienza en 80h)
clrf CURSOR ; CURSOR almacena #caracter a enviar
ROW1: movf CURSOR,0
call CONV
call DAT ; Enviar a memoria de datos
incf CURSOR,1
movlw 0x09
subwf CURSOR,0; Enviar datos hasta que CURSOR=9
btfss STATUS,2
goto ROW1
movlw 0xC0 ; Direccion inicio de almacenamiento
call REG ; de datos (Linea 2 comienza en C0h)
ROW2: movf CURSOR,0
call CONV
call DAT ; Enviar a memoria de datos
incf CURSOR,1
movlw 0x15
subwf CURSOR,0; Enviar datos hasta que CURSOR=15
btfss STATUS,2
goto ROW2
ILOOP: nop ; Bucle infinito cuando se termine de
goto ILOOP ; enviar todos los datos
;Subrutinas
;BUSY: Subrutina para no enviar datos al LCD cuando
; esta ocupado
BUSY bsf PORTA,1 ; R/W=1 (Lectura de LCD)
bsf STATUS,5
movlw 0xFF
movwf PORTB ; RB7 como entrada (BF:Busy Flag)
bcf STATUS,5
bsf PORTA,2 ; E=1 (Habilitar LCD)
nop
LCD_BU: btfsc PORTB,7 ; Verificar si LCD esta ocupado
goto LCD_BU ; Bucle mientras BF=1
bcf PORTA,2 ; E=0 (Deshabilitar LCD)
bsf STATUS,5
clrf PORTB ; Puerto B como salida
bcf STATUS,5
bcf PORTA,1 ; R/W=0 (Escritura de LCD)
return
;Subrutina para enviar datos a Registro de control
REG bcf PORTA,0 ; Seleccion de reg. de control
movwf PORTB ; Preparar envio de datos
call BUSY ; Verificar si LCD esta ocupado
bsf PORTA,2 ; E=1 (Habilitar LCD)
nop ; Almacena dato en reg. control
bcf PORTA,2 ; E=0 (Deshabilitar LCD)
return
;Subrutina para enviar datos a memoria de datos
DAT bcf PORTA,0 ; Seleccion de reg. de control
movwf PORTB ; Preparar envio de datos
call BUSY ; Verificar si LCD esta ocupado
bsf PORTA,0 ; Seleccion de reg. de datos
bsf PORTA,2 ; E=1 (Habilitar LCD)
nop ; Almacena dato en memoria
bcf PORTA,2 ; E=0 (Deshabilitar LCD)
return
;Subrutina de inicializacion de LCD
INI movlw 0x38 ; b'00111000'
call REG ; DL=1, N=1, F=0
call DELAY ; linea de 8 bits, 2 lineas
return ; caracter 5x7 puntos
;Subrutina de retardo para que LCD complete operaciones
DELAY movlw 0xFF
movwf COUNT2
clrf COUNT1
LOOP: decfsz COUNT1,1
goto LOOP
decfsz COUNT2,1
goto LOOP
return
;Subrutina que devuelve en W el codigo ascii de caracter
;a enviar a LCD
CONV addwf PCL,1
retlw 'l'
retlw 'o'
retlw 'n'
retlw 'e'
retlw 'l'
retlw 'y'
retlw '1'
retlw '1'
retlw '3'
retlw 'b'
retlw 'l'
retlw 'o'
retlw 'g'
retlw 's'
retlw 'p'
retlw 'o'
retlw 't'
retlw '.'
retlw 'c'
retlw 'o'
retlw 'm'
return
end ;Fin de programa
****Programa en Pic Basic (Microcode)****
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : LONELY113 *
'* Notice : Copyright (c) 2011 LONELY113 *
'* : All Rights Reserved *
'* Date : 12/05/2011 *
'* Version : 1.0 *
'* Notes : PIC16f84a *
'* : Pines de LCD: RB7-RB4=D7-D4 (Modo de 4 bits) *
'* : RA0=RS, RA1=RW, RA2=E *
'****************************************************************
@ __CONFIG _HS_OSC & _WDT_OFF
define OSC 10 '10 MHz'Definiciones para módulo LCDDEFINE LCD_BITS 4 'Bus de 4 bits
DEFINE LCD_LINES 2 'LCD de 2 filas
DEFINE LCD_DREG PORTB 'Puerto de datos a LCD
DEFINE LCD_DBIT 4 'Bits 4 a 7 de PORTB
DEFINE LCD_RSREG PORTA 'Puerto A seleccion de registro
DEFINE LCD_RSBIT 0 'RA0=RS de LCD
DEFINE LCD_RWREG PORTA 'Puerto A Lectura/Escritura
DEFINE LCD_RWBIT 1 'RA1=RW de LCD
DEFINE LCD_EREG PORTA 'Puerto A Habilitacionde LCD
DEFINE LCD_EBIT 2 'RA2=E de LCD
DEFINE LCD_COMMANDUS 2000 'Retardo ente comandos en us
DEFINE LCD_DATAUS 50 'Retardo entre datos en us
LCDOUT $FE, 1 'Borrar la pantalla
LCDOUT $FE, $0C 'Primera fila, cursor off
LCDOUT "lonely113" 'Enviar cadena
LCDOUT $FE, $C0 'Cursor a segunda fila
LCDOUT "blogspot.com" 'Enviar cadena
END
Archivos .ASM y .HEX
Descargar
Programar en PICBasic es de perdedores, programar en C es de ganadores y en ensamblador es de varones.
ResponderEliminarPrograma en lenguaje máquina entonces si te crees muy listo por programar a bajo nivel
EliminarYo ya voy al 40% en aprender assembler, pero creo que cualquier lenguaje bien manejado es suficiente, manejo el C bastante bien, solo que creo que el assembler te ensena mucho, felicitaciones a todos los que aprenden cualquier lenguaje para programar pics, lo que digo es que es bueno manejar por lo menos dos lenguajes.
EliminarEste comentario ha sido eliminado por un administrador del blog.
ResponderEliminarAgradezco el aporte :D
ResponderEliminar