TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Mr.Hell en 21 de Noviembre de 2010, 19:23:57
-
Hola a todos, estoy iniciandome en la programacion en CCS, y estaba tratando de hacer un programa que mediante un pulsador, controle un contador, y muestre el valor en el LCD.
el contador va desde 1 a 3, es decir, cuando llega a 3 reinicia la variable a 1 y empieza de nuevo. este es mi codigo:
#include <LCD.C>
int8 i=0;
void main()
{
lcd_init();
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_a(0b11111111);
lcd_putc(" Bienvenido ");
disable_interrupts(global);
output_high(PIN_C0);
output_high(PIN_D0);
loop:
if(input(PIN_A0)){
delay_ms(1000);
i = i + 1;
delay_ms(2500);
switch (i) {
case '1' : lcd_putc("\f1"); break;
case '2' : lcd_putc("\f2"); break;
case '3' : lcd_putc("\f3"); break;
case '4' : i = 1; lcd_putc("\f1"); break;
default : lcd_putc("\fMayor a 3"); break;
};
};
goto loop;
}
El programa, cuando se ejecuta (en proteus), al presionar el boton, muestra en la pantalla "Mayor a 3", es decir, no lee correctamente la variable, o el valor en la variable no es el que yo busco.
Desde ya gracias, y espero que me pueda ayudar.
-
no lo he probado pero asi el codigo esta mejor....
while(true){
if(input(PIN_A0)){
delay_ms(1000);
i = i + 1;
delay_ms(2500); //aunque te recomendaria la funcion while...
}
switch (i) {
case 0 : i=1; break;
case 1 : lcd_putc("\f1"); break;
case 2 : lcd_putc("\f2"); break;
case 3 : lcd_putc("\f3"); break;
case 4 : i = 1; lcd_putc("\f1"); break;
default : lcd_putc("\fMayor a 3"); break;
}
}
-
Gracias por respnder. El delay de 2500, era solamente para probar, me olvide de sacarlo del codigo. lo puse, porque siempre me aparecía mayor a 3, y pense que podria ser que se repita la funcion y se sume.
-
yo te recomendaria para evitar hacer retardos largos de tiempo usar la funcion...
while(input(PIN_A4)){
while(input(PIN_A4)){}
}
tambien te recomendaria no hacer mucho uso de la funcion goto(por ejemplo en tu programa)... ya que puedes tener problemas con la pila...
usa un bucle infinito.. con la misma funcion el while(){}, o el do{ }while()...
-
Bueno, gracias a todos por responder. He logrado hacerlo funcionar como yo queria, aca adjunto el código por si alguien mas lo quiere ver o hacer alguna modificación:
while(true){
if(input(PIN_A0)){
i = i + 1;
delay_ms(500); //anti-rebote
switch (i) {
case 0 : i=1; break;
case 1 : lcd_putc("\f1"); break;
case 2 : lcd_putc("\f2"); break;
case 3 : lcd_putc("\f3"); break;
case 4 : i = 1; lcd_putc("\f1"); break;
default : lcd_putc("\fMayor a 3"); break;
};
};
};
}