金牌会员
 
- 积分
- 1781
- 金钱
- 1781
- 注册时间
- 2014-6-27
- 在线时间
- 964 小时
|
发表于 2019-4-20 10:02:36
|
显示全部楼层
写的复杂了,这个方法我很早就已经写过了,发个简单的!
#define NONE_KEY 0
#define S1 0x02
#define S2 0x01
/*
按键扫描函数,建议5MS扫描一次,一般10次祛抖50MS合适
*/
void scan_keypad(u8 *p)
{
static u8 keyValue,tmp_keyValue,keyTrigger,keyKeep;
static u16 keyDelayNum,keyDelayNumValue;
keyValue=getKeyState();// // 得到按键的物理状态
if(keyValue!=tmp_keyValue)
{
keyDelayNumValue=10;//设置去抖节拍数
tmp_keyValue=keyValue;
keyDelayNum=0;
keyTrigger=0;
keyKeep=0;
reutrn;
}
else
{
if(keyDelayNum<keyDelayNumValue)
{
keyDelayNum++;
reutrn;
}
keyTrigger=keyValue&(keyValue^keyKeep);
keyKeep=keyValue;
}
if(keyValue)
{
if(fkeyLock==FALSE)//有必要,锁掉键盘
{
if(keyTrigger)
{
keyDelayNum = 0;
keyDelayNumValue = 400;//设置长按键节拍数
/*处理短按,得到键值,独立键值或组合键值
switch(keyValue)
{
*p = x;
}
fkeyLock=TURE;有必要,锁住键盘,释放后才解锁,同样可以实现按键一次,释放之后才能再按键,一般不用
*/
}
else
{
keyDelayNum = 0;
keyDelayNumValue =60;//设置连按键节拍数
//处理长按键或者连按键,独立键值或组合键值,如果不需要,这里不添加代码
/*switch(keyValue)
{
*p = x;
}
fkeyLock=TURE;有必要,锁住键盘,释放后才解锁,同样可以实现按键一次,释放之后才能再按键,一般不用
*/
}
}
}
else
{
//处理释放后要的键值,释放也已经祛抖,如同鼠标单击功能,双击,多击也在这里处理,不需要,直接清键值
*p=NONE_KEY;
fkeyLock=FALSE;
}
}
}
|
|