早教吧作业答案频道 -->其他-->
求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编程的键盘消抖代码优...的网友还看了以下:
已知:如图,矩形ABCD中,CD=2,AD=3,以C点为圆心,作一个动圆,与线段AD交于点P(P和 2020-05-13 …
已知等差数列{an}和正项等比数列{bn},a1=b1=1,a3=b3=2.(1)求an、bn.( 2020-05-13 …
一道初二一次函数题目已知点A(8,0),B(0,6),C(0,-2),连接AB,点P为线段AB上一 2020-05-21 …
①若集合P={正方形},Q={菱形},那么是P是C的真子集,还是C是P的真子集,若C={矩形}呢, 2020-06-21 …
已知抛物线C:y2=2px(P>0)的准线为l,过M(1,0)且斜率为根号3的直线与l相交于点P, 2020-07-22 …
关于概率的问题P(W|C)的求解如下:P(W|C)=P(W)P(C|W)/P(C)其中,P(C)是 2020-07-30 …
已知直线l过抛物线C:y2=2px(p>0)的焦点且与C的对称轴垂直,l与C交于A、B两点,P为C 2020-07-31 …
下列说法中正确的是A.乙烯中C=C的键能是乙烷中C-C的键能的2倍B.氮气分子中含有1个s键和2个p 2020-11-29 …
高中数学2道利用复合命题真假求参数取值范围的题,1、设命题:P:C的平方>C和命题q:对任何X∈R, 2020-12-13 …
a,b,c在数轴上排列位置为:b.a负10c.1题目为若a等于负2,b等于负3,c等于3分之2问数轴 2020-12-24 …