如何将按键按下一次作为一次输入
时间:10-02
整理:3721RD
点击:
我用的是扫描法检测按键 但是按下一次就会扫描很多次 如何更改函数使得按下抬起一次作为一次的输入
char keyScan(void)
{
char key = 0;
char row,col;
// char key_now ;
// char key_past;
P9DIR = 0XF0;
P9REN = 0X0F;
P9OUT = 0X0F;
if((P9IN & 0X0f) != 0X0f) //判断是否有有键按下(检测输入是否全部为高),若有 往下执行
{
delays();
if((P9IN&0x0f)!=0x0f) //再次判断列中是否是干扰信号,不是则向下执行
{
row = P9IN&0x0f;
P9DIR = 0X0F;
P9REN = 0XF0;
P9OUT = 0XF0;
col = P9IN&0xf0;
// if((key_past==0)&&(key_now==1))
{ key = row|col;
// key_past = key_now;
// key_now = 0;
}
}
}
return key;
}
char keyScan(void)
{
char key = 0;
char row,col;
// char key_now ;
// char key_past;
P9DIR = 0XF0;
P9REN = 0X0F;
P9OUT = 0X0F;
if((P9IN & 0X0f) != 0X0f) //判断是否有有键按下(检测输入是否全部为高),若有 往下执行
{
delays();
if((P9IN&0x0f)!=0x0f) //再次判断列中是否是干扰信号,不是则向下执行
{
row = P9IN&0x0f;
P9DIR = 0X0F;
P9REN = 0XF0;
P9OUT = 0XF0;
col = P9IN&0xf0;
// if((key_past==0)&&(key_now==1))
{ key = row|col;
// key_past = key_now;
// key_now = 0;
}
}
}
return key;
}
按键扫描很多次是你没有做按键抬起处理,程序执行快了就会识别好几次。这不是你消不消抖的问题,
在程序里加 while(按键抬起判断);
这样就可以一抬起才会执行后面程序。
程序里带延迟判断按键,估计是延迟时间过短所致。你把延迟再适当延长一些试试看。
我的意思是检测按键抬起
分享大家一个学习单片机与嵌入式的地方,可以关注一下微信公众号【玩转单片机与嵌入式】,每天都会分享三篇有价值的文章,通过碎片化的学习时间,提高自己的水平。
是这么回事 但是不知道 如何检测抬起
第二个if语句里加上这句话
while((P9IN&0x0f)==0x0f);//等待按键抬起
加中断或者读按键用IO口状态,赋给变量
把变量带进判断,触发就好了
我加的是 while((P9IN&0xf0)!=0xf0);//等待按键抬起
多谢指点
我用的端口没有中断 已经解决 谢谢指点
学习学习。
这个中断的确容易忘记 我都是先用笔记在本子上 编完后再对照着找一下 看看有没有忘记
受教了
我也是菜鸟 不会了才来发帖提问的
做一个按键松开检测,按键松开后再将数据写入
学习学习。
好,,,,,,,
都是菜鸟,我也不懂太多