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; }
总结:活用标志量