Autor Tema: Animación Hombre corriendo  (Leído 3531 veces)

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

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Animación Hombre corriendo
« en: 01 de Noviembre de 2015, 20:23:00 »
Que tal amigos del foro todopic, les traigo una pequeña animación en lcd. Se trata de un hombre corriendo y saltando, espero les guste.
dejo el código.

Código: CSS
  1. #include <18F4550.h>                                        // Pic a utilizar
  2.          #device *=16                                                // Dispositivo de 16 bit´s
  3.          #device adc=10                                              // ADC a 10 Bits
  4.          #fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBROWNOUT,VREGEN,NOWDT,NOPBADEN,MCLR,NOSTVREN,NOLVP,NODEBUG,NOPROTECT,NOSTVREN,NOCPB,NOWRT      
  5.          #use delay(clock=48000000)                                  // Frecuancia del CPU.        
  6.          
  7.          #byte porta = 0xF80                                         // Dirección del puerto A para la familia 18Fxx5x.
  8.          #byte portb = 0xF81                                         // Dirección del puerto B para la familia 18Fxx5x.
  9.          #byte portc = 0xf82
  10.          #byte portd = 0xf83
  11.          #byte porte = 0xf84
  12.          
  13.          #byte use_portd_lcd=8                                       // Define el puerto_d para la lcd.
  14.          #include <lcd4x20.c>                                       // Librería para el manejo del LCD
  15.          
  16.          int t=0,s=0;
  17.  
  18.          char b1[8] = {4,21,14,4,10,10,10};
  19.          char b2[8] = {4,14,21,4,10,10,10};
  20.          char b3[8] = {21,14,4,4,10,10,10};
  21.          char b4[8] = {21,14,4,4,10,17,0};
  22.          
  23.          char b5[8] = {6,6,4,14,21,4,10,10};
  24.          char b6[8] = {12,12,4,14,21,4,10,10};
  25.          char b7[8] = {6,6,4,14,21,4,26,2};        
  26.          char b8[8] = {6,6,4,14,20,6,10,8};
  27.          char b9[8] = {6,6,4,30,5,4,10,10};        
  28.          
  29.          
  30.          void animacion_caminar(void)
  31.          {
  32.          
  33.          for (t=6;t<=6;t++)
  34.          {
  35.          lcd_send_byte(0,0x40); for (s=0;s<8;s++) {lcd_send_byte(1,b5[s]);}  lcd_gotoxy(t,3); lcd_send_byte(1,0); delay_ms(500); lcd_gotoxy(t,3); lcd_putc(" ");
  36.          lcd_send_byte(0,0x48); for (s=0;s<8;s++) {lcd_send_byte(1,b6[s]);}  lcd_gotoxy(t,3); lcd_send_byte(1,1); delay_ms(500); lcd_gotoxy(t,3); lcd_putc(" ");
  37.          }
  38.          
  39.          for (t=6;t<=16;t++)
  40.          {
  41.          lcd_send_byte(0,0x50); for (s=0;s<8;s++) {lcd_send_byte(1,b7[s]);}  lcd_gotoxy(t,3); lcd_send_byte(1,2); delay_ms(50); lcd_gotoxy(t,3); lcd_putc(" ");    
  42.          lcd_send_byte(0,0x58); for (s=0;s<8;s++) {lcd_send_byte(1,b8[s]);}  lcd_gotoxy(t,3); lcd_send_byte(1,3); delay_ms(50); lcd_gotoxy(t,3); lcd_putc(" ");
  43.          lcd_send_byte(0,0x60); for (s=0;s<8;s++) {lcd_send_byte(1,b9[s]);}  lcd_gotoxy(t,3); lcd_send_byte(1,4); delay_ms(50); lcd_gotoxy(t,3); lcd_putc(" ");
  44.          if(t==6)  {lcd_gotoxy(t,2); lcd_putc("T");}
  45.          if(t==7)  {lcd_gotoxy(t,2); lcd_putc("O");}
  46.          if(t==8)  {lcd_gotoxy(t,2); lcd_putc("A");}
  47.          if(t==9)  {lcd_gotoxy(t,2); lcd_putc("T");}
  48.          if(t==10) {lcd_gotoxy(t,2); lcd_putc("S");}
  49.          if(t==11) {lcd_gotoxy(t,2); lcd_putc("M");}
  50.          if(t==12) {lcd_gotoxy(t,2); lcd_putc("A");}
  51.          if(t==13) {lcd_gotoxy(t,2); lcd_putc("S");}
  52.          if(t==14) {lcd_gotoxy(t,2); lcd_putc("T");}
  53.          if(t==15) {lcd_gotoxy(t,2); lcd_putc("E");}
  54.          if(t==16) {lcd_gotoxy(t,2); lcd_putc("R");}
  55.          }
  56.          
  57.          for (t=17;t<=17;t++)
  58.          {
  59.          lcd_send_byte(0,0x40); for (s=0;s<8;s++) {lcd_send_byte(1,b5[s]);}  lcd_gotoxy(t,3); lcd_send_byte(1,0); delay_ms(500); lcd_gotoxy(t,3); printf(lcd_putc," ");
  60.          lcd_send_byte(0,0x48); for (s=0;s<8;s++) {lcd_send_byte(1,b6[s]);}  lcd_gotoxy(t,3); lcd_send_byte(1,1); delay_ms(500); lcd_gotoxy(t,3); printf(lcd_putc," ");
  61.          lcd_send_byte(0,0x40); for (s=0;s<8;s++) {lcd_send_byte(1,b5[s]);}  lcd_gotoxy(t,3); lcd_send_byte(1,0); delay_ms(500); lcd_gotoxy(t,3); printf(lcd_putc," ");
  62.          lcd_send_byte(0,0x48); for (s=0;s<8;s++) {lcd_send_byte(1,b6[s]);}  lcd_gotoxy(t,3); lcd_send_byte(1,1); delay_ms(500); lcd_gotoxy(t,3); printf(lcd_putc," ");                
  63.          }  
  64.          
  65.          for (t=0;t<3;t++)
  66.          {
  67.          lcd_send_byte(0,0x40); for (s=0;s<8;s++) {lcd_send_byte(1,b1[s]);} lcd_gotoxy(17,3); lcd_send_byte(1,0); delay_ms(200);
  68.          lcd_send_byte(0,0x48); for (s=0;s<8;s++) {lcd_send_byte(1,b2[s]);} lcd_gotoxy(17,3); lcd_send_byte(1,1); delay_ms(100);
  69.          lcd_send_byte(0,0x50); for (s=0;s<8;s++) {lcd_send_byte(1,b3[s]);} lcd_gotoxy(17,3); lcd_send_byte(1,2); delay_ms(200);
  70.          lcd_send_byte(0,0x58); for (s=0;s<8;s++) {lcd_send_byte(1,b4[s]);} lcd_gotoxy(17,3); lcd_send_byte(1,3); delay_ms(100);
  71.          if(t==4) {delay_ms(500); printf(lcd_putc,"\f");}
  72.          }
  73.          }
  74.          
  75.          void main(void)
  76.          {
  77.          lcd_init();        
  78.          animacion_caminar();
  79.          
  80.          while(true)
  81.          {        
  82.          
  83.          }  
  84.          }
