Autor Tema: Para Modulay  (Leído 2263 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado crochete

  • PIC10
  • *
  • Mensajes: 13
Para Modulay
« 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!!!

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Para Modulay
« Respuesta #1 en: 16 de Agosto de 2004, 07:32:00 »
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

Desconectado crochete

  • PIC10
  • *
  • Mensajes: 13
RE: Para Modulay
« Respuesta #2 en: 16 de Agosto de 2004, 07:50:00 »
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!!

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Para Modulay
« Respuesta #3 en: 16 de Agosto de 2004, 08:40:00 »
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

Desconectado crochete

  • PIC10
  • *
  • Mensajes: 13
RE: Para Modulay
« Respuesta #4 en: 16 de Agosto de 2004, 09:36:00 »
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!!!

Desconectado crochete

  • PIC10
  • *
  • Mensajes: 13
RE: Para Modulay
« Respuesta #5 en: 16 de Agosto de 2004, 10:23:00 »
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!!