Programming a LCD display with a Celoxica RC100

Guest
Hello, I´m a Spanish student and i need to program a Hitachi LCD using
a Celoxica RC100 Spartan II and I can't do that the code show nothing
in the display. If somebody know how program it please tell me. I put
my code to all can see what i'm doing.

Thanks.

*******************************************************************************
*******************************************************************************
/*inculde standard header file*/
#include <stdlib.hch>


#ifdef DEBUG

/*set up a dummy clock*/
set clock = external "P1";

#else

#define RC100_BOARD
#define RC100_CLOCK_DIVIDE 4
#include <rc100.hch>

#endif
/***********************************************************************************************/



/* Definimos una serie de seńales necesarias para el manejo */
unsigned int 8 Datos; // 8 lineas de datos
unsigned int 1 EN; // Linea de Enable
unsigned int 1 RS; // Linea de Selector de Registros
unsigned int 1 RW; // Linea de Lectura/Escritura
unsigned int 8 AAC; // Acumulador, solo usamos el bit 7 del mismo
unsigned int 8 A; // Donde guardamos lo que vamos a mostrar por el LCD
unsigned int 8 posicion; // Variables que usamos cuando queremos mover
el cursor
unsigned int 1 salir;
unsigned int 1 condicion; // Condicion para leer/escribir en el bus de
datos
unsigned int 8 x; // Variable que usamos en las operaciones de
leer/escribir del bus de datos
unsigned int 1 Z; // Variable que usamos para salir del buscle de
Wait_LCD()

// Variables a usar en los delays
unsigned int 8 TIEMPO1;
unsigned int 8 TIEMPO2;


unsigned int 1 LUZ; // luz del display

/***********************************************************************************************/
/******************ASIGNACION DE PINES A LAS DIFERENTES SEŃALES
USADAS**************************/


#ifndef DEBUG

/* Asignamos los pines a las seńales declaradas con anterioridad */
// Datos ==> 8 pines ; Es de entrada/salida por lo que hay que
declararse 2 buses
/* Bus bidireccional de entrada y salida, cuando enable es 1 escribe
"write" en los pines
indicados, write contendra el valor a enviar a los pines,
cuando quiera leer los hara
de BiBus.read y leera los datos de los pines*/


interface bus_ts(unsigned int 8 read) BiBus(unsigned int write = x,
unsigned 1 enable = condicion)
with {data =
{"W18","AA20","Y18","V17","AA19","AB20","W17","V13"}};


/* En las seńales de control siempre se escribe por lo que los buses
de las mismas basta
con que sean de salida */
// EN ==> 1 pin ;
interface bus_out() bus_en(unsigned int 1 en_out = EN) with {data =
{"Y13"}};
// RS ==> 1 pin ;
interface bus_out() bus_rs(unsigned int 1 rs_out = RS) with {data =
{"AA13"}};
// RW ==> 1 pin ;
interface bus_out() bus_rw(unsigned int 1 rw_out = RW) with {data =
{"AB13"}};
// Luz ==> 1 pin
interface bus_out() bus_lz(unsigned int 1 lz_out = LUZ) with {data =
{"W13"}};

#endif

/***********************************************************************************************/

/* Definimos las operaciones del LCD */
// Macros para la temporizacion de los delays

static macro proc espera2 (time)
{
unsigned 64 i;

for (i=0; i<(time/1000000)*80000000;i++)
delay;

}


static macro proc espera (time)
{
unsigned 64 i;

for (i=0; i<(time/1000)*80000000;i++)
delay;
}



