按键控制(三)

K1:双击+长按有效,按任意键取消
K2:双击+长按有效,按任意键取消
K3:双击+长按有效,按任意键取消
K4:双击+长按有效,按任意键取消
K5:双击+长按有效,按任意键取消
K6:双击+长按有效,按任意键取消
K7:双击+长按有效,按任意键取消
K8:双击+长按有效,按任意键取消
K9:双击+长按有效,按任意键取消
K10:双击+长按有效,按任意键取消
K11:双击有效,长按不管用。点击自身取消
加组合按键使用方法

//KEY值
typedef enum  
{
    DEVICE_ON_OFF = 101, //设备开关
    KEY_HEAD_UP  = 1,
    KEY_HEAD_DOWN ,
    KEY_FOOT_UP ,
    KEY_FOOT_DOWN ,
    KEY_LEFT_RUN,
    KEY_RIGHT_RUN,    
    KEY_BED_UP ,
    KEY_BED_DOWN,
    KEY_ROLL,
    KEY_RETURNROLL,
    
    KEY_FLAT,
    
    KEY_LEFT_AUTO1,
    KEY_LEFT_AUTO2,
    KEY_LEFT_AUTO3,
    KEY_LEFT_AUTO4,
    
    KEY_RIGHT_AUTO1,
    KEY_RIGHT_AUTO2,
    KEY_RIGHT_AUTO3,
    KEY_RIGHT_AUTO4,

    KEY_LEFT_AUTO_ESC,
    KEY_RIGHT_AUTO_ESC,
    KEY_AUTO_ESC,
    
    KEY_MAX = 200
}KEY_VALUE;

/*
* 描述: 按键检测分析
* 参数: 无
* 返回: 无*/
void GetKey_Scanf(void)
{
    if(1 == Key_Down_Num())
    {
        old_key_value = key_value;
        key_value = 0;
        switch(key_state)
        {
            case KEY1_STATE_VALUE:
            {
                key_value = KEY_LEFT_RUN;
            }break;
            case KEY2_STATE_VALUE:
            {
                key_value = KEY_RIGHT_RUN;
            }break;
            case KEY3_STATE_VALUE:
            {
                key_value = KEY_HEAD_UP;
            }break;
            case KEY4_STATE_VALUE:
            {
                key_value = KEY_HEAD_DOWN;
            }break;
            case KEY5_STATE_VALUE:
            {
                key_value = KEY_FOOT_UP;
            }break;
            case KEY6_STATE_VALUE:
            {
                key_value = KEY_FOOT_DOWN;
            }break;
            case KEY7_STATE_VALUE:
            {
                key_value = KEY_BED_UP;
            }break;
            case KEY8_STATE_VALUE:
            {
                key_value = KEY_BED_DOWN;
            }break;
            case KEY9_STATE_VALUE:
            {
                key_value = KEY_ROLL;
            }break;
            case KEY10_STATE_VALUE:
            {
                key_value = KEY_RETURNROLL;
            }break;
            case KEY11_STATE_VALUE:
            {
                key_value = KEY_FLAT;
            }break;
      
            //左侧自动翻身组合键
            case (KEY1_STATE_VALUE|KEY3_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO1;
            }break;
            case (KEY1_STATE_VALUE|KEY4_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO1;
            }break;
            case (KEY1_STATE_VALUE|KEY5_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO2;
            }break;
            case (KEY1_STATE_VALUE|KEY6_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO2;
            }break;
            case (KEY1_STATE_VALUE|KEY7_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO3;
            }break;
            case (KEY1_STATE_VALUE|KEY8_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO3;
            }break;
            case (KEY1_STATE_VALUE|KEY9_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO4;
            }break;
            case (KEY1_STATE_VALUE|KEY10_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO4;
            }break;
            //右侧自动翻身组合键
            case (KEY2_STATE_VALUE|KEY3_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO1;
            }break;
            case (KEY2_STATE_VALUE|KEY4_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO1;
            }break;
            case (KEY2_STATE_VALUE|KEY5_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO2;
            }break;
            case (KEY2_STATE_VALUE|KEY6_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO2;
            }break;
            case (KEY2_STATE_VALUE|KEY7_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO3;
            }break;
            case (KEY2_STATE_VALUE|KEY8_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO3;
            }break;
            case (KEY2_STATE_VALUE|KEY9_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO4;
            }break;
            case (KEY2_STATE_VALUE|KEY10_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO4;
            }break;
            //取消自动翻身
            case (KEY1_STATE_VALUE|KEY11_STATE_VALUE): //取消左侧自动翻身
            {
                key_value = KEY_LEFT_AUTO_ESC;
            }break;
            case (KEY2_STATE_VALUE|KEY11_STATE_VALUE): //取消右侧自动翻身
            {
                key_value = KEY_RIGHT_AUTO_ESC;
            }break;
            default:{}break;
        }        
        //记录按键按下次数
        if(0 == key_down_flag)
        {
            key_down_count_flag ++; //记录按键按下次数
        }        
        key_down_flag = 1;
    //如果开始自动翻转
        if(auto_turn_flag != 0)
        {
            if(key_value>=KEY_HEAD_UP && key_value<=KEY_RETURNROLL)
            {
                key_value = 0;
                key_ture_value = 0;
                key_down_count_flag = 0;
                key_down_flag = 0;
            }
        }        
    }
    else
    {
        key_down_flag = 0;
    }
}