El señor es mi pastor,  nada me faltará.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Animación Hombre corriendo
« Respuesta #1 en: 01 de Noviembre de 2015, 20:45:21 »
Ahora tengo una pregunta que espero me ayuden..

deseo escribir la palabra TOATSMASTER con la cgram del pic y empiezo escribiendo en la dirección: lcd_send_byte(0,0x40); hasta la lcd_send_byte(0,0x80); escribe bien pero al pasar a la dirección lcd_send_byte(0,0x88); desacomoda todo y no esbe en la lcd lo que ya tenia. Alguien me puede decir como escribir mas alla de la direccion lcd_send_byte(0,0x80);, es decir escribir mas de 8 caracteres.

Pongo el codigo:

Código: CSS
  1. #include <18F4550.h>                                        // Pic a utilizar
  2.          #device *=16                                                // Dispositivo de 16 bit´s
  3.          #device adc=10                                              // ADC a 10 Bits
  4.          #fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBROWNOUT,VREGEN,NOWDT,NOPBADEN,MCLR,NOSTVREN,NOLVP,NODEBUG,NOPROTECT,NOSTVREN,NOCPB,NOWRT      
  5.          #use delay(clock=48000000)                                  // Frecuancia del CPU.        
  6.          
  7.          #byte porta = 0xF80                                         // Dirección del puerto A para la familia 18Fxx5x.
  8.          #byte portb = 0xF81                                         // Dirección del puerto B para la familia 18Fxx5x.
  9.          #byte portc = 0xf82
  10.          #byte portd = 0xf83
  11.          #byte porte = 0xf84
  12.          
  13.          #byte use_portd_lcd=8                                       // Define el puerto_d para la lcd.
  14.          #include <lcd4x20.c>                                       // Librería para el manejo del LCD
  15.          
  16.          int s=0;
  17.  
  18.          char b1[8] = {31,17,27,27,27,27,31,0};    // T
  19.          char b2[8] = {31,17,21,21,21,17,31,0};    // O
  20.          char b3[8] = {31,17,21,17,21,21,31,0};    // A
  21.          char b4[8] = {31,17,27,27,27,27,31,0};    // T
  22.          char b5[8] = {31,17,23,17,29,17,31,0};    // S
  23.          char b6[8] = {31,21,17,21,21,21,31,0};    // M
  24.          char b7[8] = {31,17,21,17,21,21,31,0};    // A  
  25.          char b8[8] = {31,17,23,17,29,17,31,0};    // S
  26.          char b9[8] = {31,17,27,27,27,27,31,0};    // T
  27.          char b10[8] = {31,17,23,17,23,17,31,0};   // E
  28.          char b11[8] = {31,19,21,19,21,21,31,0};   // R
  29.  
  30.  
  31.  
  32.          
  33.          void toatsmaster(void)
  34.          {          
  35.          lcd_send_byte(0,0x40); for (s=0;s<8;s++) {lcd_send_byte(1,b1[s]);}  lcd_gotoxy(1,1);  lcd_send_byte(1,0);
  36.          lcd_send_byte(0,0x48); for (s=0;s<8;s++) {lcd_send_byte(1,b2[s]);}  lcd_gotoxy(2,1);  lcd_send_byte(1,1);
  37.          lcd_send_byte(0,0x50); for (s=0;s<8;s++) {lcd_send_byte(1,b3[s]);}  lcd_gotoxy(3,1);  lcd_send_byte(1,2);
  38.          lcd_send_byte(0,0x58); for (s=0;s<8;s++) {lcd_send_byte(1,b4[s]);}  lcd_gotoxy(4,1);  lcd_send_byte(1,3);
  39.          lcd_send_byte(0,0x60); for (s=0;s<8;s++) {lcd_send_byte(1,b5[s]);}  lcd_gotoxy(5,1);  lcd_send_byte(1,4);
  40.          lcd_send_byte(0,0x68); for (s=0;s<8;s++) {lcd_send_byte(1,b6[s]);}  lcd_gotoxy(6,1);  lcd_send_byte(1,5);
  41.          lcd_send_byte(0,0x70); for (s=0;s<8;s++) {lcd_send_byte(1,b7[s]);}  lcd_gotoxy(7,1);  lcd_send_byte(1,6);
  42.          lcd_send_byte(0,0x78); for (s=0;s<8;s++) {lcd_send_byte(1,b8[s]);}  lcd_gotoxy(8,1);  lcd_send_byte(1,7);
  43.          lcd_send_byte(0,0x80); for (s=0;s<8;s++) {lcd_send_byte(1,b9[s]);}  lcd_gotoxy(9,1);  lcd_send_byte(1,8);
  44.         [b] //lcd_send_byte(0,0x88); for (s=0;s<8;s++) {lcd_send_byte(1,b10[s]);} lcd_gotoxy(10,1); lcd_send_byte(1,9);
  45.          //lcd_send_byte(0,0x90); for (s=0;s<8;s++) {lcd_send_byte(1,b11[s]);} lcd_gotoxy(11,1); lcd_send_byte(1,10);[/b]
  46.          }
  47.          
  48.          
  49.          void main(void)
  50.          {
  51.          lcd_init();        
  52.          toatsmaster();
  53.          
  54.          while(true)
  55.          {        
  56.          
  57.          }  
  58.          }