macro proc Init_LCD ()
{
// Modo 8 bits
#ifndef DEBUG
RW = 1;
EN = 1;

RS = 0;

condicion = 0;

x = 0x38;

condicion = 1; // Escribimos en el bus de datos en valor de x

EN = 0;


espera2(100);

EN = 1;

RS = 0;

condicion = 0;

x = 0x0e;

condicion = 1; // Escribimos en el bus de datos el valor de x

EN = 0;


espera2(100);


EN = 1;

RS = 0;

condicion = 0;

x = 0x06;

condicion = 1; // Escribimos en el bus de datos el valor de x

EN = 0;


espera2(100);
#else
EN = 1;
RS = 0;
Datos = 0x38; // Movemos 0x38 a Datos
EN = 0;
espera2(100); // Rutina que espera 40microseg
EN = 1;
RS = 0;
Datos = 0x0e;
EN = 0;
espera2(100); // Rutina que espera 40microseg
EN = 1;
RS = 0;
Datos = 0x06;
EN = 0;
espera2(100); // Rutina que espera 40microseg
#endif
}

macro proc Clear_LCD ()
{
// Modo 8 bits
#ifndef DEBUG
RW = 1;
EN = 1;

RS = 0;

condicion = 0;

x = 0x01;

condicion = 1; // Escribimos en el bus de datos el valor de x

EN = 0;


espera(10);
#else
EN = 1;
RS = 0;
Datos = 0x01;
EN = 0;
espera(8); // Rutina que espera 1,64mseg
#endif
}

macro proc Write_Text (car)
{
// Modo 8 bits
#ifndef DEBUG
EN = 1;

RS = 1;

RW = 0;

condicion = 0;

x = car;

condicion = 1; // Escribimos en el bus de datos el valor de x

EN = 0;


espera(10);
#else
EN = 1;
RS = 1;
RW = 0;
Datos = car;
EN = 0;
espera2(8); // Rutina que espera 1,64mseg
#endif
}

macro proc Cursor_Pos (linea, pos)
// Operacion adicional para poder situar el cursor en la posicion que
queramos
/* Sinceramente no se si esto funcionara bien */
{
#ifndef DEBUG
EN = 1;

RS = 0;

if (linea == 1)
{posicion = pos;} // 0@pos
else if (linea == 2)
{posicion = 0x04 @ (pos<-4);} // Nos quedamos con, los ultimos 4
bits, pues los
// 4 primeros no los necesitamos y concatenamos con
// un 4; No estoy seguro de que esto sea asi!!!!????
else
delay; // Otro valor distinto de 1 ó 2 no es válido, por lo que no
hace nada
condicion = 0;

x = 0x80 + posicion;
condicion = 1; // Escribimos en el bus de datos el valor de x

EN = 0;

// Wait_LCD();
espera(8); // Rutina que espera 1,64mseg
#else
// Linea solo puede valer 1 ó 2 y posicion de 0 a 15
EN = 1;
RS = 0;
if (linea == 1)
{posicion = pos;} // 0@pos
else if (linea == 2)
{posicion = 0x04 @ (pos<-4);} // Nos quedamos con, los ultimos 4
bits, pues los
// 4 primeros no los necesitamos y concatenamos con
// un 4; No estoy seguro de que esto sea asi!!!!????
else
delay; // Otro valor distinto de 1 ó 2 no es válido, por lo que no
hace nada
Datos = 0x80 + posicion; // 80h, instruccion de "Set Cursor
Position", + posicion
// en la linea, esta va de 0 a 15
EN = 0;
// Wait_LCD();
espera(8); // Rutina que espera 1,64mseg
#endif
}

void main(void)
{

#ifndef DEBUG
LUZ = 1;
#endif

/*Sacamos el init y el clear fuera del bucle*/
Init_LCD();
Clear_LCD();

// Programa de ejemplo que escribe en el LCD "Hello_World"

A = 0b01001000; // Valor de la "H" en binario; Para pasarlo como
letras tengo que definir
// el tipo como char, pues como integer, aun poniendo la
almoadilla, falla
Write_Text(A);
}
 
etvive@wanadoo.es wrote:
Hello, I´m a Spanish student and i need to program a Hitachi LCD using
a Celoxica RC100 Spartan II and I can't do that the code show nothing
in the display. If somebody know how program it please tell me. I put
my code to all can see what i'm doing.

