Vous êtes sur la page 1sur 8

Practica 1

Programacin Bsica con el LCD

Dispositivos de Control

Integrantes del Equipo:


- ALAM CASTILLO HERRERA
- JOSE CARLOS DIAZ MAY

Fecha de Entrega:14/02/2017
Dispositivos de Control. Gua de Practicas.

Prctica 1 - Programacin Bsica con el LCD


Objetivo.

Usar una pantalla LCD para visualizar informacin y como medio de depuracin de aplicaciones, tanto en C como
en Ensamblador.

Introduccin.

El LCD es una herramienta muy til y econmica, no solo para el despliegue de informacin, sino tambin para el
proceso de depuracin durante el desarrollo, ya que nos permite desplegar resultados parciales o usarlo para
monitorear los procesos y variables dentro de nuestra aplicacin.

Actualmente los displays de LCD ms usados se basan en el protocolo estndar del manejador de LCD Hitachi
HD44780. Este driver puede manejar displays de hasta 8 lneas y 40 caracteres. Este manejador puede ser usado con
dos interfaces diferentes de 4 y 8 bits, siendo la ultima ms rpida a costa de usar ms terminales de E/S. El PSoC
Designer nos proporciona una API estndar para el manejo de LCDs basados en este chip, de 2 lneas y 16 caracteres;
Sin embargo, es posible usarla con otros displays ms grandes, con la nica restriccin de que no podremos usar
directamente las barras graficas. Para Conectar el LCD, el PSoC utiliza 7 bits de un puerto, ya que utiliza la interfaz de 4
bits del controlador para ahorrar pines. El octavo bit del puerto podemos usarlo para controlar el LED del panel trasero de
nuestra pantalla en caso de tenerlo, usando mscaras en el bit 7 del puerto, o usando un mdulo de LED dentro del
PSoC Designer.

Conexiones.

Para nuestra primera prctica conectaremos la pantalla al puerto 2 del PSoC de acuerdo al siguiente diagrama:

El Potencimetro o Preset puede tener cualquier valor en el rango de 10KOhms a 100KOhms. Este valor no es crtico ya
que su nica funcin es establecer el nivel de contraste deseado para la pantalla. La tarjeta de evaluacin cuenta con un
LCD conectado al Puerto 2.

EL PSoC se conecta al programador por medio de 5 terminales: Alimentacin (Vdd), Tierra (GND), Reset (XRES), SCLK
(P1.0) y SDATA (P1.1). De estas 5 terminales el reset es opcional, y se suele utilizar cuando queremos programar un
micro que tiene alimentacin aplicada. El Programador del PSoC puede proporcionarnos alimentacin de 5 volts para
nuestro circuito, sin embargo se debe tener cuidado de que la corriente del circuito no exceda los 120mA, y desconectar
las terminales de programacin SCLK y SDATA durante la operacin del circuito si las usamos dentro de nuestra
aplicacin para alguna funcin, ya que de lo contrario podramos daar el programador.

MC. Edgar Mauricio Romero Lpez


Dispositivos de Control. Gua de Practicas.

Desarrollo.

1.- Explica Que hace este programa.

Este programa imprime en una pantalla LCD dos cadenas de textos, una guardada en la memoria RAM y la otra en la memoria ROM
del microcontrolador.

2.- Que diferencia hay entre las lneas 16 y 18, y como se relacionan estas con las lneas 8 y 9? Funcionaran si se
cambia la forma de declarar las cadenas? Explica tus Respuestas.

Las instrucciones en las lneas 8 y 9 se utilizan para generar cadenas de textos. Las instrucciones en las lneas 16 y 18 se emplean
para imprimir el texto en una pantalla LCD.

La diferencia entre las lneas de impresin de texto (16 y 18), es que la primera se utiliza para imprimir datos provenientes de la
memoria RAM (lnea 9), y la segunda imprime datos que se encuentran guardados en la memoria ROM (lnea 8). Si se llegara a
cambiar el orden marcara un error de compilacin.

3.- En el Caso de que la Pantalla lleve un LED, Que tendra que poner para que se encendiera?

Eso depende la configuracin que se le de al LED:

Si en los parmetros el Drive del LED est en modo High, es necesario escribir LED_On.
Si en los parmetros el Drive del LED est en modo Low, no es necesario escribir algn otro comando.

Cambia el cdigo del Programa al siguiente:

4.- Escribe y Explica la salida del Programa.

El programa visualiza por medio de una LCD valores en hexadecimal de tres tipos diversos de datos: una cadena de byte, una cadena
de byte sin signo y un nmero entero. Tal y como se aprecia en la siguiente tabla:

MC. Edgar Mauricio Romero Lpez


Dispositivos de Control. Gua de Practicas.

Entradas Salidas
-64 FFFFFFC0
65 41
1625 0659

5.- Explica con tus palabras para que sirven las funciones LCD_PRHexByte, LCD_PrHexInt y LCD_WriteData.

LCD_PrHexByte: Imprime bytes (nmeros), en cadenas de texto en cdigo hexadecimal.


LCD_PrHexInt: Imprime nmeros enteros en una pantalla LCD, en cdigo hexadecimal.
LCD_WriteData: Imprime los caracteres guardados en la memoria ROM del LCD, generalmente valores en ASCII.

Hay que tomar en cuenta que LCD_PrHexByte, imprime nicamente dos caracteres, lo cual se puede corroborar observando que el
valor de -64 imprimi nicamente los 2 digitos menos significativos. De la misma forma para la instruccin LCD_PrHexInt, esta
imprime cuatro caracteres, por lo cual en nuestra pantalla se llena el cuarto carcter con un cero.

Escribe este Programa y crrelo en la tarjeta.

6.- Escribe y Explica la salida del Programa, y para que sirven las funciones itoa, ltoa, utoa y ultoa.

Este cdigo nos muestra el procedimiento para convertir cierto de tipo de valores numricos a cadenas de datos,
visualizndolos en LCD.

1.- itoa: convierte valores de tipo entero a string.


char *itoa (char *string, int value, int base);
int value: valor que queremos convertir.
*string: puntero que guarda el dato convertido
base: generalmente es 10.
MC. Edgar Mauricio Romero Lpez
Dispositivos de Control. Gua de Practicas.

2.- ltoa: convierte valores de tipo long a string.


char *ltoa (char *string, long value, int base);
long value: valor que queremos convertir.
*string: puntero que guarda el dato convertido
base: generalmente es 10.
3.- uitoa: convierte valores de tipo entero sin signo a string.
char *uitoa (char *string, uint value, int base);
uint value: valor que queremos convertir.
*string: puntero que guarda el dato convertido
base: generalmente es 10.
4.- ultoa: convierte valores de tipo long sin signo a string.
char *ultoa (char *string, ulong value, int base);
ulong value: valor que queremos convertir.
*string: puntero que guarda el dato convertido
base: generalmente es 10.

7.- Investiga en la documentacion en el archive C Language Compiler User Guide ms acerca de estas funciones,
investiga cual es la funcin que me permite imprimir nmeros con punto decimal, y haz un programa ejemplo que me
imprima una variable flotante llamada MyPI con valor 3.141592. Escribe el cdigo del Programa.

#include <m8c.h> // part specific constants and macros


#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include "stdlib.h"
#include "string.h"
#define _FTOA_TOO_LARGE -2
#define _FTOA_TOO_SMALL -1
char valor[]="MyPI = ";
void main(void)
{
float MyPI;
int estado;
char*nuevo;
MyPI= 3.141592;
LCD_Start();
LED_Start();
nuevo= ftoa(MyPI,&estado);
LCD_Position(0,0);
LCD_PrString(valor);
LCD_WriteData(' ');
LCD_PrString(nuevo);
}

Teclea y compila el siguiente Cdigo:


;-----------------------------------------------------------------------------
; Assembly main line
;-----------------------------------------------------------------------------

include "m8c.inc" ; part specific constants and macros


include "memory.inc" ; Constants & macros for SMM/LMM and Compiler
include "PSoCAPI.inc" ; PSoC API definitions for all User Modules

export _main
area bss(RAM)
VarStr: blk 17 ; Separo 17 bytes para una cadena en RAM (16 Caracteres + Null)
area text(ROM, REL)
_main:
call LCD_Start
call LED_Start
call LED_On
mov [VarStr],'H' ; Inicializo la cadena
mov [VarStr+1],'o'
mov [VarStr+2],'l'
mov [VarStr+3],'a'
mov [VarStr+4],' '
mov [VarStr+5],'M'
mov [VarStr+6],'u'
mov [VarStr+7],'n'

MC. Edgar Mauricio Romero Lpez


