#define KEY_DELAY_TIME 100
#define KEY_LONG_TIME 200
#define KEY_TIME 150
unsigned char key1_lock_flag;//锁标志
//unsigned char key1_cnt;//消抖计数
unsigned int key1_cnt;//消抖计数
unsigned int key1_cnt2;
unsigned char Key_Scan()
{
unsigned char KeyNum=0;//标志按下的是哪个按键
if(KEY1)//未按下
{
key1_lock_flag=0;//清零
key1_cnt=0;//清零
}
else if(!key1_lock_flag)//按键按下且为第一次按下
{
key1_cnt++;//消抖计数
if(key1_cnt>KEY_DELAY_TIME)
{
key1_cnt=0;
KeyNum=1;//键值编码
key1_lock_flag=1;//自锁标志
}
}
else if(key1_cnt<KEY_LONG_TIME)
{
key1_cnt++;
}
else//进入连击
{
key1_cnt2++;
if(key1_cnt2>KEY_TIME)//可以控制触发速度,触发时间越短,触发速度越快
{
key1_cnt2=0;//连击时间间隔计数器清0
KeyNum=1;//键值编码
}
}
return KeyNum;//返回按键标志号
}
void Key_Service()
{
switch(Key_Scan())
{
case 0:break;//没有按键按下
case 1:KeyNum=0;//第一个按键按下
}
}
如果是对参数的大小进行调整,经过修改连击的触发速度,实现快速调整。(旋转编码器经过类似的做法,可实现越转越快的效果)