Thanks.

*******************************************************************************
*******************************************************************************
/*inculde standard header file*/
#include <stdlib.hch


#ifdef DEBUG

/*set up a dummy clock*/
set clock = external "P1";

#else

#define RC100_BOARD
#define RC100_CLOCK_DIVIDE 4
#include <rc100.hch>

#endif
/***********************************************************************************************/



/* Definimos una serie de seńales necesarias para el manejo */
unsigned int 8 Datos; // 8 lineas de datos
unsigned int 1 EN; // Linea de Enable
unsigned int 1 RS; // Linea de Selector de Registros
unsigned int 1 RW; // Linea de Lectura/Escritura
unsigned int 8 AAC; // Acumulador, solo usamos el bit 7 del mismo
unsigned int 8 A; // Donde guardamos lo que vamos a mostrar por el LCD
unsigned int 8 posicion; // Variables que usamos cuando queremos mover
el cursor
unsigned int 1 salir;
unsigned int 1 condicion; // Condicion para leer/escribir en el bus de
datos
unsigned int 8 x; // Variable que usamos en las operaciones de
leer/escribir del bus de datos
unsigned int 1 Z; // Variable que usamos para salir del buscle de
Wait_LCD()

// Variables a usar en los delays
unsigned int 8 TIEMPO1;
unsigned int 8 TIEMPO2;


unsigned int 1 LUZ; // luz del display

/***********************************************************************************************/
/******************ASIGNACION DE PINES A LAS DIFERENTES SEŃALES
USADAS**************************/


#ifndef DEBUG

/* Asignamos los pines a las seńales declaradas con anterioridad */
// Datos ==> 8 pines ; Es de entrada/salida por lo que hay que
declararse 2 buses
/* Bus bidireccional de entrada y salida, cuando enable es 1 escribe
"write" en los pines
indicados, write contendra el valor a enviar a los pines,
cuando quiera leer los hara
de BiBus.read y leera los datos de los pines*/


interface bus_ts(unsigned int 8 read) BiBus(unsigned int write = x,
unsigned 1 enable = condicion)
with {data =
{"W18","AA20","Y18","V17","AA19","AB20","W17","V13"}};


/* En las seńales de control siempre se escribe por lo que los buses
de las mismas basta
con que sean de salida */
// EN ==> 1 pin ;
interface bus_out() bus_en(unsigned int 1 en_out = EN) with {data =
{"Y13"}};
// RS ==> 1 pin ;
interface bus_out() bus_rs(unsigned int 1 rs_out = RS) with {data =
{"AA13"}};
// RW ==> 1 pin ;
interface bus_out() bus_rw(unsigned int 1 rw_out = RW) with {data =
{"AB13"}};
// Luz ==> 1 pin
interface bus_out() bus_lz(unsigned int 1 lz_out = LUZ) with {data =
{"W13"}};

#endif

/***********************************************************************************************/

/* Definimos las operaciones del LCD */
// Macros para la temporizacion de los delays

static macro proc espera2 (time)
{
unsigned 64 i;

for (i=0; i<(time/1000000)*80000000;i++)
delay;

}


static macro proc espera (time)
{
unsigned 64 i;

for (i=0; i<(time/1000)*80000000;i++)
delay;
}



macro proc Init_LCD ()
{
// Modo 8 bits
#ifndef DEBUG
RW = 1;
EN = 1;

RS = 0;

condicion = 0;

x = 0x38;

condicion = 1; // Escribimos en el bus de datos en valor de x

EN = 0;


espera2(100);

EN = 1;

RS = 0;

condicion = 0;

x = 0x0e;

condicion = 1; // Escribimos en el bus de datos el valor de x

EN = 0;


espera2(100);


EN = 1;

RS = 0;

condicion = 0;

x = 0x06;

condicion = 1; // Escribimos en el bus de datos el valor de x

EN = 0;


espera2(100);
#else
EN = 1;
RS = 0;
Datos = 0x38; // Movemos 0x38 a Datos
EN = 0;
espera2(100); // Rutina que espera 40microseg
EN = 1;
RS = 0;
Datos = 0x0e;
EN = 0;
espera2(100); // Rutina que espera 40microseg
EN = 1;
RS = 0;
Datos = 0x06;
EN = 0;
espera2(100); // Rutina que espera 40microseg
#endif
}