Dispositivos de Control. Gua de Practicas.
mov [VarStr+8],'d'
mov [VarStr+9],'o'
mov [VarStr+10], 0x00 ; Null o Fin de Cadena
mov A,00h ; Fila = 0
mov X,00h ; Columna = 0
call LCD_Position
mov A,>VarStr ; Parte alta de la direccin de la Variable en RAM
mov X,<VarStr ; Parte baja de la direccin de la Variable en RAM
call LCD_PrString ; Imprime la cadena en RAM
mov A,01h ; Fila = 1
mov X,00h ; Columna = 0
call LCD_Position
mov A,>TablaRom ; Parte alta de la direccin de la tabla en ROM
mov X,<TablaRom ; Parte baja de la direccin de la tabla en ROM
call LCD_PrCString ; Imprime la cadena constante en ROM
.terminate:
jmp .terminate
.literal
TablaRom:
asciz "Cadena ROM" ; Defino una cadena en ROM con terminacin nula
.endliteral

8.- Que Hace este Cdigo? Cul es la diferencia entre LCD_PrString y LCD_PrCString?

Imprime en la parte superior una cadena de caracteres guardados en la memoria RAM, mientras que en la parte inferior imprime
texto ubicado en la memoria ROM del microcontrolador.

La diferencia entre ambas instrucciones es la misma que en el lenguaje C, la primera se utiliza para datos en la memoria RAM,
mientras que la segundo para los datos en la ROM.

9.- Porque es necesaria la lnea mov A,>VarStr y Como Afecta la funcin LCD_PrString a mi programa, en cuanto
a posibles conflictos que puede generar?

Es el mtodo que utiliza el compilador en lenguaje ensamblador para imprimir cadenas de caracteres, ya que es
necesario dividir la parte alta y parte baja de lo contrario existira un error en lacompilacin.

El registro X y el acumulador pueden ser modificados debido a implementaciones actuales o implementaciones futuras
de la funcin LCD_PrString. Lo mismo pasa para todas las variables o punteros en RAM registrados en el modelo de
memoria larga. Cuando sea necesario, la funcin puede preservar los valores de los registros o variables en RAM a travs
de llamadas a funciones fastcall16.

Ahora crea el cdigo:


export _main
area bss(RAM)
MyVar: blk 1 ; Separo 1 byte para una Variable en ram
area text(ROM, REL)
_main:
call LCD_Start
call LED_Start
call LED_On
mov [MyVar], 52 ; Inicializo la Variable
mov A,00h ; Fila = 0
mov X,00h ; Columna = 0
call LCD_Position
mov A,>TablaRom ; Parte alta de la direccin de la tabla en ROM
mov X,<TablaRom ; Parte baja de la direccin de la tabla en ROM
call LCD_PrCString ; Imprime la cadena constante en ROM
mov A,0 ; Fila = 7
mov X,7 ; Columna = 0
call LCD_Position
mov A, [MyVar] ; Paso la Variable Al Acumulador
call LCD_WriteData
mov A,0 ; Fila = 13
mov X,13 ; Columna = 0
call LCD_Position
mov A, [MyVar] ; Paso la Variable Al Acumulador
call LCD_PrHexByte
.terminate:
jmp .terminate
.literal
TablaRom:
asciz "Ascii: Hex:" ; Defino una cadena en rom con terminacin nula
.endliteral

10.- Es posible imprimir nmeros en formato decimal haciendo uso de LCD_PrHexByte? Explica tu respuesta.

MC. Edgar Mauricio Romero Lpez


Dispositivos de Control. Gua de Practicas.

No, ya que este nicamente imprime los dos nmeros menos significativos en lenguaje hexadecimal.

11.- Que ventajas nos proporciona imprimir usando LCD_WriteData a usar LCD_PrString?

La ventaja del LCD_WriteData es que nos permite imprimir un solo carcter proveniente de Ascii y asi poder ocupar
menos espacio en la memoria.

Ahora vamos a crear un pequeo programa que haga uso de los comandos internos del LCD. Consulta la Hoja de Datos
del LCD para poder seguir el programa.
;-----------------------------------------------------------------------------
; Assembly main line
;-----------------------------------------------------------------------------

include "m8c.inc" ; part specific constants and macros


include "memory.inc" ; Constants & macros for SMM/LMM and Compiler
include "PSoCAPI.inc" ; PSoC API definitions for all User Modules

