微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大家好,为什么这两个按钮不能随时有效执行

大家好,为什么这两个按钮不能随时有效执行

时间:10-02 整理:3721RD 点击:

//主程序

void main()

{

       init();

       while(1)

       {

              if(key1==0)//流水灯按钮

              {

                     delay_ms(10);

                     if(key1==0)

                     {

                            flag=0;

                            while(!key1);                                            

                     }

              }

              if(key2==0)//继电器按钮

              {

                     delay_ms(10);

                     if(key2==0)

                     {

                            flag1=0;

                            while(!key2);                                            

                     }

              }

              if(flag==0)//流水灯程序

              {

                     led1=0;

                     delay_ms(500);

                     led2=0;

                     delay_ms(500);

                     led3=0;

                     delay_ms(500);

                     led4=0;

                     delay_ms(500);

                     led1=1;   led2=1;   led3=1;   led4=1;

                     delay_ms(500);

                     flag=1;

              }

              

              if(flag1==0)//继电器程序

              {

                     rel1=0;           

                     delay_ms(1000);

                     rel1=1;

                     delay_ms(1000);

                     flag1=1;  

              }

       }

}

大家好,这是一段两个按钮分别控制流水灯和继电器的程序,其中key1控制流水灯,key2控制继电器。我这个程序并没有达到预期的效果,两个按钮在执行过程中会冲突,比如先按下key1时,执行流水灯程序,此时再按key2无效,必须要等流水灯程序中的flag=1(即退出if(flag==0)//流水灯程序以后)再按key2才有效。先按key2也一样,必须要等flag1=1

(即退出if(flag1==0)//流水灯程序以后)再按key1才有效。请问如何更改程序才能使其不受制约?我要达到的目的是任何时候按下key1或key2都会执行各自的程序,相互间不受制约?请各位网友多指点,谢谢。

单片机是循环运行,你的逻辑就是从上到下按顺序进行,要实现你的情况有两种方法,一个是key之间相互嵌套,另一个是用UCOS操作系统

你可以用case 结构,key1==0时flag=0,key2==0时flag=1.再switch(flag),case 0的时候运行流水灯程序,break;case 1的时候运行继电器程序,break。

因为你的流水灯和继电器在运行的时候并不进行按键检测,所以你按下去没反应

尽量少用程序延时,你的程序用了太多延时了,占用了太多CPU,用你现在这种方法很难实现。用定时器延时和改一下你亮灯的算法,不要一位一位来,用移位来实现

我改了一下你的程序,因为我没有硬件在这里,就懒得编译了,不知有没有语法错误,你拷进去看行不行,大概思路就是这样子了
void timer0()interrupt 1
        {
         unsigned char tcount,tcount1;
         TH0=0X54;       //定时时间随便定的,小编可以根据自己需要更改      
         TL0=0x92;
         if(!flag)tcount++;
         if(tcount==10)led1=0;
         if(tcount==20)led2=0;         
         if(tcount==30)led3=0;
         if(tcount==40)led4=0;
         if(tcount==50)tcount=0,led1=1,led2=1,led3=1,led4=1,flag=1;

         if(!flag1)rel1=0;tcount1++;
         if(tcount1>100)rel1=1;tcount1=0,flag1=1;
         }
         void main()
{
         IE=0x82;                  //开定时器中断
         PT0=1;
         TMOD=0X01;
         TH0=0X54;       //定时时间随便定的,小编可以根据自己需要更改      
         TL0=0x92;
         TR0=1;                          //开定时器0
       init();
       while(1)
       {
              if(key1==0)//流水灯按钮
              {
                    // delay_ms(10);                后面有松手检测,前面就没必要消抖了,下面的同理
                    // if(key1==0)
                    // {
                            flag=0;
                            while(!key1);                                            
                    // }
              }
              if(key2==0)//继电器按钮
              {
               flag1=0;
               while(!key2);                                            
               }
       }
}

更多细节小编看着改吧

用tiny吧,哈哈

这么个小程序至于说到操作系统么?
LZ一看就知道是新人,多给些提示和帮助不好么。都在显示牛掰?
6楼说的好。

由于你的延时很长!~~~

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top