Cambio de estado de un boton por mas de 1 segundo

#1
Hola que tal es mi primer foro y tengo una práctica bastante confusa, estoy iniciando con PIC16F1939 y CCS Compiler.
Mi pregunta es:
Como cambiar de estado si dejo presionado un botón 1 segundo pero si lo pulso rápidamente sea otro estado diferente
Para explicarme mejor
Si el botón pulsado = 1 me mande al esta A
Pero si el botón se pulso más de 1 seg pase al estado B sin pasar por A
Espero puedan ayudarme
 
#3
Digamos que me encuentro en un estado A
Si yo pulsara el botón rápidamente me mande al estado B
Pero si dejo presionado el botón mas de 1 segundo paso a C
A eso me refiero con los estados
 
#5
CSS:
#include <16F1939.h>
#include "PLD.h"

//Entradas
#define     clk     T2       //Frecuencia Led
#define     x       T5       //Entrada botón
#define     x_ck    T4     //Retraso del  botón
#define     ctr     T3      //Comparador de tiempo

//Salidas
#define     A      T30      // Contadores de estados 
#define     B      T29      // 00 : 01 : 10 : 11
#define     L      T27      //Salida 
#define     x_ckt   T25  //Señal retrasada del boton
#define     ctrt    T23    //"""

short At=0, Bt=0;     //Variables retrasadas

void main()
{
    
    pld_ini();      //Ejecuta mi tarjeta como un PIC
   // pld_555(10.0); Funcion que ocupare despues
    
          while(true)
        {
            
            x_ckt=x;
            
            if(!x_ck)
            {
                At=x&(!A&B)|x&(A&!B);
                Bt=x&!B;
            }
            else
            {
                A=At;
                B=Bt;
            }
            
            if(A==1 && B==0)
            {
                ctrt=1;
                while(ctr)
                {
                    pld_555(20.0);
                    L=clk;
                }
                
            }
            
          
        }
}
 
#6
Mi pregunta es:
Cómo cambiar de estado si dejo presionado un botón 1 segundo, pero si lo pulso rápidamente sea otro estado diferente
Para explicarme mejor:
Si el botón pulsado = 1 me mande al estado A
Pero si el botón se pulsó más de 1 segundo, pase al estado B sin pasar por A
Con la instrucción while se puede lograr.
Por ejemplo, algo sencillo:
C:
void main (void)
{
    int16 contador = 1, m_segs = 1500;        // Variables

    while (TRUE)
    {
        while (!input_state(pulsador))        // Mientras el pulsador está en 0
        {
            contador++;                        // Incrementar contador
            delay_ms(1);                    // Retardo de 1 milisegundo
            
            if (contador > m_segs)            // Si contador > m_segundos
            {
                contador = 0;
                hago_una_cosa();
            }
            else
                hago_otra_cosa();
            
            if (input_state(pulsador))            // Si el pulsador está en 1
            {
                algo_extra();
            }
        }
    }
}
 

Arriba