Autor Tema: Kit de luces por lcd  (Leído 2157 veces)

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

Desconectado lavidtz

  • PIC10
  • *
  • Mensajes: 13
Kit de luces por lcd
« en: 11 de Diciembre de 2006, 19:53:52 »
Hola!
Tengo el siguiente problema. Estoy haciendo un kit de luces por LCD con velocidad seleccionable con los interruptores RA3 y RA4, dependiendo de los estados de estos, el kit correrá más rápido o más lento.
Hasta aquí la cosa ha ido bien, pero mi kit lo he realizado de forma en que se vayan encendiendo de izquierda a derecha las posiciones del LCD y al llegar al final empezar de nuevo. Si alguien sabe hacer que el hueco negro se desplace de izquierda a derecha rebotando le estaría muy agradecido.
Pero el problema principal está en que me debe aparecer en la segunda fila del LCD el tiempo en ms del avance de las posiciones,es decir el retardo que empleamos en los 4 casos.
Esto no es dificil hacerlo pero me surge el problema cuando al ponerle en cada caso lo que debe aparecer en la segunda fila me aparece pero cada vez que avanza una posición la luz negra en el LCD me vuelve a escribir el tiempo y así es imposible que el ejercicio que trato de hacer obedezca y se parezca a un kit de luces.
Os dejo lo que es mi programa realizado con el pic 16f84 y a ver si alguien me puede echar una mano.


#include <16f84.h>
#use delay(clock=4000000,RESTART_WDT)
#include <lcd2.c>
#use fast_io(A)
#use fast_io(B)
#byte port_a = 5

char c=0b11111111;
int dir=1;

main() {
  set_tris_a(0x1F);
  lcd_init();   // Comandos de inicialización del LCD.
  lcd_enviar(LCD_COMANDO, LCD_CURSOR_ON);


  while(1)
  {

if(input(PIN_A4) && (input(PIN_A3)))
{
  lcd_gotoxy(dir,1);
  lcd_putc(c);
  dir++;
  delay_ms(100);
  if(dir>15)
  reset_cpu();
}

if(!input(PIN_A4) && (input(PIN_A3)))
{
  lcd_gotoxy(dir,1);
  lcd_putc(c);
  dir++;
  delay_ms(500);
  if(dir>15)
  reset_cpu();
}

if(input(PIN_A4) && (!input(PIN_A3)))
{
  lcd_gotoxy(dir,1);
  lcd_putc(c);
  dir++;
  delay_ms(1000);
  if(dir>15)
  reset_cpu();
}

if(!input(PIN_A4) && (!input(PIN_A3)))
  //lcd_gotoxy(2,2);        -->Intento escribir el valor en la fila inferior pero en cada
  // lcd_putc("2000ms");    -->posición se me sobreescribe
{
  lcd_gotoxy(dir,1);
  lcd_putc(c);
  dir++;
  delay_ms(2000);
  if(dir>15)
  reset_cpu();
  }
}
}

Un saludo de Lavidtz.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Kit de luces por lcd
« Respuesta #1 en: 11 de Diciembre de 2006, 19:59:13 »
¿Un kit de luces es una luz que "va y biene" de derecha a izq. y viceversa?
Creo que es eso, pero me confundi con el LCD....
¿Estas intentando simularlas sobre el LCD en lugar de usar LEDS?

Citar
cada vez que avanza una posición la luz negra en el LCD me vuelve a escribir el tiempo
Esto debe ser por que la rutina de impresion en el LCD debe estar toda junta. Deberias tener una rutina para la barra (o la "luz" que se desplaza) y otra para escribir el tiempo, y llamar a cada una cuando corresponda.

Saludos! :mrgreen:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado lavidtz

  • PIC10
  • *
  • Mensajes: 13
