打印
[51单片机]

**仔单片机成长记----------------按键检测

[复制链接]
600|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuyusheng86|  楼主 | 2016-9-8 20:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前天老板交给我一个任务,就是设计一个机关,有四个按键,要顺序按下这四个按键之后才会触发下面的机关。程序里我就用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终于消除了。。。。。。。

相关帖子

沙发
w1a2n3g4| | 2016-9-9 09:22 | 只看该作者
if(P2==shuzu[j])
{
      i++;
      j++;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

21

帖子

0

粉丝