Orden de pulsación de botones

Hola a todos, estoy programando un potenciómetro digital basado en un PWM de 1024 valores y un filtro rc.
Tengo 8 botones, cada uno con un Duty diferente del PWM. Lo que necesito es que siempre se asigne el valor del ultimo botón pulsado aunque sea manteniendo los anteriores pulsados, me explico:

Si pulso el botón 1, se asigna el duty de ese botón. Si mantengo pulsado el 1 y pulso el 2, el duty valido será el del botón 2, aun teniendo pulsado el 1. Al soltar el 2, volvería a mantener el valor del primer botón y así sucesivamente aun pulsando 5 botones.


He hecho algo raro con una OR, pero no se si estoy cerca de la solución, si estoy yendo por el camino equivocado, si hay alguna función para esto... o no se, estoy bastante confuso y he hecho miles de pruebas. Os agradecería si alguien puede echarme un mano.

Pongo el código por si os da una idea.

Muchas gracias de antemano!

Utilizo el compilador CCS.
Código:
 if (check==1){
               check=0;                
               portb2=portb;
               portb=portb^banterior;

                   }
        else
               portb = input_b();
 
     
     
     switch (portb)  {

          case 0b00000001:{
                
           if (portb==banterior){  
           portb2=portb;
            }
           else{
            set_pwm1_duty(nota3);
            banterior=portb;
            }
           break;}
          
         case 0b00000010:{
           if (portb==banterior)  {
           portb2=portb;
            }
           else{
           set_pwm1_duty(nota6);
           banterior=portb;
           }
         break;}
           
         case 0b00000100:{
           if (portb==banterior){
           portb2=portb;
           }
           else{
           set_pwm1_duty(nota8);
           banterior=portb;
           }
          break;}
         
         case 0b00001000:{
           if (portb==banterior){
           portb2=portb;
           }
           else{
           set_pwm1_duty(nota9);
           banterior=portb;
           }
           break;}      
         
         case 0b00010000:{
           if (portb==banterior){
           portb2=portb;
           }
           else{
           set_pwm1_duty(nota10);
           banterior=portb;
           }
           break;}
         
         case 0b00100000:{
           if (portb==banterior) {  
           portb2=portb;
           }
           else{
           set_pwm1_duty(nota13);
           banterior=portb;
           }       
           break;}
           
         case 0b01000000:{
           if (portb==banterior){   
           banterior=portb;
           portb2=portb;
           }
           else{
           set_pwm1_duty(nota14);
           banterior=portb;
           } 
           break;}
           
         case 0b10000000:{
           if (portb==banterior){  
           portb2=portb;
           }
           else{
           set_pwm1_duty(nota8);
           banterior=portb;
           }             
           break;}
         
         default:{
           if (portb==0b00000000){
               portb2=portb;
               break;}
           else{
             
           if (portb==portb2){  
               check=0;
               break;}
           else{
               check=1;
               break;}
               }
             }
  }

     
   

}
 
¿Y por que no haces un if para comprobar el estado bit a bit del portb empezando por el valor más alto?
if (INPUT(PIN_B7) == 1) { loquequieras(); }
Espero haber entendido bien tu necesidad. Saludos
 
Hola:

Se me ocurre guardar el estado del PORTB en una variable cada vez que hay un cambio, este cambio seria un paso de un flanco a otro sin importar el pin. Cuando sucede, el valor del PORTB lo comparas con la variable entonces:

if(VAR != PORTB)
{
// Hay cambio...
// - busca el pin que a cambiado comparando bit a bit
// entre VAR y el PORTB.
// - cuando encuentre el bit, revisa si el bit es 0/1 y de acuerdo a eso ejecuta o no el código
// asignado a ese pin.
// - Luego guardas el valor del PORTB en VAR
// y espera para un proximo cambio.
}

Espero me entiendas

Un saludo.
 
Atrás
Arriba