Re: Kit de luces por lcd
« Respuesta #2 en: 11 de Diciembre de 2006, 20:50:04 »
No no te has equivocado,es un kit por LCD,hago desplazar el último símbolo ascii y que rebote o se enciendan todos hasta el final y que vuelva a empezar.
Ok intentaré hacer varias rutinas con el movimiento seleccionado y las iré llamando hasta que la cuenta se inicie de nuevo.Aunque el programa me ocupará bastante pero es una buena solución creo,Gracias.

Desconectado lavidtz

  • PIC10
  • *
  • Mensajes: 13
Re: Kit de luces por lcd
« Respuesta #3 en: 12 de Diciembre de 2006, 00:12:44 »
Nada,llamando a las rutinas sale pero muy largo e inestable,casi reboso la capacidad del micro llegando al 87%.

Pongo el programa modificado pero me gustaría saber si se puede hacer más simple sin que se sobreescriba el número en cada posición de la LCD

#include <16f84.h>
#use delay(clock=4000000,RESTART_WDT)
#include <lcd2.c>
#use fast_io(A)
#use fast_io(B)
#byte port_a = 5

char c=0b11111111;

 void Tiempo1()
 {
  lcd_gotoxy(2,2);
  lcd_putc("100  1-1");
  }

 void Tiempo2()
 {
  lcd_gotoxy(2,2);
  lcd_putc("500  1-0");
  }
 
 void Tiempo3()
 {
  lcd_gotoxy(2,2);
  lcd_putc("1000  0-1");
  }
 
 void Tiempo4()
 {
  lcd_gotoxy(2,2);
  lcd_putc("2000  0-0");
  }


 void Visualizar_1()
 {
  lcd_gotoxy(1,1);
  lcd_putc(c);
  }
  void Visualizar_2()
 {
  lcd_gotoxy(2,1);
  lcd_putc(c);
  }
  void Visualizar_3()
 {
  lcd_gotoxy(3,1);
  lcd_putc(c);
  }
  void Visualizar_4()
 {
  lcd_gotoxy(4,1);
  lcd_putc(c);
  }
  void Visualizar_5()
 {
  lcd_gotoxy(5,1);
  lcd_putc(c);
  }
  void Visualizar_6()
 {
  lcd_gotoxy(6,1);
  lcd_putc(c);
  }
  void Visualizar_7()
 {
  lcd_gotoxy(7,1);
  lcd_putc(c);
  }
  void Visualizar_8()
 {
  lcd_gotoxy(8,1);
  lcd_putc(c);
  }
  void Visualizar_9()
 {
  lcd_gotoxy(9,1);
  lcd_putc(c);
  }
  void Visualizar_10()
 {
  lcd_gotoxy(210,1);
  lcd_putc(c);
  }
  void Visualizar_11()
 {
  lcd_gotoxy(11,1);
  lcd_putc(c);
  }
  void Visualizar_12()
 {
  lcd_gotoxy(12,1);
  lcd_putc(c);
  }
  void Visualizar_13()
 {
  lcd_gotoxy(13,1);
  lcd_putc(c);
  }
  void Visualizar_14()
 {
  lcd_gotoxy(14,1);
  lcd_putc(c);
  }
  void Visualizar_15()
 {
  lcd_gotoxy(15,1);
  lcd_putc(c);
  }
  void Visualizar_16()
 {
  lcd_gotoxy(16,1);
  lcd_putc(c);
  }

  main() {
  set_tris_a(0x1F);
  lcd_init();   // Comandos de inicialización del LCD.
  lcd_enviar(LCD_COMANDO, LCD_CURSOR_ON);


  while(1)
  {

if(input(PIN_A4) && (input(PIN_A3)))
{
  Tiempo1();
  Visualizar_1();
  delay_ms(100);
  Visualizar_2();
  delay_ms(100);
  Visualizar_3();
  delay_ms(100);
  Visualizar_4();
  delay_ms(100);
  Visualizar_5();
  delay_ms(100);
  Visualizar_6();
  delay_ms(100);
  Visualizar_7();
  delay_ms(100);
  Visualizar_8();
  delay_ms(100);
  Visualizar_9();
  delay_ms(100);
  Visualizar_10();
  delay_ms(100);
  Visualizar_11();
  delay_ms(100);
  Visualizar_12();
  delay_ms(100);
  Visualizar_13();
  delay_ms(100);
  Visualizar_14();
  delay_ms(100);
  Visualizar_15();
  delay_ms(100);
  Visualizar_16();
  reset_cpu();
}

if(!input(PIN_A4) && (input(PIN_A3)))
{
  Tiempo2();
  Visualizar_1();
  delay_ms(500);
  Visualizar_2();
  delay_ms(500);
  Visualizar_3();
  delay_ms(500);
  Visualizar_4();
  delay_ms(500);
  Visualizar_5();
  delay_ms(500);
  Visualizar_6();
  delay_ms(500);
  Visualizar_7();
  delay_ms(500);
  Visualizar_8();
  delay_ms(500);
  Visualizar_9();
  delay_ms(500);
  Visualizar_10();
  delay_ms(500);
  Visualizar_11();
  delay_ms(500);
  Visualizar_12();
  delay_ms(500);
  Visualizar_13();
  delay_ms(500);
  Visualizar_14();
  delay_ms(500);
  Visualizar_15();
  delay_ms(500);
  Visualizar_16();
  reset_cpu();
}

if(input(PIN_A4) && (!input(PIN_A3)))
{
  Tiempo3();
  Visualizar_1();
  delay_ms(1000);
  Visualizar_2();
  delay_ms(1000);
  Visualizar_3();
  delay_ms(1000);
  Visualizar_4();
  delay_ms(1000);
  Visualizar_5();
  delay_ms(1000);
  Visualizar_6();
  delay_ms(1000);
  Visualizar_7();
  delay_ms(1000);
  Visualizar_8();
  delay_ms(1000);
  Visualizar_9();
  delay_ms(1000);
  Visualizar_10();
  delay_ms(1000);
  Visualizar_11();
  delay_ms(1000);
  Visualizar_12();
  delay_ms(1000);
  Visualizar_13();
  delay_ms(1000);
  Visualizar_14();
  delay_ms(1000);
  Visualizar_15();
  delay_ms(1000);
  Visualizar_16();
  reset_cpu();
}

if(!input(PIN_A4) && (!input(PIN_A3)))
 
{
  Tiempo4();
  Visualizar_1();
  delay_ms(2000);
  Visualizar_2();
  delay_ms(2000);
  Visualizar_3();
  delay_ms(2000);
  Visualizar_4();
  delay_ms(2000);
  Visualizar_5();
  delay_ms(2000);
  Visualizar_6();
  delay_ms(2000);
  Visualizar_7();
  delay_ms(2000);
  Visualizar_8();
  delay_ms(2000);
  Visualizar_9();
  delay_ms(2000);
  Visualizar_10();
  delay_ms(2000);
  Visualizar_11();
  delay_ms(2000);
  Visualizar_12();
  delay_ms(2000);
  Visualizar_13();
  delay_ms(2000);
  Visualizar_14();
  delay_ms(2000);
  Visualizar_15();
  delay_ms(2000);
  Visualizar_16();
  reset_cpu();
  }
}
}

