说到按键,我还是有不少研究的,其实按键没我们想的那么简单,要把按键程序写好也不是一件容易的事,功能要求:单击、双击、长按及组合,按下不动,返回有效值速度越来越快,多用在参数调节,这些都是值得大家去研究的,还有8个IO口,让16个独立按键与8个独立按键共同使用这是没有问题的。 扯远了,今天只讨论如何做松手检测,松手检测意义,很简单,就是按下按键只对应一次操作,不会因为按着不动就不停的返回按键值,我们大多时候见到的松手检测程序就是 “while(!k1)”,一种等待式写法,打个比方,这就如同你插上热得快烧水,你坐在旁边看着,等着水热,拜拜浪费时间。这种写法根本不适应实际应用,拜拜浪费CPU时间。看一下代码: 功能:按键检测子函数,四个独立按键接在P2口高四位,调用时返回按键值1,2,3,4,没有按键按下返回0. char ReadKey(void)
{
static Key_on_off = 0;
unsigned char num,temp = 0;
num = P2; // 读取P2口状态
num&= 0xf0; // 屏蔽第四位
if(num != 0xf0) // 判断是否有按键按下
{
if(Key_on_off == 0) // 自锁变量
{
/*********** 相对高级的松手检测 ****************/
Key_on_off = 1; // 如果屏蔽这句话,将没有松手检测,数字将加的很快
switch(num) // 读取按键信息
{
case 0xe0: temp=1;break;
case 0xd0: temp=2;break;
case 0xb0: temp=3;break;
case 0x70: temp=4;break;
}
/*********** 最笨的松手检测 ****************/
/* while(num != 0xf0) // 判断是否有按键按下
{
num = P2; // 读取P2口状态
num&= 0xf0; // 屏蔽第四位
} */
}
}
else
{
Key_on_off = 0; // 当没有任何按键按下时 解锁
}
return temp;
}
|