Algo asi:Cual es el truco para mover solo la segunda linea??? :mrgreen:
Hola.
Yo lo hago asi:Código: C#
while(vista_inicial) { lcd_gotoxy(3,1); lcd_putc("ULTRASONIDO 1&3 MHz"); mensaje=true; while(mensaje) { lcd_gotoxy(1,2); printf(lcd_putc,"%s",mensaje_inicial); do{cmd=kbd_getc();}while(sweep!=true); sweep=false; for(i=0;i<=strlen(mensaje_inicial)-1;i++) { mensaje_inicial[i]=mensaje_inicial[i+1]; } mensaje_inicial[strlen(mensaje_inicial)]=msj_rom[k++]; k=0; } }
En donde msj_rom es donde guardo el mensaje largo y mensaje_inicial es el bufer de memoria para la LCD -de unos 24 caracateres para la LCD que yo uso-, la variable sweep la controlo con un timer (para el tiempo de scroll).
Saludos
#include <16F877A.h>
#fuses XT,NOWDT,NOPUT
#use delay(clock=4000000)
#byte puerto_e=0x09
#byte tris_e=0x89
#use fast_io(B)
#include <lcd.c>
#INT_EXT
ext_isr()
{
printf(lcd_putc,"\f ");
delay_ms(150);
signed int8 c=0;
for(c=0;c>-40;c--)
{
lcd_gotoxy(c,1);
printf(lcd_putc," LA INTERRUPCION EXTERNA SE HA ACTIVADO ");
delay_ms(150);
puerto_e=0x01;
}
}
signed int8 d=0;
void main ()
{
set_tris_e(0x00);
set_tris_B(0x01);
puerto_e=0x00;
port_b_pullups(TRUE);
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
while(TRUE)
{
lcd_init(); //inicializa la LCD
printf(lcd_putc,"\f ");
puerto_e=0x00;
lcd_gotoxy(d,1);
printf(lcd_putc," PIC16F877A: USO DE LA INTERRUPCION EXTERNA ");
delay_ms(150);
lcd_gotoxy(1,2);
d=d<-45? 0:d-1;
}
}/********************************************************************************************
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;
}
}hola, para mover la segunda fila a mi me funciona con la misma librería flex_lcd.c asi:
LCD_GOTOXY(1,2);lcd_putc("*");
for(z=0;z<14;z++){
lcd_send_byte(0,28);
delay_ms(100);}
con eso muevo el * hacia la derecha.