• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

准备用6独立按键控制1个led闪烁

D.... 2016-02-23 浏览量:1281
 #include  
#define uint unsigned int 
#define uchar unsigned char

unsigned char KeyValue=0;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit LED=P2^0;

 void delay(uint count)
{
uint i,j;
for(i=0;i for(j=0;j<110;j++);
}
  void main()
{
while(1)
{
    if(!key1)
    {
       delay(10); //去抖动
       if(!key1) //检测按键确实按下,进行按键处理
       {
                 LED=0;
                 delay(200);
                 LED=1;
                 delay(200);
                 LED=0;
                 delay(200);
                 LED=1;
                 delay(200);
                 LED=0;
                 delay(200);
                 LED=1;
                 delay(200);
                 LED=0;
                 delay(6000);
                 LED=1;
                 delay(700);
       }
    }
    if(!key2)
     {
        delay(10); //去抖动
        if(!key2) //检测按键确实按下,进行按键处理
        {
                 
                 LED=0;
                 delay(700);
                 LED=1;
                 delay(700);
                 LED=0;
                 delay(700);
                 LED=1;
                 delay(700);
                 LED=0;
                 delay(5000);
                 LED=1;
                 delay(700);
        }
     }
    if(!key3)
     {
        delay(10); //去抖动
        if(!key3) //检测按键确实按下,进行按键处理
        {
                 LED=0;
                 delay(1200);
                 LED=1;
                 delay(700);
                 LED=0;
                 delay(700);
                 LED=1;
                 delay(700);
                 LED=0;
                 delay(1200);
                 LED=1;
                 delay(700);
        }
     }
          
               
               if(!key4)
               {
                  delay(10); //去抖动
                    if(!key4) //检测按键确实按下,进行按键处理

                     {
                        LED=1;
                        while(!key4); //松手检测
                         LED=1;
     }
               
 
              }
}
}
   
我需要用四个独立按键控制一个LED灯,按下KEY1时执行一段程序循环执行,按下KEY2时执行一段程序循环执行,KEY3时执行一段程序循环执行,KEY4时执行一段程序循环执行。当执行key1的程序时我按下key2迅速从key1程序,四个按键的程序可以随意按下切换。
我自己写的,按下后不能循环,执行一次就灭了。如果给每段加上while(1)就死循环了,出不来了。如果用外部中断,外部中断不够。后面我还想再加2个按键2段程序 ,别人说我,框架弄的有问题。求云汉大神,给我写一段让我学习学习。
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案


  • #include
    #define uint unsigned int
    #define uchar unsigned char

    unsigned char KeyValue=0;
    sbit key1=P3^0;
    sbit key2=P3^1;
    sbit key3=P3^2;
    sbit key4=P3^3;
    sbit LED=P2^0;

    void delay(uint count)
    {
    uint i,j;
    for(i=0;i for(j=0;j<110;j++);
    }
    void main()
    {
    while(1)
    {
    if(!key1)
    {
    delay(10); //???
    if(!key1) //????????,??????
    {
    LED=0;
    delay(200);
    LED=1;
    delay(200);
    LED=0;
    delay(200);
    LED=1;
    delay(200);
    LED=0;
    delay(200);
    LED=1;
    delay(200);
    LED=0;
    delay(200);
    LED=1;

    }


    }
    if(!key2)
    {
    delay(10); //???
    if(!key2) //????????,??????
    {

    LED=0;
    delay(700);
    LED=1;
    delay(700);
    LED=0;
    delay(1200);
    LED=1;
    delay(700);
    LED=0;
    delay(700);
    LED=1;

    }


    }
    if(!key3)
    {
    delay(10); //???
    if(!key3) //????????,??????
    {
    LED=0;
    delay(1200);
    LED=1;
    delay(700);
    LED=0;
    delay(700);
    LED=1;
    delay(700);
    LED=0;
    delay(700);
    LED=1;

    }


    }


    if(!key4)
    {
    delay(10); //???
    if(!key4) //????????,??????

    {
    LED=0;
    while(!key4); //????
    LED=0;
    LED = 1;
    }


    }
    }

    }

    程序我给你改了改,这个程序没有问题。

    • 发布于 2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:14
  • 加我qq630183258,有时间帮你弄了
    • 发布于2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 刚加了。谢谢您能帮助我。
    • 发布于2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 你这压根就不是用中断写的……就是普通的IO功能……
    • 发布于2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 根据和楼主的沟通,我写新的程序:

        

    #include  
    #define uint unsigned int 
    #define uchar unsigned char

    unsigned char KeyValue=0;
    sbit key1=P3^0;
    sbit key2=P3^1;
    sbit key3=P3^2;
    sbit key4=P3^3;
    sbit LED=P2^0;

     void delay(uint count)
    {
    uint i,j;
    for(i=0;i for(j=0;j<110;j++);
    }
      void main()
    {
       uint key_num = 0;
       uint key_flg = 0;
    while(1)
    {
        LED = 1;
        if(!key1)
        {
           delay(10); //???
           
           if(!key1) //????????,??????
           {
     key_num ++ ;
     key_flg = 0;
           }
        }
           if(( key_num == 1) && !key_flg )//????????,??????
           {
            key_flg = 1;
                     LED=0;
                     delay(200);
                     LED=1;
                     delay(200);
                     LED=0;
                     delay(200);
                     LED=1;
                     delay(200);
                     LED=0;
                     delay(200);
                     LED=1;
                     delay(200);
                     LED=0;
                     delay(6000);
                     LED=1;
                     delay(700);
           }
           
        
       
        
            if((key_num == 2)&& !key_flg ) //????????,??????
            {
                     key_flg = 1;
                     LED=0;
                     delay(700);
                     LED=1;
                     delay(700);
                     LED=0;
                     delay(700);
                     LED=1;
                     delay(700);
                     LED=0;
                     delay(5000);
                     LED=1;
                     delay(700);
            }


        if((key_num == 3)&& !key_flg )
         {
                     key_flg = 1 ;
                     LED=0;
                     delay(1200);
                     LED=1;
                     delay(700);
                     LED=0;
                     delay(700);
                     LED=1;
                     delay(700);
                     LED=0;
                     delay(1200);
                     LED=1;
                     delay(700);
         

         }
            
                   
                
                        if((key_num == 4) && !key_flg ) //????????,??????

                         {
    key_flg = 1;
                             LED=0;
                             delay(1200);
                            
    LED = 1 ;
    key_num = 0;
                         }
       
     
    }
    }

    • 发布于2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 那你能帮我写一下吗。因为就只会io口操作,才学了这么点。
    • 发布于2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 哪里不对,请详细说明你的需求。

    • 发布于2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 不好意思,中午去测绘了个东西,3点才回来。刚在QQ上给你发消息了。

     怎么说呢,功能是:k1-k4四个按键,k1键对应一段程序(ps:就是控制led闪烁的频率)

    k2键对应一段程序,
    k3键对应一段程序,
    k4键对应一段程序,
    开发板上电,默认led灯是熄灭的。然后我按下k1,此时执行k1键所对应的程序,而且是重复循环执行。当我按下k2键或者k3,k4键的时候,能从k1的程序中快速跳出执行其他键的程序。

    闪烁的频率就是我之前写的那么个频率。我以前以为要用外部中断,但是我的按键太多外部中断也不够用,后来别人给我说:直接设置一个变量k……四个按键分别让k等于1,2,3,4……然后主函数用一个循环,switch~k就行了
    以我的水平实在是理解不了,更写不出来 

    • 发布于2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 按键不用中断也是可以的,你会用定时器么?你这按键里面等的闪烁用函数延时会很有问题的,会导致你按键的时候可能正好在执行延时程序,所以你的按键会相应不了,用定时器延时去控制闪烁,效果会好很多。我有时间帮你弄个吧……
    • 发布于2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 代码这么多,其实这个用状态机做最好了, switch(key) {case 1: 程序段1;break;case 2: 程序段2;break;case3: 程序段3;break;case 4: 程序段1;break;}
    • 发布于2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 正好有时间帮你写了一下,用定时器实现的,你看下写的对不对,由于上传不了代码,只能传图片跟附件给你了,希望能帮助到你,有问题欢迎常来提问(源代码见最后附件):



    源代码:


    • 发布于2016-02-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 这样做比较浪费接口啊,推荐使用ZLG7290或者加一片3-8线的74138
    • 发布于2016-02-25
    • 举报
    • 评论 0
    • 0
    • 0

  • 这样做比较浪费接口啊,推荐使用ZLG7290或者加一片3-8线的74138
    • 发布于2016-02-25
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

准备用6独立按键控制1个led闪烁