算法在一次项目中产生。
本算法根据现有算法进行改进,思路依照现有算法,但是对现有算法进行了改进提升。
下面将一一介绍。
原有代码展示
void Key_Scan(void)
{
if(KEY == 0) //有按键按下
{
key_sum++;
if(key_sum == 1) // 短按
{
//此处填写短按按键操作
}
if(key_sum == 16) // 长按 快速增加 长按最低时间为16x50=800ms
{
//此处填写长按按键操作
key_sum = 15;
}
}
else
{
key_sum = 0;
}
}
Systic部分
SysTick_Config(SystemCoreClock/1000);
void SysTick_Handler(void)
{
if(++key_sum == 50) // 每50ms进行上面的按键检测
{
key_sum = 0;
KEY_Flag = 1;
}
}
现有代码的缺点说明
以上Key_Scan()函数可以看出,如果想进行按键长按操作,那么短按操作就一定也会执行。
改进现有代码的思路
根据以上,可以把检测k_sum数值放到else里,具体如下。
改进代码展示
此处分为两种情况:
其一:需要长按操作即使反馈,即使检测。例如:长按按键时,数字快速增加。
void Key_Scan(void)
{
if(KEY == 0) //有按键按下
{
k_sum++; //依据Systic进行计数
if(k_sum==16) //按下时间到达16x50=800ms 为长按操作
{
//此处填写长按按键操作代码
k_sum=15;//将计数减一,以便下次执行长按操作
}
}
else
{
if((k_sum<15)&&(k_sum!=0)) //当按下时间未到800ms时,跳出if进入else,对k_sum进行检测,如果不为0,则进行短按操作。
{
//此处填写短按按键代码操作
}
k_sum=0;
}
}
其二:不需要长按按键及时反馈,可以等松手后再反馈。例如:长按切换LCD显示界面
void Key_Scan(void)
{
if(KEY == 0) //按键按下
{
k_sum++;
}
else //松手后对按下时间进行检测
{
if((k_sum<16)&&(k_sum!=0)) //按键时间未到达16x50=800ms 且不为0 短按操作
{
//此处填写短按按键操作代码
}
if(k_sum>=16) //按键时间到达16x50=800ms 长按操作
{
//此处填写长按按键操作代码
}
k_sum=0; //只进行一次检测,将计数值清零
}
}
完结,欢迎评论区交流。