Si descomento lo que esta en negritas me repite la letra O y A en vez de poner la letra E y S. creo que el pronblema esta en la dirección lcd_send_byte(0,0x88); y lcd_send_byte(0,0x90); pero no se como hacerlo para que aparezca TOATSMASTER
El señor es mi pastor,  nada me faltará.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Animación Hombre corriendo
« Respuesta #2 en: 01 de Noviembre de 2015, 21:12:55 »
En estos caso es cuando más envidio a Neo que veía la mátrix en código... por más que me concentro en el código que colgaste no logro ver al muchacho corriendo...
-
Leonardo Garberoglio

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Animación Hombre corriendo
« Respuesta #3 en: 01 de Noviembre de 2015, 21:25:23 »
En un rato más subo el vídeo,  para que veas como sale en la lcd. Por ahora me esta fallando un poco el internet  :5] y eso es molesto para mi ya que no me deja hacer lo que quiero.

Pero bueno espera un momento y verás el vídeo.
El señor es mi pastor,  nada me faltará.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re:Animación Hombre corriendo
« Respuesta #4 en: 01 de Noviembre de 2015, 21:30:41 »
Citar
En estos caso es cuando más envidio a Neo que veía la mátrix en código... por más que me concentro en el código que colgaste no logro ver al muchacho corriendo...

