求帮忙看一下这段实战篇按键的代码

2019-07-20 05:45发布

u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);//去抖动
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0; //无按键按下
}  


这段代码是开发板实战篇里按键联系的代码。
哪位大神能帮忙解释一下标红的这句话的涵义啊,从代码逻辑来看,我怎么觉得无论mode是0还是1,最后key_up都会被赋值为1呢,但是实际情况mode不一样,确实会出现不一样的现象,求解惑为什么会这样。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
萌萌的小x盆友
2019-07-21 06:28
本帖最后由 萌萌的小x盆友 于 2018-10-16 09:43 编辑

支持软件按键, 串口Usmart 发 KEY0_DOWN_Soft(); =key0;
.
同时代码更高明, 并支持之前所有功能;
///////////////////////////////////////////////.
/********************************************************************************/
u8  KEY_Soft_State = 0;                 //软件触发标志
/********************************************************************************/
//按键初始化函数
void KEY_Init(void)
{
        GPIO_InitTypeDef  GPIO_Structure;        //GPIO 结构体初始化
       
        /*** 打开GPIO 端口时钟 ***/
        __HAL_RCC_GPIOA_CLK_ENABLE();                  //GPIOA 时钟
        __HAL_RCC_GPIOC_CLK_ENABLE();                  //GPIOH 时钟
       
        /*** GPIO 初始化 ***/
        GPIO_Structure.Pin = GPIO_PIN_5;               //KEY1
        GPIO_Structure.Mode = GPIO_MODE_INPUT;         //输入
        GPIO_Structure.Speed = GPIO_SPEED_FREQ_HIGH;   //高速 (108/2)MHZ
        GPIO_Structure.Pull = GPIO_PULLUP;             //上拉
        HAL_GPIO_Init(GPIOA, &GPIO_Structure);         //初始化 GPIO
       
        /*** GPIOC 初始化 ***/
        GPIO_Structure.Pin = GPIO_PIN_13;              //KEY0
        HAL_GPIO_Init(GPIOC, &GPIO_Structure);         //初始化GPIO
}
/********************************************************************************/
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按; 0xFF,所有按键同时连按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下
//4,KEY_UP按下 即WK_UP
//同时按下,只会出现最后一个检测
u8 KEY_Scan(u8 mode)
{         
        static u8 key_sta=0; //按键按下标志
        u8 temp=0, res, i;

//        if(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)     //检查按键是否动作
        if(KEY0==0||KEY1==0)     //检查按键是否动作
        {
                delay_ms(10);               //去抖动
                if(KEY0==0) temp |= 1<<0;   //位0_KEY0
                if(KEY1==0) temp |= 1<<1;   //位1_KEY1
//                if(KEY2==0) temp |= 1<<2;   //位2_KEY2
//                if(WK_UP==1) temp |= 1<<3;  //位3_WK_UP
        }
        if(KEY_Soft_State)            //检测到软件按键
        {
                temp = KEY_Soft_State; KEY_Soft_State = 0; return  temp;
        }
       
        if(mode)key_sta=0;  //支持连按
        if(mode==0xFF) return  temp;       //模式 0xFF 支持所有按键同时连按
        else
        {
                res = 0;
                for(i=0;i < 8;i++)                   //同时按下,只会出现最后一个检测
                {
                        if((temp&(1<<i)) || (key_sta&(1<<i))) //当前按键需要处理(已按下||需要标记按键弹起)
                        {
                                if((temp&(1<<i)) && (key_sta&(1<<i))==0) //检测到按下, 按键之前为释放
                                {
                                        key_sta |= 1<<i;               //保存当前按下的按键
                                        res = i+1;                       //返回当前扫描序号
                                }else if((temp&(1<<i))==0 && (key_sta&(1<<i))) //检测到弹起, 按键之前为按下
                                {
                                  key_sta &= ~(1<<i);            //清除当前按下的按键
                                }
                        }
                }
        }
        return  res;
}
/********************************************************************************/
/*** 虚拟按键函数 ***/

u8  KEY0_DOWN_Soft(void)    {KEY_Soft_State = KEY0_PRES; return 0;}
u8  KEY1_DOWN_Soft(void)    {KEY_Soft_State = KEY1_PRES; return 0;}
u8  KEY2_DOWN_Soft(void)    {KEY_Soft_State = KEY2_PRES; return 0;}
u8  KEY3_DOWN_Soft(void)    {KEY_Soft_State = KEY3_PRES; return 0;}
u8  WKUP_DOWN_Soft(void)    {KEY_Soft_State = WKUP_PRES; return 0;}
/********************************************************************************/

一周热门 更多>