Busco ejemplo cambio de rutinas con pulsadores

#1
Hola amigos, ando buscando un ejemplo en C para CCS de cambio de rutinas con dos pulsadores, uno incrementa y el otro decrementa.
Seria algo asi:

inicio en rutina 0:
activo salida x
espero x tiempo
apago salida x

si se pulsa un pulsador, avanzo a retrocedo.

rutina 1:
activo salida x
espero x tiempo
apago salida x

si se pulsa un pulsador, avanzo a retrocedo.

Hice una con switch, case y break, pero se repite la rutina una y otra vez hasta pasar a la siguiente o anterior.
Espero me tiren algo como para ver. Saludos y gracias.
 
#2
Hola amigos, ando buscando un ejemplo en C para CCS de cambio de rutinas con dos pulsadores, uno incrementa y el otro decrementa.
Seria algo asi:

inicio en rutina 0:
activo salida x
espero x tiempo
apago salida x

si se pulsa un pulsador, avanzo a retrocedo.

rutina 1:
activo salida x
espero x tiempo
apago salida x

si se pulsa un pulsador, avanzo a retrocedo.

Hice una con switch, case y break, pero se repite la rutina una y otra vez hasta pasar a la siguiente o anterior.
Espero me tiren algo como para ver. Saludos y gracias.
Aqui hay un ejemplo de como manejar los botones:

Código:
do {
  if (Button(&PORTB, 0, 1, 1)) oldstate = 1;
  if (oldstate && Button(&PORTB, 0, 1, 0)) {
    PORTD = ~PORTD;
    oldstate = 0;
  }
} while(1);
En este ejemplo se lee RB0, en donde esta conectado una botonera; En la transicion de 1 a 0 (cuando se suelta la botonera), PORTD se invierte.

Si puedes postea lo que hiciste, para ayudarte mas.

Saludos
 
#3
Gracias por tu ayuda.
Aca pongo parte del codigo, no lo tenia en el momento:



void main() {
char item;
char n_menus = 3;
lcd_init();

while(1){
if(input(pin_a0)){
item++;
delay_ms (300);
lcd_putc("\f"); }

if(input(pin_a2)){
item--;
delay_ms (300);
lcd_putc("\f"); }

if (item>(n_menus-1)){
item=0; }



switch (item) {

case 0:

lcd_gotoxy(1,1);
lcd_putc (" primera ");
lcd_gotoxy(4,2);
lcd_putc ("xxxx");
output_c(0b00100100);
delay_ms(500);
output_c(0b00100000);
delay_ms(500);
output_c(0b00000000); /
break;
case 1:

lcd_gotoxy(4,1);
lcd_putc (" segunda ");
lcd_gotoxy(4,2);
lcd_putc ("xxxx");
output_c(0b00000101);
delay_ms(500);
output_c(0b00100000);
delay_ms(500);
output_c(0b00000000);
break;
case 2:

lcd_gotoxy(4,1);
lcd_putc ("tercera");
lcd_gotoxy(4,2);
lcd_putc ("xxccc");
output_c(0b00000110);
delay_ms(500);
output_c(0b00100000);
delay_ms(500);
output_c(0b00000000);
break;
}

Como decia, la secuencia se repite en lugar de ejecutarce solo una ves como quiero, hasta que se oprima un pulsador + o -.
 
#6
con interrupciones se puede hacer... pero si ninca has trabajado con ellas pueden ser un dolor de cabeza..
mira que tienes un lazo infinito while(1) que la verdad, no se donde termina xq le faltan parentesis... si especificas que es lo que quieres que se repita y que no.. seria mejor
 
#7
No me percate de eso del while, voy a chequearlo.
No quiero que se repita nada, solo que ejecute cualquier CASE y se detenga en break al a espera de que se presione un pulsador.
Edit, lo del parentesis es un error del copy paste.
 
Última edición:
#8
creo que ya se porque se repite... lo que pasa es que a lo que se llena un valor al item, ya sea 0,1 o 2, se ejecuta el case, pero el valor de item sigue manteniendose por lo que vuelve a entrar en el mismo case una y otra vez, trata de ponerle un valor default al switch y al salir del switch, cambia el valor de item por uno que sea default para que no entre en ningun case.. me entiendes?
 
#11
Lo hice yo. No me preocupa que sea un codigo feo, solo quiero que funcione como yo quiero.Uso el ccs.
Lei el enlace, pero no le encuentro uso al default.
Estoy viendo de utilizar GOTO.
Gracias.
 
#12
si puedes trata de agregar comentarios a lo que hayas hecho para asi entender mejor, si usas proteus, puedes pasarme el esquematico con el archivo .hex para revisar y poder ayudarte mejor..
saludos
 
#13
Ok. Gracias por ofrecer tu ayuda.
Aca subo los archivos, las salidas parecen un arbolito de navidad, yo quiero que enciendan solo una ves y quede leyendo los pulsadores.
El encendido de las salidas es cualquier cosa, solo estan a modo de ejemplo.
 

Adjuntos

#14
No te entiendo todavia, lo que quieres es que se borre la pantalla del LCD y que no permanezca encendida mostrando el resultado anterior??? es eso???
Podrias poner exactamente lo que quieres que haga el circuito???
 
#15
No. El displey que quede marcando el resultado(en realidad luego lo voy a reemplazar por uno led 7seg), pero que las salidas se enciendan en la secuencia predeterminada solo una vez, que al llegar al break queden apagadas y no que vuelvan a encenderce una y otra y otra vez. Saludos.
 
#16
De cual salida hablas???? de que puerto???
Si puedes ir avanzando anda haciendo el cambio de LCD a lo del display de 7 seg...
Todavia no me aclaras bien lo que quieres hacer...
Segun parece una simulacion de un automovil...
 
#20
Mira, estoy de apuro... no se si esto funcione.... y no es la forma mas elegante de hacerlo...
No lo compil porque no tengo ese programa, y lo programe a ciegas y bien rapido, asi que no se si funcione como tu quieres, pero pruebalo, y si no funciona, mandame la simulacion a ver que mismo salio...
Saludos

Código:
#include <16f886.h>
#fuses NOWDT,MCLR,PUT,NOLVP,INTRC_IO,PROTECT,
#use delay(clock=4000000)
 #include <LCD3.c>
    

    #use standard_io (C)
    #use standard_io (A)
    
    
     void main() {
     char item;
     char n_menus = 4;
     bit b=1; //Si b=1 nos va a indicar que es la primera vez, si b=0 no es la primera vez
     lcd_init();
     
 while(true){
  if(input(pin_a0)){
   item++;
   delay_ms (300);
   lcd_putc("\f");
   b=1; }
  
  if(input(pin_a2)){
   item--;
   delay_ms (300);
   lcd_putc("\f");
   b=1; }
  
   
   if(item>4){item=4;}
   //if(item<255){item=0;}
   if (item>(n_menus-1)){
   item=0;  }
  
 
   
 switch (item) {
  
   case 0:
   
   lcd_gotoxy(1,1);
   lcd_putc ("  neutro   ");
    lcd_gotoxy(4,2);
    lcd_putc ("xxxx");
    if(b==1){
    output_c(0b00011000); //
    delay_ms(500);
    output_c(0b00000000); //
    }
   break;
   
   case 1:
    
   lcd_gotoxy(1,1);
   lcd_putc ("   primera    ");
    lcd_gotoxy(4,2);
    lcd_putc ("xxxx");
    if(b==1){
    output_c(0b00000100); //
    delay_ms(500);
    output_c(0b00100000); //
    delay_ms(500);
    output_c(0b00000000); //
    }
    break;
    case 2:
    
    lcd_gotoxy(4,1);
    lcd_putc (" segunda ");
    lcd_gotoxy(4,2);
    lcd_putc ("xxxx");
    if(b==1){
    output_c(0b11000000);
    delay_ms(500);
    output_c(0b00000000);
    delay_ms(500);
    }
    break;
    case 3:
    
    lcd_gotoxy(4,1);
    lcd_putc ("tercera");
    lcd_gotoxy(4,2);
    lcd_putc ("xxccc");
    if(b==1){
    output_c(0b11000111);
    delay_ms(500);
    output_c(0b00000000);
    delay_ms(500);
    }
    break;
    
     }
     b=0;
   }
   }
 
Arriba