Autor Tema: Contador acendente y descendente en CCS con LCD ayuda  (Leído 20774 veces)

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

Desconectado Twistek

  • PIC10
  • *
  • Mensajes: 13
Contador acendente y descendente en CCS con LCD ayuda
« en: 27 de Junio de 2009, 21:53:06 »
hola soy nuevo en esta comunidad y espero me puedan ayudar, e buscado en su foro y encontre contadores en LCD, con un pulso en la entrada PIN_A0 pero necesito un contador que descienda , una ves que ya halla ascendido, por ejemplo tengo un motor y cada que da una vuelta presiona un switch y me empieza a contar , el problema es que cuando le doy de reberza al motor tengo un switch que manda pulsos al puerto A1 y me debe de empezar a restar el conteo, el problema es que no puedo hacer que decienda y que cuando llegue a 0 se detenga el contador. Porfavor alguien ayudenme aqui les dejo 2 programas de contadores para que me digan como modificarlos.

#include "C:\Documents and Settings\Usuario\Mis documentos\Mis vídeos\practicas\LCD\contador.h"


void main(void)
{
char i=0,x=0; //tabla y variable definida

lcd_init(); //inicializa lcd
printf(lcd_putc,"BIENVENIDO\n BUEN DIA" ); //muestra mensaje inicio
delay_ms(1000);

do{ //espera hasta que se pulse boton...
}while(input(PIN_A0)==1);
printf(lcd_putc,"\f" ); //...para borrar pantalla e iniciar contador

printf(lcd_putc,"\nDISTANCIA EN MTS" ); //auto publicidad en la 2ºfila lcd
lcd_gotoxy(8,1); //vuelve 1ºfila lcd y apunta la mitad de la columna

for( ; ; ){ //bucle...
if(!input(PIN_A0)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A0)); //...rebotes del boton
if(i>99){ //¿se ha mostrado digito 9?
printf(lcd_putc,"\f" );
printf(lcd_putc,"\nDISTANCIA EN MTS" );
i=0; //SI -> restaura valor indice(para mostrar digito 0)
output_high(PIN_B3); //activa buzzer(beep)
delay_ms(50); //tiempo de escucha del beep
output_low(PIN_B3); //desactiva buzzer(beep)
}
lcd_gotoxy(8,1);
printf(lcd_putc,"%u", i ); //muestra por pantalla el numero
 //retrasa el cursor una posicion(escribe encima)
i++; //incremento contador indice tabNum
}
} //...infinito
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------   
//programa: contador de 00000 a 99999 con LCD
// nombres: japifer_22
// email:    japifer_22@hotmail.com
// Ing.Ejec.Electronica
// variables:
//          * i -> indice tabla 7seg para mostrar 1º digito,,,sifra menos significativa
//          * j -> indice tabla 7seg para mostrar 2º digito   
//          * h -> indice tabla 7seg para mostrar 3º digito   
//          * g -> indice tabla 7seg para mostrar 4º digito   
//          * z -> indice tabla 7seg para mostrar 5º digito,,,sifra mas significativa   
//          * tabNum[] -> vector donde se almacenan numeros del contador 0a9
//           
//   Conexiones:
//               MCLR -> inicio programa //"propaganda"
//               A0 -> entrada a contador
//               B0 -> E  --> de la LCD
//               B1 -> RS --> de la LCD       
//               B2 -> RW --> de la LCD   
//               B4 -> D4 --> de la LCD     
//               B5 -> D5 --> de la LCD         
//               B6 -> D6 --> de la LCD
//               B7 -> D7 --> de la LCD
//                               
//////////////////////////////////////////////////////////////////////////////////
     
#include <16f876a.h>            //pic a utilizar         
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#use delay (clock=20000000)         //clock=20Mhz
#define use_portb_lcd TRUE         //definir portb lcd
#include<lcd.c>                  //libreria manejo lcd
     
///PROGRAMA
void main(void)
{
   char tabNum[10]={'0','1','2','3','4','5','6','7','8','9'},i=0,j=0,h=0,g=0,z=0;   //tabla y variable definida
   lcd_init();         //inicializa lcd
   printf(lcd_putc,"contador de\n00000 a 99999");   //muestra mensaje inicio

   do{                     //espera hasta que se pulse boton...
   }while(input(PIN_A0)==1);
   printf(lcd_putc,"\f");      //...para borrar pantalla e iniciar contador
   
   printf(lcd_putc,"\njapifer_22.");   //auto publicidad en la 2ºfila lcd
   lcd_gotoxy(7,1);                  //vuelve 1ºfila lcd y apunta la mitad de la columna
   
   for(;;){                     //bucle...
      if(!input(PIN_A0)){                  //¿se ha pulsado el boton?
         do{                           //SI -> eliminar...           
         }while(!input(PIN_A0));            //...rebotes del boton
         if(i>9){                     //¿se ha mostrado digito 9?
            i=0; //SI -> restaura valor indice(para mostrar digito 0)
            j++;
            if(j>9){J=0;
            h++;}
            if(h>9){h=0;
            g++;}
            if(g>9){g=0;
            z++;}
            if(z>9){z=0;
            output_high(PIN_B3);
            delay_ms(100);
            }
           
            }
         printf(lcd_putc,"%c%c%c%c%c",tabNum[z],tabNum[g],tabNum[h],tabNum[j],tabNum);   //muestra por pantalla el numero
         printf(lcd_putc,"\b\b\b\b\b"); //retrasa el cursor una posicion(escribe encima)
         
         i++;                        //incremento contador indice tabNum
         }         
      }                     //...infinito
}


 

         





Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Contador acendente y descendente en CCS con LCD ayuda
« Respuesta #1 en: 27 de Junio de 2009, 22:24:29 »
Puedes utilizar una variable que lleve la cuenta:

