zoukankan      html  css  js  c++  java
  • 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
    ", 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;
    }

    总结:活用标志量






  • 相关阅读:
    luogu 1593
    luogu 1369
    hdu 1796
    bzoj 3398
    luogu 4587
    luogu 2152
    bzoj 3629
    bzoj 1507: [NOI2003]Editor
    bzoj 1503: [NOI2004]郁闷的出纳员
    bzoj 1497: [NOI2006]最大获利
  • 原文地址:https://www.cnblogs.com/shuoguoleilei/p/12712568.html
Copyright © 2011-2022 走看看