Autor Tema: Novato - Problema con bucles en C,  (Leído 1550 veces)

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

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Novato - Problema con bucles en C,
« en: 29 de Agosto de 2012, 15:30:51 »
   Muy buenas, dese hace tiempo voy batallando con assembler y aprovechando las vacaciones me he propuesto aprender un poquito de C. He empezado a hacer programas sencillos con GLCD (cosa que aprovecho así porqe me haría gracia manejar las GLCD). Estoy practicando con el CCS y estoy liado con un programa que hace que un pixel se mueva de lado a lado de la pantalla. El problema es que el pixel va de izquierda a derecha, luego de derecha a izquierda y en vez de ir otra vez de izquierda a derecha empieza a ir todo el rato de derecha a izquierda. Supongo que hay que no está bien pero no salgo del problema. Os paso el codigo a ver si me echais un cable.

Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <HDM64GS12.c>
#include <graphics.c>
#use standard_io(a)

void main () {

glcd_init(ON);
int x;
do
{
glcd_pixel (x,10,1);
glcd_pixel (x-1,10,0);
delay_ms(20 );
x++;
while (x<=127);
}
while (x>=0);
{
glcd_pixel (x,10,1);
glcd_pixel (x+1,10,0);
delay_ms(20 );
x--;
}
}

Un saludo a todos y gracias de antemano.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Novato - Problema con bucles en C,
« Respuesta #1 en: 29 de Agosto de 2012, 16:10:11 »
Se mezclaron un poco los while, sería así:

Código: C
  1. while(1){
  2.  
  3. do{
  4.  
  5. }while(x<=127);
  6. do{
  7.  
  8. }while(x>=0);
  9.  
  10. }

Y luego x tendría que ser signado y de 16-bits (sino al ser signado no puede detectar cuando es mayor a 127) para detectar x>=0, sino es siempre verdadera la condición. Entonces coloca signed long x;


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re: Novato - Problema con bucles en C,
« Respuesta #2 en: 29 de Agosto de 2012, 17:17:57 »
   Muchas gracias Suky, me ha ido perfecto, cuelgo el código corregido para que ayude a otros como yo, incluyo comentarios para su mejor comprensión.

Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <HDM64GS12.c>
#include <graphics.c>
#use standard_io(a)

void main () {

glcd_init(ON);  // indispensble para encender el GLCD
signed long x;  // decimos que clase de dato es x
while (1)
{
do{
glcd_pixel (x,10,1);  // enciende en pixel y lo coloca en la coordenada x,y
glcd_pixel (x-1,10,0); // apaga en pixel, sino se hace se crearía una línea
delay_ms(20 );  // tiempo que tarda en desplazarse el pixel
x++;    // incrementa x en una unidad
}
while (x<=127);  // será cierta la expresión mientras se cumpla que x<=127,
                 // cuando no sea así seguirá el programa más abajo.
do{
glcd_pixel (x,10,1);
glcd_pixel (x+1,10,0);
delay_ms(20 );
x--;        // decrementa x en una unidad
}
while (x>=0);
}
}

   Un saludo y seguiremos con las dudas.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re: Novato - Problema con bucles en C,
« Respuesta #3 en: 02 de Septiembre de 2012, 06:52:00 »
   Buenos días, seguimos con los problemas, ahora quiero que el mismo pixel vaya rebotando por toda la pantalla, para eso debo trabajar con condicionales en X e Y. Para ello creo que debo usar la orden SWITCH. Pero no me sale, a ver si alguien me puede decir que etoy haciendo mal.

       muuuuuuuuuuuuuuuuuuuuchas a gracias y pego el código.

Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <HDM64GS12.c>
#include <graphics.c>
#use standard_io(a)

void main () {

glcd_init(ON);          // indispensble para encender el GLCD
signed long x;          // decimos que clase de dato es x
signed long y;

Switch (A){
case ((x++ && y++) && (x<=127 && y<=63)):
glcd_pixel (x,y,1);     // enciende en pixel y lo coloca en la coordenada x,y
glcd_pixel (x-1,y-1,0);   // apaga en pixel, sino se hace se crearía una línea
delay_ms(20 );          // tiempo que tarda en desplazarse el pixel
x++;                    // incrementa x en una unidad
y++;
break;

case ((x-- && y++) && (x>=0 && y<=63)):
glcd_pixel (x,y,1);
glcd_pixel (x+1,y-1,0);
delay_ms(20 );
x--;                   
y++;
break;
                       
case ((x++ && y--) && (x<=127 && y>=0)):
glcd_pixel (x,y,1);
glcd_pixel (x-1,y+1,0);
delay_ms(20 );
x++;                   
y--;
break;


case ((x-- && y--) && (x>=0 && y>=0)):
glcd_pixel (x,y,1);
glcd_pixel (x+1,y+1,0);
delay_ms(20 );
x--;                   
y--;
break;

}
}
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re: Novato - Problema con bucles en C,
« Respuesta #4 en: 02 de Septiembre de 2012, 07:44:26 »
  Os dejo otro ejemplo a ver si este va mejor, por lo menos me crea el HEX. pero el pixel no quiere moverse.

Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <HDM64GS12.c>
#include <graphics.c>
#use standard_io(a)

void main () {

glcd_init(ON);            // indispensble para encender el GLCD
signed long x;            // decimos que clase de dato es x
signed long y;
x=0;
y=0;
glcd_pixel (x++,y++,1);

if ((x++ && y++) && (x<=127 && y<=63))
{
glcd_pixel (x,y,1);       // enciende en pixel y lo coloca en la coordenada x,y
glcd_pixel (x-1,y-1,0);   // apaga en pixel, sino se hace se crearía una línea
delay_ms(20 );            // tiempo que tarda en desplazarse el pixel
x++;                      // incrementa x en una unidad
y++;
}
else
{
if ((x-- && y++) && (x>=0 && y<=63))
{
glcd_pixel (x,y,1);
glcd_pixel (x+1,y-1,0);
delay_ms(20 );
x--;                   
y++;
}
else
{                       
if ((x++ && y--) && (x<=127 && y>=0))
{
glcd_pixel (x,y,1);
glcd_pixel (x-1,y+1,0);
delay_ms(20 );
x++;                   
y--;
}
else
{
if ((x-- && y--) && (x>=0 && y>=0))
{
glcd_pixel (x,y,1);
glcd_pixel (x+1,y+1,0);
delay_ms(20 );
x--;                   
y--;
}
}
}
}
}


  A ver si alguno de los dos ejemplos vale la pena, un saludo y gracias.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/


 

anything