ARM-Linux按键和旋钮控制

前言:按键两线,旋钮三线;两个按钮连接IO4、5,一个旋钮连接IO5、6和地

旋钮编码器工作原理:

如果输出1引脚为高电平时,输出2引脚出现一个高电平,这时开关就是向顺时针旋转;
当输出1引脚为高电平,输出2引脚出现一个低电平,这时就一定是逆时针方向旋转。

代码:

int Thread_Key::keyScan()
{
    static int key  = 1;
    static int knob = 1,knob_status = 0;
/*key为是否接收按键状态
 *knob为是否旋钮的两个引脚都为高电平(低电平)
 *knob_status记录电平跳变结束时的状态
*/
    int rc;
    dwPinState = 0x000000F0;
    //按钮和旋钮只占32bitGPIO的4~7bit
    rc = GPIO_PinState(fd_gpio, &dwPinState);//读取状态
    if(rc < 0)
    {
       qCritical("thread_key.cpp--->GPIO_PinState::failed %d\n", rc);
    }
    key_return  = (dwPinState)&(GPIO_KET_RETURN);   //GPIO4
    key_set     = (dwPinState)&(GPIO_KEY_SET);
    switcha     = (dwPinState)&(GPIO_KEY_SWITCHA);
    switchb     = (dwPinState)&(GPIO_KEY_SWITCHB);  //GPIO7

    //按键
    if((key) && ((key_return == 0)||(key_set == 0)) )
    {
        usleep(10000);//延时10ms
        if( (key) && ((key_return==0||key_set==0)) )
        {
            key=0;
            if(key_return==0)
            {
                return KEY_RETURN_SHORT;
            }else if(key_set==0)
            {
                return KEY_SET_SHORT;
            }
        }
    }else if((!key) && ((key_return==0x10) && (key_set==0x20)) )
    {
        usleep(10000);//延时10ms
        if( key_return==0x10 && key_set==0x20)
        {
            key = 1;
        }
    }
    //由此可见,如果输出1为高电平时,输出2出现一个高电平,这时开关就是向顺时针旋转;
    //当输出1 为高电平,输出2出现一个低电平,这时就一定是逆时针方向旋转。
    //旋钮
    if((switcha == 0) && (switchb == 0))//统一为高电平(低电平)
    {
        //记录knob = 1;
        knob = 1;
        knob_status = 0;//清空最后跳变的状态值
    }
    if((knob) && ((switcha == 0) && (switchb == 0x80)) )//引脚一高一低
    {
        knob_status = KEY_Left;//左旋
    }else if((knob) && ((switcha == 0x40) && (switchb == 0)) )//引脚一低一高
    {
        knob_status = KEY_Right;//右旋
    }

    if((knob) && ((switcha == 0x40) && (switchb == 0x80)) )//统一低电平(高电平)还原状态
    {
        knob = 0;
        return knob_status;
    }

    return 0;
}

 

总结:活用标志量

 

 

 

 






posted @ 2020-04-16 14:17  硕果磊磊  阅读(828)  评论(0编辑  收藏  举报