Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Twistek en 27 de Junio de 2009, 21:53:06
Título: Contador acendente y descendente en CCS con LCD ayuda
Publicado por: Twistek 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
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)
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:
Título: Re: Contador acendente y descendente en CCS con LCD ayuda
Publicado por: ronny22 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
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) }
Título: Re: Contador acendente y descendente en CCS con LCD ayuda
Publicado por: ronny22 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
Título: Re: Contador acendente y descendente en CCS con LCD ayuda
Publicado por: Twistek 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
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