早教吧 育儿知识 作业答案 考试题库 百科 知识分享

求C51编程的键盘消抖代码优化:以下键盘扫描方式该如何消抖?--->Delay(ms)要放在哪里呢?谢过~~~!//===KEYSCANvoidkeyscan()//键盘扫描:将获取新的keynum值,用以判断执行动作{uchartemp;//临

题目详情
求C51编程的键盘消抖代码优化: 以下键盘扫描方式该如何消抖?---> Delay(ms)要放在哪里呢? 谢过~~~!
//=== KEY SCAN
void key_scan() //键盘扫描:将获取新的key_num值,用以判断执行动作
{
uchar temp; //临时键值
uchar key_en=1; //键盘监视:有按键动作时才执行Key_serve,否则仅仅作扫描
P3 = 0x0f; //低4位置1,放入4行.
// delay(1); //键按下后,P3的00001111变成0000xxxx,x中有1个为0,3个为1
// delay(10);
// delay(10); //10ms消抖
// if(P3!=0x0f) //如果确实有键按下了
// {
//
temp = P3^0x0f; //异或,把相异的一行变成1,其它全为0
switch(temp) //判断是哪行有键按下了(0-3行)
{ //就给相应键值的行提前量
case 1: key_num = 0; break;
case 2: key_num = 1; break;
case 4: key_num = 2; break;
case 8: key_num = 3; break;
default: { key_num= 16;
key_en=0;} break; //无按键
}

P3 = 0xf0; //高4位置1,放入4列.
// delay(10); //键按下后,11110000变成xxxx0000,x中有1个为0,3个为1
temp = (P3>>4)^0x0f; //将高位移到低位,为计算分支方便.用异或找出按下的列

switch(temp) //判断哪列按下了,就在先前的键值中加入列倍数可得键值key_num
{
case 1: key_num += 0; break;
case 2: key_num += 4; break;
case 4: key_num += 8; break;
case 8: key_num += 12;
}
if(key_en==1) //如果有键盘操作,才执行按键服务
key_serve();
display_mod(); //指示工作模式的LED灯变化
// }
// }
}
▼优质解答
答案和解析
if(P3!=0x0f) //如果有键按下了
{
delay(10); //10ms消抖
if(P3!=0x0f) //如果确实有键按下了
{
while(P3!=0x0f); //判断按键是否弹起来,弹起来了就继续执行下面的语句,否则则一直循环到弹起来
temp = P3^0x0f; //异或,把相异的一行变成1,其它全为0
switch(temp) //判断是哪行有键按下了(0-3行)
...
}
}