单片机程序中多个按键的消除抖动怎么处理呢

如果程序中需要对100个按键进行消抖处理,这一百个键经常是100个键同时按下的,每个按键消抖的时候都要用延时函数delay()延时10ms,那么这100个按键就要消耗10... 如果程序中需要对100个按键进行消抖处理,这一百个键经常是100个键同时按下的,每个按键消抖的时候都要用延时函数delay()延时10ms,那么这100个按键就要消耗1000ms的时间,也就是程序的扫描周期是一秒钟,这样的话单片机的运行速度就太慢了,像这种按键比较多的时候,消抖处理用的很多的情况下,怎么能不影响单片机的运行速度又能完成消抖处理的功能呢? 展开
 我来答
百度网友ec39084
2010-12-10
知道答主
回答量:22
采纳率:0%
帮助的人:20.7万
展开全部
有个想法,不知道行不行。对100个键进行编码。
先扫描一次所有的键,保存可能被按下的键码进数组,延时,再根据保存数组中的键码进行扫描,得到被按下的键的键码
xh...1@163.com
2010-12-10 · 超过13用户采纳过TA的回答
知道答主
回答量:42
采纳率:0%
帮助的人:0
展开全部
你可以采用硬件消抖,就是用R-S触发器组成一个硬件消抖电路!希望你采纳!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
a8579389
2010-12-10
知道答主
回答量:4
采纳率:0%
帮助的人:0
展开全部
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P3^7;
sbit we1=P2^0;
sbit we2=P2^1;
sbit we3=P2^2;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
uchar num,temp,num1;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar aa) //num11是形参不能和定义中的一样
{
dula=1;
P0=table[aa-1];
dula=0;
}
uchar keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5); //延时去抖
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //判断确实输入了
{
temp=P3;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;

}
while(temp!=0xf0) //松手检测
{
temp=P3;
temp=temp&0xf0; //低四位全为0
}

}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5); //延时去抖
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //判断确实输入了
{
temp=P3;
switch(temp)
{
case 0xed :num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;

}
while(temp!=0xf0) //松手检测
{
temp=P3;
temp=temp&0xf0; //低四位全为0
}

}
}P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5); //延时去抖
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //判断确实输入了
{
temp=P3;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;

}
while(temp!=0xf0) //松手检测
{
temp=P3;
temp=temp&0xf0; //低四位全为0
}

}
}P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5); //延时去抖
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //判断确实输入了
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;

}
while(temp!=0xf0) //松手检测
{
temp=P3;
temp=temp&0xf0; //低四位全为0
}

}
}
return num;
}

void main()
{
dula=1;
P0=0;
dula=0;
we1=0;
we2=0;
we3=0;
num=17;
while(1)
{
display(keyscan());
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sw514sw514
2013-03-18 · 超过12用户采纳过TA的回答
知道答主
回答量:80
采纳率:0%
帮助的人:38.6万
展开全部
我觉得可以给每个按键设置一个标志位,当按键按下之后,延时10ms,记录每个按键的标志位的状态,然后同时比较100个标志位在按下前后的值。检测是否100个按键同时按下。这样相当于100按键只需要10ms的延时,而且这样还可以有2的100次方个状态,可以进行多个处理、
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2010-12-11
展开全部
这个月15日??
我现做也够呛~~~你只能找专门收费做毕业设计的给你做了。我必须把本职工作做完才有空干别的

前2年上大四我同学要人做全套的毕业设计价格是2000-3000 北京的
是从网上找的,能接受价格的话自己仔细找找把
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式