Autor Tema: Mostrar variable en LCD, PIC16f871  (Leído 4664 veces)

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

Desconectado Mr.Hell

  • PIC10
  • *
  • Mensajes: 8
Mostrar variable en LCD, PIC16f871
« 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:
Código: [Seleccionar]
#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.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Mostrar variable en LCD, PIC16f871
« Respuesta #1 en: 21 de Noviembre de 2010, 20:51:15 »
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;
     }  
}
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Mr.Hell

  • PIC10
  • *
  • Mensajes: 8
Re: Mostrar variable en LCD, PIC16f871
« Respuesta #2 en: 22 de Noviembre de 2010, 02:11:07 »
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.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Mostrar variable en LCD, PIC16f871
« Respuesta #3 en: 22 de Noviembre de 2010, 06:39:53 »
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()...
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Mr.Hell

  • PIC10
  • *
  • Mensajes: 8
Re: Mostrar variable en LCD, PIC16f871
« Respuesta #4 en: 22 de Noviembre de 2010, 23:00:05 »
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:
Código: [Seleccionar]
   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;
     };   
                          };
               };
}


 

anything