前天老板交给我一个任务,就是设计一个机关,有四个按键,要顺序按下这四个按键之后才会触发下面的机关。程序里我就用key1——key4代替了,我一开始写的代码如下:
<pre name="code" class="plain"><pre name="code" class="sql">#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit led1=P3^7;
sbit led2=P3^6;
sbit led3=P3^5;
sbit led4=P3^4;
void main ()
{
P2=0xff;
P3=0x00;
while(1)
{
if(key1==0)
{
led1=1;
while(!key1);
P2=0xff;
while(key1&&key2&&key3&&key4);
if(key2==0)
{
led2=1;
while(!key2);
P2=0xff;
while(key1&&key2&&key3&&key4);
if(key3==0)
{
led3=1;
while(!key3);
P2=0xff;
while(key1&&key2&&key3&&key4);
if(key4==0)
{
led4=1;
while(!key4);
}
}
}
}
}
}
上面的代码我下载到单片机中,始终得不到想要的结果。硬件现象是按完第二个按键之后再按下第三个按键,led3始终都不会亮。然后我在while(!key1)前面加上一个延时,我当时的意思是延时一下在松手检测,但是我还是没有实现我想要的目的。然后请教了一个高人~~~哈哈 , 他在我的代码里加了一个led5,程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit led1=P3^7;
sbit led2=P3^6;
sbit led3=P3^5;
sbit led4=P3^4;
sbit led5=P3^3;
void main ()
{
P2=0xff;
P3=0x00;
while(1)
{
led5=0;
if(key1==0)
{
led1=1;
while(!key1);
led5=1;
P2=0xff;
while(key1&&key2&&key3&&key4);
if(key2==0)
{
led2=1;
while(!key2);
P2=0xff;
while(key1&&key2&&key3&&key4);
if(key3==0)
{
led3=1;
while(!key3);
P2=0xff;
while(key1&&key2&&key3&&key4);
if(key4==0)
{
led4=1;
while(!key4);
}
}
}
}
}
}
这是,我就发现问题了,因为按下第二个按键之后,led5=0了。所以这就是问题的所在!!!我当时想了一下,不就是延时去抖动嘛!然后我把每一个按键的检测加上了按键去抖动的程序。如下:
if(key1==0)
{
delay(50);
if(key1==0)
{
led1=~led1;
while(key1==0);
。。。。。。。。
}
}
之后我就信心满满的下到板子中了,结果还是悲剧~~~~~
所以这里按键的判断逻辑成立,但是实际上不可行~~~~~~~~~~~~~因为硬件电路并不像仿真一样,会有各种的问题!
最后大神写了一个大概的框架,然后我补全之后,就是下面的了:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
uchar shuzu[]={0xfe,0xfd,0xfb,0xf7};
void delay(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<110;i++);
}
void main ()
{
uchar i=0;
P1=0x00;
while(1)
{
P2=0xff;
if(P2!=255)
{
delay(200);
if(P2!=255)
{
if(P2==shuzu)
{
i++;
}
else
{
i=0;
}
}
while(P2!=255);
}
if(i==4)
{
while(1)
{
P1=0xff;
}
}
}
}
至此,这个持续两天的BUG终于消除了。。。。。。。
|