TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Fulguitron 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.
#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.
-
Se mezclaron un poco los while, sería así:
while(1){
do{
}while(x<=127);
do{
}while(x>=0);
}
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!
-
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.
#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.
-
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.
#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;
}
}
-
Os dejo otro ejemplo a ver si este va mejor, por lo menos me crea el HEX. pero el pixel no quiere moverse.
#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.