TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: japifer_22 en 25 de Junio de 2008, 02:29:02
-
hola como estan bueno aqui les dejo 2 programas que cuentan de 0 asta 99999 uno es con LCD y el otro con display de 7 segmento ambos tienen boton de reset y otro para contar. espero que les sirva.
en el archivo que les adjunto estan los dos cirtcuitos.
-
hola soy nuevo en esto de los pics y en CCS, tu programa funciona muy bien, pero me gustaria que me ayudaras a hacer uno como el tuyo que cuente hasta 999 y que cuando este en algun numero, con el PIN_A1 puedas descender hasta llegar a 0. que sea acsendente y descendente. pero cuando llegue a 0 se detenga.
me puedes ayudar porfavor.
//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
}
-
hola Twistek sorry por la demora pero ya te hice el programa 3 digitos que cuenta tanto asendente como desendente como lo pediste espero quete sirva tedejo el C+hex+la simulacion en proteus saludos.
#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
///DECLARACION DE FUNCIONES
void asendente(void); //funcion cuenta ascendente
void desendente(void); //funcion cuenta descendente
///DECLARACION VARIABLES GLOBALE
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
///PROGRAMA
void main(void)
{
lcd_init(); //inicializa lcd
disable_interrupts(GLOBAL); //todas las interrupciones desactivadas
///inicializamos el contador
do{ //bucle...
if(!input(PIN_A0)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A0)); //...rebotes del boton
asendente(); //SI -> contador ascendente
}
if(!input(PIN_A1)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A1)); //...rebotes del boton
desendente(); //NO -> contador descendente
}
printf(lcd_putc,"%c%c%c",tabNum[h],tabNum[j],tabNum[i]); //muestra por pantalla el numero
printf(lcd_putc,"\b\b\b"); //retrasa el cursor una posicion(escribe encima)
lcd_gotoxy(1,1); //vuelve 1ºfila lcd y apunta la mitad de la columna
printf(lcd_putc,"japifer_22."); //auto publicidad en la 2ºfila lcd
lcd_gotoxy(1,2); //vuelve 1ºfila lcd y apunta la mitad de la columna
}while(TRUE); //...infinito
}
void asendente(void) //funcion cuenta ascendente
{
i++; //incremento contador para visualizar siguiente digito
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;
output_high(PIN_B3);
delay_ms(100);
}}}
//incremento contador indice tabNum
void desendente(void) //funcion cuenta descendente
{
i--; //decremento contador para visualizar siguiente digito
if(i==-1){
i=9;
j--;
if(j==-1){
j=9;
h--;}
if(h==-1){
h=9;}}
}
-
hola de nuevo le hice una mejorita que cuando llega a 000 se quede hay y cuando llege a 999 no pase a 000 sino que se quede en 999. saludos
-
Hola primero que nada gracias por contestar, pero antes logre hacer este aunque no esta muy bien pero funciona. Me podrias ayudar a hacerle un cambio al tuyo, pues veras lo necesito que cada 3 pulsos en el A0 me de un numero en el LCD e igual que cada 3 pulsos en el A1 me decienda, porque cada 3 pulsos de lo que necesito es un metro. si me puedes modificar eso en el tuyo haber si queda mejor que el que logre hacer, como vez. gracias
#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,"\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( ; ; )
{
if(input(PIN_A0))
{ //¿se ha pulsado el boton?
while(input(PIN_A0)); //...rebotes del boton
{
if(x==2)
{
x=0;
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)
}
else
{
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
}else x++;
}
}
else if(input(PIN_A1))
{ //¿se ha pulsado el boton?
printf(lcd_putc,"\f" );
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
while(input(PIN_A1)); //...rebotes del boton
{
if(x==2)
{
x=0;
if(i==0)
{ //¿se ha mostrado digito 9?
printf(lcd_putc,"%u", i );
printf(lcd_putc,"\nDISTANCIA EN MTS" );
//AQUI APAGA LA madre
i=0; //SI -> restaura valor indice(para mostrar digito 0)
}
else
{
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
}else x++;
}
}
} //...infinito
}
-
listo toma espero que te sea util cada 3 pulsos se visualisa eldigito,ya sea para incrementar o decrementar.
salu2s
-
a muchas gracias funciona bien solo me falta calarlo ya en el pic , lo voy a poner en el 16f84a esto era lo que yo habia logrado, pero quiza faltaba obtimizarlo
#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
}
-
Disculpa pero con que software puedo simular tus programas? me serian de gran utilidad
-
Disculpa pero con que software puedo simular tus programas? me serian de gran utilidad
proteus....pero los displays de 7 digitos no se visualiza bien
-
japifer_22 primero que nada hola.
Tengo un problema, necesito tu contador de 5 digitos ascendente y descendente pero con unas características diferentes y como todavia no se nada de pics no se por donde arrancar.
una de las diferencias es que el bit menos significativo necesito que vaya de 5 en 5 (00000-00005-00010-00015...99995-00000) para los dos lados y la mas importante que necesito es que el clock lo determino por un led infrarojo y un fotodiodo, osea, cuando nada interfiere la iluminación tira un pulso, se corta el az y luego se ilumina nuevamente para el siguiente pulso.
ademas, tengo un boton de encendido, uno de reset, uno que me deje enclavado el valor (por mas que sigan los pulsos, que no cuente) y uno selector de up/down...
Se que pido mucho pero no se como comenzar :( y estaria muy agradecido si me das alguna solución.
Disculpa las molestias y muchas gracias desde ya.
-
buenas amigo el contador de lcd en lo fisico no me funciona sera el quemador que tengo es pickit2 clone alguien me puede ayudar gracias