单片机c语言呢编程问题:我要实现用一个按键控制一个LED的亮灭,按一次亮,再按一次灭,再按亮…………

这问题困扰我两天了,我写的程序是:#include<reg51.h>#include<intrins.h>sbitk1=P2^0;//k1是按键sbitd1=P0^0;/... 这问题困扰我两天了,我写的程序是:
#include <reg51.h>
#include<intrins.h>
sbit k1=P2^0;//k1是按键
sbit d1=P0^0;//d1是LED
main()
{
int A=0;
while(1)
{
if(ld1==0&&A==0&&d1==1)
{
d1=~d1 ;
A=1;
}
if(ld1!=0)
{ delay();
A=0;
}
if(ld1==0&&A==0&&d1==0)
{
d1=~d1;
A=1;
}
}
}

单片机是低电平有效的,这个程序运行时按着按着会乱,一下又不能按亮了,一下又不能灭了,我问了别人说要去抖动,就是加个延时函数,可是我加延时函数之后按住不动它就会闪烁,如果按太快的话它又反应不过来,求解释!!!
最好有程序例子给我!!就是让它按一次键不管按多久LED就改变一次值,直到松开后再按键它才改变一次值,不能让它乱了…最好试验成功的… 求求各位啦!!很急!!粘贴或邮箱都可以我基本在线1057994470@qq.com!!好的再加分哦!!
不好意思,我自己已经解决了……
展开
 我来答
wangbin8919
2012-07-12
知道答主
回答量:7
采纳率:0%
帮助的人:8万
展开全部
你没有松手监测呀!就是在按键处理程序后要加一个while(k1!=0);就是只有你松开按键后才认为本次按键执行完毕,不然就会一直重复执行按键按下的程序,那么你的d1一直就会执行亮灭操作!
追问
#include 
sbit Beep = P1^5 ;
sbit ld1=P2^0;
sbit d1=P0^0;
void main()
{
int A=0;
while(1)
{
if(ld1==0&&A==0&&d1==1)
{
d1=~d1 ;
A=1;
}
while(k1!=0)
{
A=0;
}
if(ld1==0&&A==0&&d1==0)
{
d1=~d1;
A=1;
}
}

是这样吗?可是它还是乱的……为什么??
158967630
2012-07-12 · 贡献了超过167个回答
知道答主
回答量:167
采纳率:0%
帮助的人:55.4万
展开全部
你没要延迟去抖动
void delay(uint z)
{ int x,y;
for(x=z;x>0,x--)
for(y=110;y>0;y--)
}
delay(20) 在你的按键那个地方延迟20就好了
if(s1==0)
delay(20)
if(s1==0)
d1=!d1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
linshaoyi1977
2012-07-12 · TA获得超过313个赞
知道答主
回答量:121
采纳率:0%
帮助的人:107万
展开全部
while(!k1);//等待放开才继续.
追问
请问可以具体一点吗?谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2021-01-09
展开全部
#include <reg51.h>
sbit P32=P3^2;
main ()
{int x,i;
while(1)
{ if (P32==0)
{for (i=0;i<=30000;i++);
if(P32==0)
{x++;
x=x%2;
}
}
if(x==1)
P0=0x00;
else
P0=0xff;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-07-17
展开全部
自己的号……
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式