本帖最后由 linfuchi 于 2010-1-22 09:53 编辑
没有最牛,只有更牛!
菜鸟需要写个键盘扫描程序提供如下几个接口参数,写了一份觉得啰嗦,没有“安全感”,很没自信,所以发了此贴。
有三个按键需要扫描,命名为SET,UP,DOWN吧。约定P0.0,P0.1,P0.2分别对应UP,SET,DOWN吧。对了,添加一条,不用判断按键释放。
要求是程序简洁,逻辑清晰正确,占用资源少,通用性强。
被拍了才能进步,大家都试试。
需要通过按键扫描提供如下几个接口参数
typedef enum
{
KEY_SET,
KEY_UP,
KEY_DOWN,
KEY_SETTHREESECOND, //SET键按住3秒以上
KEY_TIMEOUT, // 检的按键之后,一分内再无任何按键按下
NOKEY //无按键记录,包括无按键按下,或者按键按下处理之后清除掉了
}KEY_TYPE;
嘿嘿,这是菜鸟前几天看到一个键盘扫描的帖子,按照那个思路做的,现学现卖,学的不好的话,还请前面的师傅原谅。哈哈。不过菜鸟不会调试程序,语法上没错误了,逻辑上的错误不知道怎么查。有愿意指点一下这么弱的问题的没有?有的话请详细一点。
我自己写的程序往往不知道好坏,的缺点在那,有什么BUG,请大家拍砖,我是大菜鸟,不怕砖头。听武林高手说要成为高手,要先学会挨揍。哈哈。
每20MS中断一次,执行按键扫描程序以及其他操作。
KEY_TYPE keyscan(void)
{
P0=0x07; //p0跟LED显示复用,所以每次扫描之前重新初始化
KeyTemp=P0&0x07;
if(KeyTemp==0x07)
{
if(LastKey==0x05) //若SET键有作案记录,说明SET键未到3秒就释放了,嘿嘿
{
counttime=0;
LastKey=0x07;
return KEY_SET;
}
count++;
if(count==3000)
{
count=0;
return KEY_TIMEOUT;
}
else return NOKEY;
}
else
{
if(KeyTemp==0x05) //SET键被按下
{
if(counttime==150)
{
counttime=0;
LastKey=0x07;
return KEY_SETTHREESECOND;
}
counttime++;
LastKey=KeyTemp;
}
else //不是SET键
{
if(LastKey==KeyTemp) //不是第一次检测到按下
{
if(KeyTemp==0x60)
{
LastKey=0x07;
return KEY_UP;
}
else
{
LastKey=0x07;
return KEY_DOWN;
}
}
else //第一次按下
{
LastKey=KeyTemp;
return NOKEY;
}
}
}
} |