miércoles, 2 de marzo de 2011

LCD 16x2 - Controlador Hitachi 44780


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 para PIC16F84A


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

5 comentarios:

  1. Programar en PICBasic es de perdedores, programar en C es de ganadores y en ensamblador es de varones.

    ResponderEliminar
    Respuestas
    1. Programa en lenguaje máquina entonces si te crees muy listo por programar a bajo nivel

      Eliminar
    2. Yo 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.

      Eliminar
  2. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
  3. Agradezco el aporte :D

    ResponderEliminar