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);
}
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);
}