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不一样,确实会出现不一样的现象,求解惑为什么会这样。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你说的这个是原理,我看了静态局部变量就已经了解了,但问题是为什么要这么做,这么做的好处是啥,比如说减少代码量?
支持软件按键, 串口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;}
/********************************************************************************/
一周热门 更多>