早教吧作业答案频道 -->其他-->
求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灯变化
// }
// }
}
//=== 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行)
...
}
}
{
delay(10); //10ms消抖
if(P3!=0x0f) //如果确实有键按下了
{
while(P3!=0x0f); //判断按键是否弹起来,弹起来了就继续执行下面的语句,否则则一直循环到弹起来
temp = P3^0x0f; //异或,把相异的一行变成1,其它全为0
switch(temp) //判断是哪行有键按下了(0-3行)
...
}
}
看了 求C51编程的键盘消抖代码优...的网友还看了以下:
无限圆柱体高斯面问题,求无限长均匀带电圆柱体内外场强,已知电荷体密度ρ,圆柱体半径为R,求E?取一 2020-04-12 …
椭圆G:X2/A2+Y2/B2=1(A>B>0)的两个焦点为F1(—C,0),F2(C,0),M是 2020-05-13 …
RSA算法中的mod计算问题RSA密文算法公式c=m^e%n例如有这样一道题,设m=15,e=3d 2020-05-16 …
在指数平滑法中, ( )。A.是平滑系数B.取值越小越好C.取值越大越好D.取值范围在-1到+1之间 2020-05-30 …
当疑有脑转移瘤时,优先的影像检查方法是: ( )A.头颅平片B.脑血管造影C.CTD.脑室造影E.核 2020-06-07 …
对-E取行列式的值,应该等于多少?可以按照行列式乘法运算分开吗?|-E|=|-1||E|这样可以吗 2020-06-12 …
在RSA密码算法中,取两个素数7和17,e取5,根据密码算法,计算一组公钥和私钥.如果明文为15, 2020-06-20 …
图中索道上行方向为西南向东北,下列选择中最佳的是()A.A、B、E三地中,B处是建火情瞭望哨最佳地 2020-07-04 …
椭圆的两个焦点为,(c,0),M是椭圆上的一点,且满足.(1)求离心率的取值范围;(2)当离心率e 2020-08-01 …
按键精灵的大师们.有5个数a.b.c.d.e取出其中3个数,要求这3个数相加等于10的倍数如果有就枚 2020-11-08 …