一、代码分析
#include"reg52.h"
unsigned int i;//这两个变量定义得毫无用处
unsigned char a;
sbit led=P2^0;
sbit k1=P3^1;
void dalay(unsigned int i)
{
while(i--);
}
void main()
{
while(1)
{
if(k1==0)
{
dalay(2000);
while(k1==0)//当你长按时就会一直在while中循环,灯的电平就会一直变化
{dalay(5000);//判断成功我觉得没必要延时
led=~led;
}
}
}
}
二、问题分析:
![](https://i-blog.csdnimg.cn/blog_migrate/b9443b5ff545868e3612c81990e5bd7c.png)
我们只需要在判断成功后加个松手检测就行
三、参考代码:
#include"reg52.h"
sbit led=P2^0;
sbit k1=P3^1;
void dalay(unsigned int i)
{
while(i--);
}
void main()
{
while(1)
{
if(k1==0)
{
dalay(2000)//按键消抖
if(k1==0)
{
led=~led;
while(k1==0);//检测到电平变高即松手为止
}
}
}
}
其实上述的消抖和松手检测的方法并不好,会导致单片机卡在该程序,无法实时地进行多个操作,例如:同时实现按键检测和数码管显示功能。如果之后学到定时器,建议借用定时器优化该代码