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

这问题困扰我两天了,我写的程序是:
#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!!好的再加分哦!!
不好意思,我自己已经解决了……

你没有松手监测呀!就是在按键处理程序后要加一个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;
}
}

是这样吗?可是它还是乱的……为什么??

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-07-12
你没要延迟去抖动
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
第2个回答  2012-07-12
while(!k1);//等待放开才继续.追问

请问可以具体一点吗?谢谢

第3个回答  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;
}
}
第4个回答  2012-07-17
自己的号……本回答被提问者采纳
相似回答