Código: C
  1. long Contador;


Para incrementar:
Código: C
  1. if(input(PIN_A0)==0){ //¿se ha pulsado el boton?
  2.      Contador++;
  3.      printf(lcd_putc,"%03lu",Contador);
  4. }

Para decremetar:
Código: C
  1. if(input(PIN_A1)==0){ //¿se ha pulsado el boton?
  2.      if(Contador!=0){  // Si llego a 0 no hace nada
  3.          Contador--;
  4.          printf(lcd_putc,"%03lu",Contador);
  5.     }
  6. }
No contesto mensajes privados, las consultas en el foro

Desconectado Twistek

  • PIC10
  • *
  • Mensajes: 13
Re: Contador acendente y descendente en CCS con LCD ayuda
« Respuesta #2 en: 28 de Junio de 2009, 18:07:00 »
ya le probe gracias me ayudaron en otro post, pero muchas gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Contador acendente y descendente en CCS con LCD ayuda
« Respuesta #3 en: 28 de Junio de 2009, 18:19:37 »
ya le probe gracias me ayudaron en otro post, pero muchas gracias.
Lee las reglas del foro! Si ya habías preguntado en otro subforo no era necesario crear otro hilo  :police:
No contesto mensajes privados, las consultas en el foro

Desconectado ronny22

  • PIC10
  • *
  • Mensajes: 13
Re: Contador acendente y descendente en CCS con LCD ayuda
« Respuesta #4 en: 02 de Julio de 2009, 22:26:57 »
hola Twistek . aca te dejo un programa creado por vzener, espero te sirva.es un contador reversible de 0-9 mostrado por 7segmentos, te dejo una imagen adjunta del circuito.

////////////////////////////////////////////////////////////////////////////////////
//            VsZeNeR'04      
//              14/Agosto/05
//            vszener@gmail.com
//   Programa:   Contador reversible 0-9
//   Version:   0.0
//
//   Dispositivo: PIC 16F648A      Compilador: CCS vs3.227
//   Entorno IDE: MPLAB IDE v7.20      Simulador:    Proteus 6.7sp3
//
//   Notas: Contador reversible 0 al 9 viceversa cada 0,5s y vuelta a empezar. Tener
//         en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
//         salida. Cuando el switch esta cerrado se lee por el pin A0 del porta un
//         '0' logico(pin A0 low)y el contador se configura como descendente encambio
//         si el switch esta abierto se lee por el pin A0 del porta un '1'
//         logico(pin A0 high) por lo tanto el contador se configura como ascendente
//
//   Conexiones:      A0 -> switch       a
//               B0 -> a 7seg           ____
//               B1 -> b 7seg        f  |    | b
//               B2 -> c 7seg           | g  |
//               B3 -> d 7seg            ----
//               B4 -> e 7seg        e  |    | c
//               B5 -> f 7seg           |____|
//               B6 -> g 7seg             d
//////////////////////////////////////////////////////////////////////////////////

#include <16f648a.h>         //pic a utilizar          
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6)
#use standard_io(A)

///DECLARACION DE FUNCIONES
void up(void);      //funcion cuenta ascendente
void down(void);   //funcion cuenta descendente

///DECLARACION VARIABLES GLOBALES
signed char i;   //contador para tabla 7 seg (se tiene en cuenta el signo)
int tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};   //7seg hex 0-9
      
///PROGRAMA
void main(void)
{
   set_tris_a(0xFF);            //porta como entrada   
   set_tris_b(0x00);            //portb como salida
   disable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
///inicializamos el contador   
   if(!input(PIN_A0))      //para ello leemos el estado del pin A0 del porta
      i=10;            //contador descendente
   else
      i=-1;            //contador ascendente

   do{               //bucle...
      if(input(PIN_A0))         //¿switch abierto?
         up();         //SI -> contador ascendente
      else
         down();         //NO -> contador descendente
         
      output_b(tab7seg);      //muestra por portb digito 7 segmentos
      delay_ms(500);
      }while(TRUE);         //...infinito         
}

void up(void)               //funcion cuenta ascendente
{         
      i++;            //incremento contador para visualizar siguiente digito
      if(i>9)            //¿ya se ha mostrado el digito 9?
         i=0;         //SI -> vuelve a empezar(digito 0)         
}