/*
*描述:判断是否是有效键值
*参数:无
*返回值:无
*/
void GetKey_True_Touch(void)
{    
    //单击
    if(1 == key_down_count_flag)//只按下一次
    {
        if(0 == key_down_flag) //松开
        {
            if(0 == key_ture_value)
            {
                if(key_down_time>=KEY_TWO_TOUCH_TIME) //松开按键时间
                {
                    key_down_count_flag = 0;
                    key_down_time = 0;
                }
            }
            else  //长按松开后 立马停止
            {
                key_ture_value = 0;
                key_down_count_flag = 0;
                key_down_time = 0;
            }
        }
        else  //一直按着
        {
            if(key_down_time>=KEY_LONG_TOUCH_TIME) //松开按键时间
            {
                if(key_value!=KEY_FLAT) //长按不管用
                {
                    key_ture_value = key_value;
                }
                else
                {
                    key_ture_value = KEY_AUTO_ESC;
                }
            }
            else //双击后 再次按下按键  立马停止
            {
                //去掉此处,双击可以直接切换;加上此处,必须先打断再次双击(既  要点击三次才可以切换别的指令)
                if(key_ture_value != 0)     
                {
                    if(key_ture_value == KEY_FLAT)
                    {
                        if(key_value == KEY_FLAT) //关闭自己和自动翻身
                        {
                            key_ture_value = 0;
              
                        }
                    }
                    else
                    {
                        key_ture_value = 0;
                    }
                    key_down_count_flag = 0;
                    key_down_time = 0;
                }
            }
        }
    }
    //双击
    if(2 == key_down_count_flag) //按键按下两次
    {
        if(old_key_value == key_value)  //两次按下的是同一个按键
        {
            if(key_ture_value != KEY_FLAT)
            {
                key_ture_value = key_value;
            }
            key_down_count_flag = 0;//两次一样,清除计数
        }
        else
        {
            key_ture_value = 0;
            key_down_count_flag = 1; //两次不一样,记录次数为1,比如第一次点按键1,然后接着点两下按键2,则按键2有效
        }
        key_down_time = 0;
        while(Key_Down_Num()){Delay_Ms(20);}; //等待按键释放
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基本的STM32F103代码,用两个按键控制个灯: 首先,需要将两个按键和个LED引脚与STM32F103的GPIO端口相连。例如,将两个按键分别连接到PA0和PA1引脚,将个LED分别连接到PB0、PB1和PB2引脚。 然后,在代码中需要初始化GPIO端口,将PA0和PA1配置为输入模式,将PB0、PB1和PB2配置为输出模式。代码如下: ``` #include "stm32f10x.h" void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOA and GPIOB clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); /* Configure PA0 and PA1 as input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure PB0, PB1 and PB2 as output */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } ``` 接下来,在主函数中需要不断循环读取PA0和PA1的状态,根据状态控制PB0、PB1和PB2的输出。代码如下: ``` int main(void) { GPIO_Configuration(); while (1) { /* Read PA0 and PA1 */ uint8_t button1 = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0); uint8_t button2 = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1); /* Control PB0, PB1 and PB2 */ if (button1 && button2) // Both buttons pressed { GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2); } else if (button1) // Button 1 pressed { GPIO_SetBits(GPIOB, GPIO_Pin_0); GPIO_ResetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_2); } else if (button2) // Button 2 pressed { GPIO_SetBits(GPIOB, GPIO_Pin_1); GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_2); } else // Both buttons not pressed { GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2); } } } ``` 这段代码中,如果两个按键都被按下,则个LED都会亮;如果只有第一个按键被按下,则只有第一个LED亮;如果只有第二个按键被按下,则只有第二个LED亮;如果两个按键都没有被按下,则个LED都不亮。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值