TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: crochete en 16 de Agosto de 2004, 05:01:00
-
Hola amigo Modulay:
Soy el que pregunto sobre el desplazamiento de caracteres en un display HD44780.
Te voy a pegar aqui la rutina que actualmente utilizo para el LCD:
*********************************************
fnMsDelay - introduce un retardo de iDelay milisegundos
parametro entrada: numero de milisegundos de retardo
return value: ninguno
*********************************************/
void fnMsDelay ( int iDelay )
{ unsigned long ul0;
ul0 = MS_TIMER; // valor del timer actual
while ( MS_TIMER < ul0 + (unsigned long) iDelay );
}
/********************************************************
fnUsDelay - introduce un retardo de iDelay microsegundos
**********************************************************/
void fnUsDelay ( int iDelay )
{ int i;
iDelay /= 11;
for ( i=0; i<iDelay; i++ );
}
/********************************************************************/
/**************************** FUNCIONES MODO 4 BITS ***********************/
/********************************************************************/
#define DATA 0x40
#define COMMAND 0x00
#define TRUE 1
#define FALSE 0
int iDataFlag;
/*********************************************************************
fn4OneNib - Envia un nibble al display
********************************************************************/
void fn4OneNib ( char cNib )
{ cNib &= 0x0F;
cNib |= iDataFlag;
WrPortI ( PADR, NULL, cNib|0x80 );
WrPortI ( PADR, NULL, cNib );
}
/*********************************************************************
fn4Byte - Envia dos nibbles al LCD,el MSB primero
********************************************************************/
void fn4Byte ( char cNib )
{ int i;
i = cNib;
cNib >>= 4;
fn4OneNib ( cNib );
fn4OneNib ( i );
fnUsDelay (100);
}
/*********************************************************************
fn4LCD_Init - INICIALIZACION DEL LCD CON LOS PARAMETROS SIGUIENTES:
Modo 4 bits, 2 lineas,tamaño de los caracteres 5x10
Display y cursor:turn on y non-blinking
incrementamos address y shift cursor con cada caracter
****************************************************************************/
void fn4LCD_Init ()
{ WrPortI ( PADR, NULL, 0 );
WrPortI ( SPCR, NULL, 0x84 ); // Configuramos el puerto A como salida
iDataFlag = COMMAND; // nos situamos en modo de enviar comandos
fnMsDelay ( 1000 );
fn4OneNib ( 2 );
fnUsDelay (100);
fn4Byte ( "B00101100" );
fn4Byte ( "B00001110" );
fn4Byte ( "B00000110" );
}
/*********************************************************************
fn4Display - muestra una linea de texto en el display
***************************************************************************/
void fn4Display ( char *szp )
{ iDataFlag = DATA;
while ( *szp ) fn4Byte ( *szp++ );
}
void fn4Clear ( void )
{ iDataFlag = COMMAND;
fn4Byte ( 0x01 ); // Borramos el display
fnMsDelay (3);
}
void fn4Line2 ( void )
{ iDataFlag = COMMAND;
fn4Byte ( 0xC0 ); //Valor de RAM para la segunda linea
fnMsDelay (3);
}
void main ()
{
fn4LCD_Init ();
while (1)
{
fn4Clear();
fn4Display ( "0123456789" );
fnMsDelay (500);
fn4Clear();
fn4Display ( "Esto es una prueba de display LCD HD44780" );
fnMsDelay (500);
}
}
EL problema es que con la pequeña rutina que me mostraste ,lo unico que consigo es meter un espacio mas entre caracteres,y quiero que funcione rotando toda la linea de texto en la primera linea del display(2x20),es decir, que empieza escribiendo "Esto..." y al llegar al final de la primera linea ,que virtualmente la linea de texto se vaya desplazando para mostrar toda la frase y cuando termine la frase vuelva a empezar desde el rpincipio y todo esto solo en la primera fila del display.
Actualmente solo consigo que la frase llegue hasta "Esto es un prueba d",con lo que al llegar a los 20 caracteres no puedo leer el resto de la frase.
Perdon por las molestias y gracias por adelnatado.
Un Saludo!!!
-
Esa rutina está escrita para funcionar con el compilador PCW.
Por lo que veo,parece que usas otro compilador.Tendré que mirarlo con un poco de detenimiento.
No veo la rutina de desplazamiento ni tampoco desde donde ni de que manera la llamas.
Pastea el código entero,a lo mejor no la estás usando bien.
Un saludo
-
Estás en lo cierto ,como compilador utilizo el dynamic C 7.21 SE,ya que estoy programando un controlador sobre un JackRabbit 1800,y bueno,en lineas generales,la mision del controlador es monitorizar el estado de 3 lineas digitales y una analógica,para reportar posibles alarmas basadas en envio de mensajes desde el controlador hacia un terminal de Inmarsat D+,enviando posteriorimente esos mensajes via satélite hacia un centro de control,es decir una pequeña aplicacion SCADA.
Tambien se me había ocurrido que aprovechando que se pueden enviar mensajes cortos de texto(hasta unos 192 caracteres ASCII),hacia esos terminales,una vez recibido el mensaje, el controlador extrae el mensaje del terminal,lo almacena en una cola de mensajes y los va mostrando por el display LCD,y ahi es donde me quedo atascado,todo lo demás está implementado y este codigo que he pegado mas arriba era simplemente para probar las funciones,o sea que todo lo referente al display se encuentra ahí,y cierto que la rutina de desplazamiento no está,simplemente en la inicialización,enviando el comando "B00000110" lo que hago es cada vez que escribo un caracter ,incremento el desplazamiento del cursor hacia la derecha,pero una vez llego al final de la primera fila de la pantalla ya no se continuar.
Bueno,me he enrollado batante,mis disculpas,pero es que queria explicarte el contexto en el que va incluido el tema.
Gracias por tu rapida respuesta.
Un Saludo!!
-
Pues está muy interesante tu proyecto.
Un apunte sobre la rutina:
El desplazamiento que efectúa es del display completo,es decir desplaza el display real sobre el virtual.En los lcd de 2x16,como el que yo tengo,el display virtual se compone de 2 líneas de 40 caracteres cada una,de las cuales 16 son las que vemos.
Si escribimos en el display 2x16 "HD 16 caracteres" y llamamos a la rutina para que desplaze 3 caracteres a la izquierda,nos quedaría " HD 16 caracte".
Cuando dices cursor,si te refieres al puntero de escritura,lo que estás haciendo es escribir una carácter seguido de un espacio en blanco ¿no?
Resumiendo,para desplazarte sobre el display,primero escribe todo lo que tengas que escribir y después le mandas al lcd el dato para desplazarlo:
0b00011000 // para desplazarlo a la derecha
0b00011100 // para desplazarlo a la izquierda
Espero que te sirva.
Un saludo
-
Muchas gracias por tu ayuda Modulay.
Voy a hacer una pruebas y en cuanto saque algo en claro,te lo digo.
muchas gracias crack!!
Un saludo!!!
-
Modulay,tenias razon:
Resulta que escribiendo una linea de texto en la primera fila,y dandole a desplazar el display a la derecha con los comandos que tu me has puesto,se ve como el display se desplaza el numero de posiciones indicado por una variable que indica cuantos caracteres tiene el string que hay en el display,y se desplaza hasta el ultimo caracter.
Ahora vienen las "pegas":
1-Resulta que el display virtual,solo tiene 40 caracteres asi que para un string mas largo,pasamos a la segunda fila,con el inconveniente de que si rotamos el display,se rotan las dos filas,no?
2-La rutina la he ejecutado en modo paso a paso,y se veia el desplazamiento con toda claridad,pero al ejecutar en tiempo real con el micro de la placa(unos 36 MHz),el desplazamiento no se aprecia,simplemente nos encontramos con la pantalla al final del string.Asi que tendre que ingeniarmelas para introducir un retardo,que suspenda la ejecucion de dicha tarea y pase a atender otras(la cual cosa no es dificil con el empleo de sentencias costate)
Bueno nada mas voy a seguir haciendo mas pruebas y te voy comentando.
Un saludo!!