void down(void)               //funcion cuenta descendente
{
      i--;            //decremento contador para visualizar siguiente digito
      if(i==-1)            //¿ya se ha mostrado el digito 0?
         i=9;         //SI -> vuelve a empezar(digito 9)
}


Desconectado ronny22

  • PIC10
  • *
  • Mensajes: 13
Re: Contador acendente y descendente en CCS con LCD ayuda
« Respuesta #5 en: 02 de Julio de 2009, 23:18:35 »
hola nuevamente Twistek.

logre hacer algo parecido a lo que tu necesitas.es un contador de 0-255 con una lcd.

funciona asi: al pulsar el pulsador conectado en RA0 se incrementa la cuenta por la lcd,al dejar de pulsarlo se queda estatico el conteo, luego al pulsar el pulsador conectado en RA1 se decrementa la cuenta y al dejar de pulsarlo se queda igual estatica la cuenta,pero no se si en en realidad es lo que necesitas, entonces te pedire mas detalles sobre tu proyecto a ver si te puedo ayudar con algo mas, no me queda bien claro lo que expones arriba. especifica un poco mas en el sentido que:

1) al pulsar P1 q esta conectado en RA0 el debe contar hasta cuando????, es decir el debe contar hasta que encuentre otro pulsador o hasta que se detenga que?, explicame un poco mas eso.

2) al pulsar P2 que estara conectado en RA1 el conteo debe hacerse hasta cero "0" ????? solo eso?, por eso te pido un poco mas de info quede confundido con tu explicacion.

pd: bueno si necesitas el programa que hice avisame y lo posteo.saludos

Desconectado Twistek

  • PIC10
  • *
  • Mensajes: 13
Re: Contador acendente y descendente en CCS con LCD ayuda
« Respuesta #6 en: 02 de Agosto de 2009, 22:00:46 »
disculpa por la tardansa pero ya no pude avanzar el proyecto por las vacaciones y el servicio social, pero bueno , como dices necesito que incremente hasta 999 , pulsando un boton igual como dices, y que cuando quiera pueda decender con otro boton, hasta llegar a 0 , pero que cuando llegue a cero ahi se quede. mira logre hacer este y funciono pero quisa me falta optimizarlo.


#include "C:\Documents and Settings\Usuario\Mis documentos\Mis vídeos\practicas\LCD\contador.h"


void main(void)
{
char i=1,x=0; //tabla y variable definida

lcd_init(); //inicializa lcd
printf(lcd_putc,"   BIENVENIDO\n    BUEN DIA" ); //muestra mensaje inicio
delay_ms(200);

printf(lcd_putc,"\f" ); //...para borrar pantalla e iniciar contador

printf(lcd_putc,"PROFUNDIDAD= 0\nDISTANCIA EN MTS" ); //auto publicidad en la 2ºfila lcd
lcd_gotoxy(14,1); //vuelve 1ºfila lcd y apunta la mitad de la columna

for( ; ; )
{
   if(input(PIN_A0))
   { //¿se ha pulsado el boton?
     
      while(input(PIN_A0)); //...rebotes del boton
      {
      if(x==2)
      {
      x=0;
      if(i>=999)
      { //¿se ha mostrado digito 9?
         printf(lcd_putc,"\f" );
         printf(lcd_putc,"PROFUNDIDAD=\nDISTANCIA EN MTS" );
         i=0; //SI -> restaura valor indice(para mostrar digito 0)
      }
      else
      {
      lcd_gotoxy(14,1);
      printf(lcd_putc,"%u", i ); //muestra por pantalla el numero
      //retrasa el cursor una posicion(escribe encima)
      }
      i++;//incremento contador indice tabNum
      }else x++;
      }
   }
   else if(input(PIN_A1))
   { //¿se ha pulsado el boton?
     
      printf(lcd_putc,"\nDISTANCIA EN MTS" ); //auto publicidad en la 2ºfila lcd
     
      while(input(PIN_A1)); //...rebotes del boton
      {
     
      if(x==2)
      {
      x=0;
      if(i==0)
      {
       printf(lcd_putc,"\f" );//¿se ha mostrado digito 9?
       lcd_gotoxy(1,1); //vuelve 1ºfila lcd y apunta la mitad de la columna
         printf(lcd_putc,"PROFUNDIDAD= %u", i );
         printf(lcd_putc,"\nDISTANCIA EN MTS" );
         //AQUI APAGA LA madre
         i=0; //SI -> restaura valor indice(para mostrar digito 0)
         break;
      }
      else
      {
      lcd_gotoxy(1,1);
       printf(lcd_putc,"\f" );//¿se ha mostrado digito 9?
      printf(lcd_putc,"PROFUNDIDAD= %u", i ); //muestra por pantalla el numero
      printf(lcd_putc,"\nDISTANCIA EN MTS" );
      //retrasa el cursor una posicion(escribe encima)
      }
      i--; //incremento contador indice tabNum
      }else x++;
      }
   }
} //...infinito

}


 

anything