macro proc Clear_LCD ()
{
// Modo 8 bits
#ifndef DEBUG
RW = 1;
EN = 1;

RS = 0;

condicion = 0;

x = 0x01;

condicion = 1; // Escribimos en el bus de datos el valor de x

EN = 0;


espera(10);
#else
EN = 1;
RS = 0;
Datos = 0x01;
EN = 0;
espera(8); // Rutina que espera 1,64mseg
#endif
}

macro proc Write_Text (car)
{
// Modo 8 bits
#ifndef DEBUG
EN = 1;

RS = 1;

RW = 0;

condicion = 0;

x = car;

condicion = 1; // Escribimos en el bus de datos el valor de x

EN = 0;


espera(10);
#else
EN = 1;
RS = 1;
RW = 0;
Datos = car;
EN = 0;
espera2(8); // Rutina que espera 1,64mseg
#endif
}

macro proc Cursor_Pos (linea, pos)
// Operacion adicional para poder situar el cursor en la posicion que
queramos
/* Sinceramente no se si esto funcionara bien */
{
#ifndef DEBUG
EN = 1;

RS = 0;

if (linea == 1)
{posicion = pos;} // 0@pos
else if (linea == 2)
{posicion = 0x04 @ (pos<-4);} // Nos quedamos con, los ultimos 4
bits, pues los
// 4 primeros no los necesitamos y concatenamos con
// un 4; No estoy seguro de que esto sea asi!!!!????
else
delay; // Otro valor distinto de 1 ó 2 no es válido, por lo que no
hace nada
condicion = 0;

x = 0x80 + posicion;
condicion = 1; // Escribimos en el bus de datos el valor de x

EN = 0;

// Wait_LCD();
espera(8); // Rutina que espera 1,64mseg
#else
// Linea solo puede valer 1 ó 2 y posicion de 0 a 15
EN = 1;
RS = 0;
if (linea == 1)
{posicion = pos;} // 0@pos
else if (linea == 2)
{posicion = 0x04 @ (pos<-4);} // Nos quedamos con, los ultimos 4
bits, pues los
// 4 primeros no los necesitamos y concatenamos con
// un 4; No estoy seguro de que esto sea asi!!!!????
else
delay; // Otro valor distinto de 1 ó 2 no es válido, por lo que no
hace nada
Datos = 0x80 + posicion; // 80h, instruccion de "Set Cursor
Position", + posicion
// en la linea, esta va de 0 a 15
EN = 0;
// Wait_LCD();
espera(8); // Rutina que espera 1,64mseg
#endif
}

void main(void)
{

#ifndef DEBUG
LUZ = 1;
#endif

/*Sacamos el init y el clear fuera del bucle*/
Init_LCD();
Clear_LCD();

// Programa de ejemplo que escribe en el LCD "Hello_World"

A = 0b01001000; // Valor de la "H" en binario; Para pasarlo como
letras tengo que definir
// el tipo como char, pues como integer, aun poniendo la
almoadilla, falla
Write_Text(A);
}
Hi

in Init_LCD after #else, don't you need some RW control ??

The Lcd display I have used has a init flow like this

enable
write 0x30 // don't check busy flag
delay
write 0x30 // don't check busy flag
delay
write 0x30 // don't check busy flag
write 0x38 // check busy flag

--
Thomas
registered user number 350300 http://counter.li.org/
 

Welcome to EDABoard.com

Sponsor

Back
Top