Hola a todos, yo con C18 lo hago de esta manera
/********************************************************************************************
Función:
void *Move_Tex_LCD(char linea, char V_ms, char *Array_LCD)
Sumario:
Desplaza un texto de un tamaño indeterminado de izquierda a derecha en un
display de 16x2
Descripción:
Esta función desplaza un texto (string) de izquierda a derecha en un display
la suelo utilizar para desplegar menús ya que el tamaño de un display normal
es muy limitado, a la función le pasamos la línea donde queremos que se despliegue
el mensaje, la velocidad de desplazamiento y el string a desplegar.
En la función detectaremos el tamaño del string automáticamente para que no tengamos que
preocuparnos de nada más, hay un string fijo que es el doble del tamaño de los carácteres
del display, este tamaño es fijo y es el que da la sensación de desplazamiento
Precondición:
la librería string.h tiene que estar invocada
Parámetros:
linea = Línea donde queremos que se muestre el texto
V_ms = Velocidad de desplazamiento del texto
Array_LCD = Puntero al string del texto a desplegar
Retorno:
Ninguno
Ejemplo:
Move_Tex_LCD(1,250,Array);
***************************************************************************************************/
void *Move_Tex_LCD(char Clear, char linea, char V_ms, char *Array_LCD){
static unsigned char a,b,c,wi,wo; //Variables varias , tienen que ser estáticas si no toma el valor que quiera cada vez que entre
static unsigned char SizeCadena; //Variable donde guardamos el tamaño de la cadena
static unsigned char cadena[17]; //Cadena que se va a imprimir en el LCD
if(Clear == 0){ //Si entramos desde otra sección
b=0; //Ponemos todos las banderas a 0
a=0; //para poder empezar desde 0 con el
c=0; //texto en pantalla
wi=0;
wo=1;
}
SizeCadena = strlen(Array_LCD); //Detectamos la longitud de la cadena a imprimir
// if(c == 0 || (Key != 0)){ //Preparamos el array para imprimir la cadena
if(c == 0){
for(a=0;a<=(18);a++){
cadena[a] = ' '; //Ósea llenamos el array de espacios
}
c=1; //Bandera para que entre el bucle que prepara el array solo una vez cada inicio de la cadena
wo=1; //variable para que el dato se mueva por la cadena, la inicializamos a 1 para que haya un desface entre wi y wo
}
for(wi=0;wi<=(17);wi++){
cadena[wi] = cadena[wo++]; //Dezplazamiento del dato dentro de la cadena
if(Key != 0) break; //Para salir del bucle si se pulsa una tecla
}
cadena[17] = Array_LCD[b++]; //se añade otro dato en la cola de la cadena
wi=0; //Se inicializan los contadores
wo=1;
#if defined(LCD)
gotoxyXLCD(0,linea); putsXLCD(cadena); //Se imprime en pantalla la cadena
while( BusyXLCD() ); //wait untill LCD controller is busy
#endif //LCD
Delay10KTCYx(V_ms); //Velocidad con que se desplaza la cadena
if(b == (SizeCadena+1)){ //Si se llega al final de la cadena, se inizializa el proceso de 0
b=0;
c=0;
a=0;
}
}
De momento solo la tengo implementada de derecha a izquierda, cambiando dos tonterías se podría hacer para los dos sentidos
espero les sirva de algo