BorrarLCD: equ 0b00000001


GoHome: equ 0b00000010
SetDDRAM_Addr: equ 0b10000000 ; Seleccionar direccin de la memoria de despliegue del LCD
export _main
area bss(RAM)
MyVar: blk 1 ; Separo 1 byte para una Variable en ram
area text(ROM, REL)
_main:
call LCD_Start
call LED_Start
call LED_On
mov A, BorrarLCD
call LCD_Control ; Borra el LCD
mov A, SetDDRAM_Addr
call LCD_Control ; Me pongo en la primera Posicin del LCD (Direccion 0x00)
mov A,>TablaRom1 ; Parte alta de la direccin de la tabla en ROM
mov X,<TablaRom1 ; Parte baja de la direccin de la tabla en ROM
call LCD_PrCString ; Imprime la cadena constante en ROM
mov A, SetDDRAM_Addr | 0x40
call LCD_Control ; Me pongo en la primera Posicin de la segunda linea del LCD (Direccion 0x40)
mov A,>TablaRom2 ; Parte alta de la direccin de la tabla en ROM
mov X,<TablaRom2 ; Parte baja de la direccin de la tabla en ROM
call LCD_PrCString ; Imprime la cadena constante en ROM
mov A, 0b00001111
call LCD_Control
mov [MyVar],100
Ciclo:
mov A,200
call LCD_Delay50uTimes
dec [MyVar]
jnz Ciclo
mov A, GoHome
call LCD_Control ; Mueve el Cursor a Home
.terminate:
jmp .terminate
.literal
TablaRom1:
asciz "Linea1" ; Defino una cadena en rom con terminacin nula
TablaRom2:
asciz "Linea2" ; Defino una cadena en rom con terminacin nula

.endliteral

12.- A que cdigo en nuestros programas anteriores sustituyen las lneas: mov A, SetDDRAM_Addr | 0x40 y call ?
LCD_Control

Sustituye a:
Mov A,xxh
Mov X,yyh
Call LCD_Position

13.- A que estructura de alto nivel equivale el siguiente cdigo, y para que se utiliza en el programa?
mov [MyVar],100
Ciclo:
mov A,200
call LCD_Delay50uTimes
dec [MyVar]
jnz Ciclo

es equivalente a un ciclo do-while.

MC. Edgar Mauricio Romero Lpez


Dispositivos de Control. Gua de Practicas.

14.- funcin realizan las instrucciones: mov A, 0b00001111 y call LCD_Control ?

Se encarga de posicionar el cursor, encender el parpadeo y encender la LCD. (DISPLAY ON/OFF Control).

15.- Que desventajas y ventajas encuentras en el uso de ensamblador para el Manejo del LCD, con respecto a C?

En C es mucho mas fcil y rpido realizar la programacin de la LCD, ya que no es necesario escribir tantos cdigos. Aun
as en ensamblador se puede configurar ciertas cosas que estn predefinidas en C ,adems de ocupar menos espacio de
memoria.

16.- Crea un Nuevo Proyecto en Ensamblador, y llmalo Practica1c. Haz un programa que genere y despliegue 8
caracteres propios en el LCD (como por ejemplo: , , , , , , , etc.) Cada uno debe de ir apareciendo uno a uno
con intervalos de un segundo entre cada despliegue. Para generar este tiempo de espera entre el despliegue de cada
smbolo, crea una subrutina llamada Pausa1s haciendo uso de la funcin LCD_Delay50uTimes del LCD. De Tal manera
que cada vez que desees hacer una espera de 1 seg uses la instruccin call Pausa1s.

17.- Haz un Programa en C que despliegue el dibujo que se muestra en las figuras, y lo vaya desplazando de izquierda a
derecha, y de derecha a izquierda, continuamente, un pixel a la vez.

Conclusiones:

La implementacion de esta practica, nos sirvio para conocer el entorno de PsoC y la implementacion de los
lenguages de programacion c y esamblador, al igual de los comandos internos para controlar una pantallla LCD 16x2 , al
momento de realizar la practica tuvimos dificiltuad en la realizacion de la practica 1a, al momento de mostrar al carcter
del invader se desplazaba de casilla a casilla y en realidad era poner el desplazamiento y borrar la memoria antes de
mostrar el siguiente avance.

MC. Edgar Mauricio Romero Lpez