Amigos del foro:
Había estado buscando por todas partes la manera de desplegar un texto en un LCD 16x2 de manera que las letras fueran desplazandose y darle movimiento al texto. Luego de interminables horas de busqueda y de leer y releer el manual de PIC Basic Pro. me di cuenta de que un pequeño "error" en el codigo puede servir para dicho proposito.
Con el siguiente codigo, se pueden desplazar textos de hasta 23 caracteres, con espacios incluidos, en el LCD.
La forma de hacerlo es muy sencilla; los tres ciclos FOR son los que se encargan de hacer el truco.
Como se pueden dar cuenta, en el primer ciclo FOR comienzo desplegando los primeros 16 caracteres de nuestro mensaje. Con el segundo ciclo FOR, despliego 14 caracteres mas, pero le digo ala PIC que lo haga por la tercera linea. Como es un Display de dos lineas, teoricamente no desplegaria nada, pero el display comienza a recorrer los caracteres inmediatamente despues del primer ciclo FOR.
Con el tercer ciclo FOR, depliego los ultimos caracteres que restan por ser desplegados hasta dejar limpio el display. Y de ahi vuelve a comenzar.
Para hacer mas "limpio" mi codigo y para evitar gastar mucha memoria, asigno un caracter a un elemento de un arreglo en cada ciclo FOR, de esa manera puedo desplegar diferentes mensajes sin gastar demasiada memoria en la PIC. Este programa que les estoy mostrando pesa tan solo 1066 bytes.
Al usar la instruccion LCDOUT de esta forma:
LCDOUT $FE,1
LCDOUT $FE,$83,STR TextoFijo\10
LCDOUT $FE,$C0 + I, str ArryDsply\23
Ahorras localidades de memoria y haces el programas mas compacto y funcional, ya que puedes hacerlo mas complejo y vistoso al poder desplegar mas de un texto a la vez.
Como siempre, les digo que el entorno que utilizo es el MicroCode Studio 3.0.0.5 y el compilador es el PIC Basic Pro 2.50A
El programa esta ampliamente comentado. Si alguien quiere utilizarlo puede hacerlo, aunque no me responsabilizo del mal uso del codigo o de algun bug que pudiera ocurrir al ser programado en otro entorno diferente. En las declaraciones del programas vienen los pines que utilizo para conectar el LCD.
¡Saludos y feclices pruebas!.
'**************************************************************************
'* Name : Prueba_Marquesina.pbp *
'* Author : John Macklo *
'* Notice : Copyright (c) 2010 *
'* : All Rights Reserved *
'* : John Macklo *
'* Date : 16/Diciembre/2010 *
'* Version : 1.0 *
'* Notes : Desarrollado para PIC18F452 @ 20Mhz *
'* : Prueba de letreros cambiantes en LCD 16x2 *
'**************************************************************************
;----[Configuración de los archivos incluidos en el programa]--------------
;----[Configuración del puerto serial (USART) de la PIC]-------------------
DEFINE OSC 20 ' Resonador de 20MHz.
DEFINE HSER_RCSTA 90h ' Puerto serial activado, recepción continua.
DEFINE HSER_TXSTA 24h ' TX habilitada, Asincrono, High Speed baudrate.
DEFINE HSER_BAUD 9600 ' Fijación de Baudrate.
DEFINE HSER_SPBRG 81h ' 19h = OSC 4MHz; 40h = OSC 10MHz; 81h = OSC 20MHz
DEFINE HSER_CLROERR ' Limpiar bandera de sobreflujo de entrada.
DEFINE USE_LOWPRIORITY 1
;----[Configuración de los canales analógicos de la PIC]-------------------
DEFINE ADC_BITS 10 ' Voltaje analógico con resolución de 10 bits.
DEFINE ADC_CLOCK 3 ' Tipo de oscilador (3 = Resonador)
DEFINE ADC_SAMPLEUS 100 ' Tiempo de muestreo del ADC en microsegundos.
;----[Configuración del display de LCD en la PIC]--------------------------
DEFINE LCD_LINES 2 ' Define 2 lineas en el LCD.
DEFINE LCD_BITS 4 ' Define 4 lineas de datos hacia el LCD.
DEFINE LCD_DREG PORTB ' Define el puerto de comunicación con el LCD.
DEFINE LCD_DBIT 4 ' Define 4 bits de datos hacia el LCD.
DEFINE LCD_EREG PORTB ' Define el puerto de habilitación del LCD.
DEFINE LCD_EBIT 3 ' Define el bit de habilitación del LCD.
DEFINE LCD_RSREG PORTB ' Define el puerto de selección del LCD.
DEFINE LCD_RSBIT 2 ' Define el bit de selección del LCD.
DEFINE LCD_COMMANDUS 2000 ' Define el tiempo de retardo de comando en us.
DEFINE LCD_DATAUS 50 ' Define el tiempo de retardo de datos en us.
;----[Configuración de registros de entradas y salidas de la PIC]----------
ADCON1 = $82 ' 5 Canales analógicos en A y 3 digitales en E.
TRISA = $EF ' Todos los bits del puerto A, excepto PORTA.4, son entradas.
TRISB = $00 ' Todos los bits del puerto B son salidas.
TRISC = $87 ' PORTC(.6, .5, .4 y .3) son salidas. Los demás son entradas.
TRISD = $00 ' Todos los bits del puerto D son salidas.
TRISE = $07 ' Todos los bits del puerto E son entradas.
;----[Bits usados para la asignación del nodo]-----------------------------
;----[Entradas Digitales]--------------------------------------------------
;----[Salidas Digitales]---------------------------------------------------
symbol Testigo = PORTA.4 ' LED para debugueo de programas.
symbol DisplaySelect0 = PORTB.0' Salida digital 0 del registro "PuertoDOs".
symbol DisplaySelect1 = PORTB.1' Salida digital 1 del registro "PuertoDOs".
;----[Salidas Analógicas]--------------------------------------------------
;----[Configuración de constantes del programa]----------------------------
Lapso con 200 ' Pausa entre caracteres.
;----[Configuración de variables del programa]-----------------------------
ArryDsply var byte[23]
TextoFijo var byte[16]
H1 var byte
DS var byte
I var byte
;----[Inicio de programa principal]----------------------------------------
Principal:
;----[Inicializacion del display]------------------------------------------
LCDOUT $FE,1
for H1 = 0 to 40 ' Limpia todos los buffers de datos.
LCDOUT $FE,$81,"INICIANDO NODO"
TOGGLE Testigo ' Enciende y apaga led que indica PIC encendida.
PAUSE Lapso ' Hace una pausa de 150 ms.
select case H1
case is < 16
LCDOUT $FE,$C0 + H1,"."
case is < 32
LCDOUT $FE,$C0 + (H1 - 16),","
case else
LCDOUT $FE,$C0 + (H1 - 32),"-"
end select
NEXT H1
for I = 0 to 999
PAUSE 1
next I
;----[Lazo principal]------------------------------------------------------
Lazo:
FOR h1 = 0 TO 1
gosub TablasDisplay ' Llama a subrutina "TablasDisplay".
LCDOUT $FE,1
FOR I = 16 to 0 step -1
LCDOUT $FE,$83,STR TextoFijo\10
LCDOUT $FE,$C0 + I, str ArryDsply\23
toggle Testigo
pause Lapso
next I
FOR I = 15 to 0 step -1
LCDOUT $FE,1
LCDOUT $FE,$83,STR TextoFijo\10
LCDOUT $FE,$98 + I, str ArryDsply\23
toggle Testigo
pause Lapso
next I
FOR I = 14 to 8 step -1
LCDOUT $FE,1
LCDOUT $FE,$83,STR TextoFijo\10
LCDOUT $FE,$89 + I, str ArryDsply\23
toggle Testigo
pause Lapso
next I
pause Lapso
NEXT h1
pause Lapso
goto Lazo
end
;----[Subrutinas]----------------------------------------------------------
'**************************************************************************
' Subrutina: TablasDisplay
' Precondición: Ninguna.
' Entradas: H1 - Selecciona la tabla a ser cargada.
' Salidas: ArryDsply - En este arreglo se guardan los datos a
' ser desplegados en el display.
' Efectos secundarios: Ninguno.
' Comentarios: El texto NO debe ser mayor a 23 caracteres.
' incluidos los espacios entre palabras. De requerir
' un texto mayor, se vuelve a llamar la subrutina con
' nuevos valores declarados en el texto.
' Nota: Se pueden desplegar mensajes mas grandes. Tan solo
' hay que modificar las tablas.
'**************************************************************************
TablasDisplay:
TextoFijo[0] = "M"
TextoFijo[1] = "A"
TextoFijo[2] = "R"
TextoFijo[3] = "Q"
TextoFijo[4] = "U"
TextoFijo[5] = "E"
TextoFijo[6] = "S"
TextoFijo[7] = "I"
TextoFijo[8] = "N"
TextoFijo[9] = "A"
select case H1
case 0
ArryDsply[0] = "*"
ArryDsply[1] = "-"
ArryDsply[2] = "+"
ArryDsply[3] = " "
ArryDsply[4] = "L"
ArryDsply[5] = "E"
ArryDsply[6] = "T"
ArryDsply[7] = "R"
ArryDsply[8] = "E"
ArryDsply[9] = "R"
ArryDsply[10] = "O"
ArryDsply[11] = " "
ArryDsply[12] = "V"
ArryDsply[13] = "I"
ArryDsply[14] = "A"
ArryDsply[15] = "J"
ArryDsply[16] = "E"
ArryDsply[17] = "R"
ArryDsply[18] = "O"
ArryDsply[19] = " "
ArryDsply[20] = "+"
ArryDsply[21] = "-"
ArryDsply[22] = "*"
case 1
ArryDsply[0] = "*"
ArryDsply[1] = " "
ArryDsply[2] = "P"
ArryDsply[3] = "O"
ArryDsply[4] = "R"
ArryDsply[5] = ":"
ArryDsply[6] = " "
ArryDsply[7] = "M"
ArryDsply[8] = "A"
ArryDsply[9] = "C"
ArryDsply[10] = "K"
ArryDsply[11] = "L"
ArryDsply[12] = "O"
ArryDsply[13] = " "
ArryDsply[14] = "C"
ArryDsply[15] = "O"
ArryDsply[16] = "A"
ArryDsply[17] = "T"
ArryDsply[18] = "Z"
ArryDsply[19] = "I"
ArryDsply[20] = "N"
ArryDsply[21] = " "
ArryDsply[22] = "*"
end select
return