Lo que hago es hacer una subrrutina para cada movimiento porque una subrrutina que me englobe todos los movimientos me hace repetir la subrrutina de tiempo en cada posición que le corresponda.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Kit de luces por lcd
« Respuesta #4 en: 12 de Diciembre de 2006, 00:46:02 »
Mira esto en codigo basic lo que hace es poner la letra "e" desde la posicion uno del lcd hasta la 16 cada 100mS despues espera medio segundo y las empieza a borrar cada 100mS desde la posicion 16 hasta la 0 y lo hace infinito.

Quiero pensar que se puede adaptar a C tambien incluyendo lo del cambio del tiempo.

Código: [Seleccionar]
l:
for i=1 to 16
   lcd_out(1,i,"e")
   delay_ms(100)
  next i

  delay_ms(500)
 
 for i=16 to 1 step -1
   lcd_out(1,i," ")
   delay_ms(100)
  next i
 
delay_ms(500)
 goto l
end.

Suerte ;)
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado lavidtz

  • PIC10
  • *
  • Mensajes: 13
Re: Kit de luces por lcd
« Respuesta #5 en: 14 de Diciembre de 2006, 20:45:36 »
Ya lo consegui,ahora tengo un kit de luces y cada vez que pulsas una tecla,casi sin interrumpirse,cambia la velocidad y ademas en la linea de abajo reflejo el tiempo y los estados de los interruptores.