tomar ciertas sustancias pueden hacer que veas el mundo en matrices  :D :D

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Animación Hombre corriendo
« Respuesta #5 en: 01 de Noviembre de 2015, 22:28:57 »
Si.. pienso que un video seria adecuado para 2 cosas.

- Para ver la persona corriendo y saltando
- Para ver el problema.

Si posees tambien el nombre del driver del LCD mejor, no me fio en librerias que no conosco.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Animación Hombre corriendo
« Respuesta #6 en: 01 de Noviembre de 2015, 23:57:02 »
Bueno, quizás no es lo que esperaban, recién e retomado la CGRAM y se me ocurrió hacer algo motivador con la misma. Espero no desilusionar sus expectativas a lo que escribí en un inicio.

Este es el vídeo:


Y referente a lo que escribí la segunda vez al iniciar el tema:

Citar
Ahora tengo una pregunta que espero me ayuden..

deseo escribir la palabra TOATSMASTER con la cgram del pic y empiezo escribiendo en la dirección: lcd_send_byte(0,0x40); hasta la lcd_send_byte(0,0x80); escribe bien pero al pasar a la dirección lcd_send_byte(0,0x88); desacomoda todo y no esbe en la lcd lo que ya tenia. Alguien me puede decir como escribir mas alla de la direccion lcd_send_byte(0,0x80);, es decir escribir mas de 8 caracteres

Me refiero a que la palabra  TOATSMASTER tiene 11 letras (En el video escribi TOATSMASTER sin la CGRAM) y en la CGRAM solo se escribir 8 caracteres, es decir, hasta la palabra TOATSMAS se escribe pero lo de TER ya no aparace en la lcd.

Alguien me puede decir como escribir mas de 8 caracteres diferentes con la cgram?

Para KILLERJC, la librería del LCD esta al inició del tema para descargar, así como el código.
« Última modificación: 02 de Noviembre de 2015, 10:32:55 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Animación Hombre corriendo
« Respuesta #7 en: 02 de Noviembre de 2015, 11:38:47 »
Esta genial el hombrecito corriendo jeje.