//By LAVIDTZ
//Este es un kit de luces con el lcd mediante el simbolo completamente oscuro
//que lo hago desplazarse hasta el final y al salir del lcd vuelve a aparecer.
//Lo mas dificil del programa es sin duda la autonomia independiente de
//de la primera fila y lo que debe aparecer en la segunda.
//Para ello he jugado con 4 variables inventadas en los 4 casos de variacion
//de la velocidad.Para que no se reescriban cada vez que el simbolo se desplaza
//(ese ha sido mi mayor problema)les he asignado un valor que al
//reconocerlo escribe automaticamente y este posteriormente lo vario de valor
//para que solo ejecute la orden de kit de luces.
//Al acabar de escribir el tiempo y valores de los estados vuelvo a estabilizar
//los valores de los otros casos para que al cambiar de velocidad vuelva a
//reconocer el valor inicial y escribir solamente una vez hasta empezar de nuevo
//con el kit.

#include <16f84.h>                 
#use delay (clock=4000000)               
#include<lcd2.c>                 

char c=0b11111111;     
signed char x=0;       
signed char a=-1;       
signed char b=-1;         
signed char e=-1;         
signed char d=-1;
       
main()
{
 
   lcd_init();               
   lcd_enviar(LCD_COMANDO, LCD_CURSOR_ON);
   
   while(1)
   {
         if(input(PIN_A4) && (input(PIN_A3)))
       
         {     
      if(a<=-1){           
      lcd_gotoxy(1,2) ;   
      lcd_putc("150ms RA3-0RA4-0") ;
      a=0;
      b=-1;
      e=-1;
      d=-1;
         }
      {
      lcd_gotoxy(x,1) ;   
      lcd_putc(" ") ;
      lcd_putc(c) ;   
      delay_ms(150);         
      x++;               
      if(x>16){           
      x=0;
         }
      }
         }
         
         if(!input(PIN_A4) && (input(PIN_A3)))
         {     
      if(b<=-1){           
      lcd_gotoxy(1,2) ;   
      lcd_putc("300ms RA3-0RA4-1") ;
      b=0;
      a=-1;
      e=-1;
      d=-1;
         }
   {     
      lcd_gotoxy(x,1) ;   
      lcd_putc(" ") ;
      lcd_putc(c) ;   
      delay_ms(300);         
      x++;             
      if(x>16){           
      x=0;
         }
   }
         }
         
         if(input(PIN_A4) && (!input(PIN_A3)))
         {     
      if(e<=-1){           
      lcd_gotoxy(1,2) ;   
      lcd_putc("600ms RA3-1RA4-0") ;
      e=0;
      a=-1;
      b=-1;
      d=-1;
         }
   {     
      lcd_gotoxy(x,1) ;   
      lcd_putc(" ") ;
      lcd_putc(c) ;   
      delay_ms(600);         
      x++;               
      if(x>16){           
      x=0;
         }
   }
         }
         
         if(!input(PIN_A4) && (!input(PIN_A3)))
         {     
      if(d<=-1){           
      lcd_gotoxy(1,2) ;   
      lcd_putc("1.2s  RA3-1RA4-1") ;
      d=0;
      a=-1;
      e=-1;
      b=-1;
         }
   {     
      lcd_gotoxy(x,1) ;   
      lcd_putc(" ") ;
      lcd_putc(c) ;   
      delay_ms(1200);         
      x++;               
      if(x>16){           
      x=0;
         }
   }
   }         
}
}

Ha costado pero al final ha merecido la pena :)