Ahora mi pregunta es... Por que usas la CGRAM para escribir texto ? Cuando tenes la ROM del LCD con todos los caracteres para hacerlo para hacerlo ?

O estas probando para grabar varias cosas a la CGRAM y usarlas ?

Si es lo ultimo como solo tenes 8 lugares entonces deberias:

TOATSMASTER
0x0 = T
0x1 = O
0x2 = A
0x3 = S
0x4 = M
0x5 = E
0x6 = R

Código: [Seleccionar]
// Aca guardo los valores a la CGRAM
Varray[11] = {0,1,2,1,3,4,2,3,0,5,6};
for (i=0;i<11;i++) { lcd_putc(Varray[i]); }

// Fin.

Es la unica forma me parece, Por que si grabas solo 8 letras, escribis, y luego grabas las restantes, estarias cambiando las primeras. Si es que el LCD tiene una tasa de refresco, que creo que lo hace.
« Última modificación: 02 de Noviembre de 2015, 11:53:48 por KILLERJC »

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Animación Hombre corriendo
« Respuesta #8 en: 02 de Noviembre de 2015, 11:46:00 »
KILLERJC gracias por responder.

Si lo que quiero es escribir más de 8 caracteres,  con la cgram o ROM. Por ejemplo esta palabra de TOATSMASTER que quería escribir no me salió completa y tal parece que es por que no alcanzan las direcciones para escribirla.

Con la ROM como seria para escribir más de 8 caracteres o como me aconsejas hacerlo?.

« Última modificación: 02 de Noviembre de 2015, 11:52:26 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Animación Hombre corriendo
« Respuesta #9 en: 02 de Noviembre de 2015, 12:02:27 »
Te podes crear un codigo. o CCS suele tenerlo.

Con
lcd_gotoxy(x,y);
printf(lcd_putc, "TOATMASTER");

Lo que hace el printf es pasar letra por letra y enviarlo al lcd_putc, esto directamente lo toma de la ROM.. Lo que es letras /numeros y demas no tenes que preocuparte y usas la de la ROM, la CGRAM son para cosas como vos hiciste, que no es un caracter comun. Por eso hay solo 8 nomas.

O podes crearte tu propio printf, simple o complejo, o podes usar todos putc. Observaras que solo le indico el comienzo y luego sigue solo. Esto es por que el LCD internamente vos seleccionas la posicion de DDRAM y cuando escribis un caracter para que muestre, solo aumenta de direccion al otro lugar, es decir no tengo que repetir mil veces el gotoxy Como haces vos en tus programas.


Suponiendo que sea un HD44780 tu driver:
https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
Pagina 17 tenes la tabla de la ROM
Es de hacerte notar que las letras y demas corresponden a los caracteres ASCII, de esa forma una "a" que es 0x61, si buscas en la tabla las vas a encontrar con ese valor.

Ahora si queres volver a utilizar la CGRAM para otra cosa, tenes que darte cuenta que solo podes mantener 8 caracteres, si por alguna razon digamos que escribiste una "A" en la CGRAM y en tu LCD se esta mostrando esa "A" ( de la CGRAM) y procedes a cambiarlo bit a bit por que queres poner otra cosa, digamos una "B", en el LCD se actualizaria a una "B".
Creo que esto es asi, podrias probarlo si es asi o no. Pero es para que lo tengas en cuenta por si ocurre.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Animación Hombre corriendo
« Respuesta #10 en: 02 de Noviembre de 2015, 13:28:51 »
Muy bien KILLERJC,  me a gustado la manera en que  manejas el array. Y no se me había ocurrido que se repiten algunas letras que forman esa palabra. Y ya me a quedado claro que sólo puedo manejas 8 caracteres especiales diferentes.

Gracias por tu ayuda e interés a todos. Intentaré hacerlo como dice KILLERJC  y pondre resultados.

Gracias a los que comentan y ayudan  :-/
« Última modificación: 02 de Noviembre de 2015, 13:33:31 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.