一个大家在程序中很容易忽略的bug

zhangxian8031   2008-3-29 10:43 楼主
要求:
     当一个按健按下时,执行所要完成的动作,而当此动作完成后,按健还继续按着的话,不执行原重复的动作,也就是说按健按下执行一次动作,当按健一直按下时,不重复执行原动作,直到按健断开为止,
   以下为此要求写的这段程序,程序中的bug很容易发现,不符合要求
  main()
{
   initialport();
   while(1}
    {
      bit flag=1;
      if(P1^0==0&&flag==1)
      {
        flag=0;
        dosomething();
      }
      else flag=1;
      anotherthing();
    }
}
大家都发表一下自己的高见,互相学习参考一下,免的以后走弯路,

回复评论 (12)

main()
{
   initialport();
   while(1)
   {      
       if(P1^0==0)  
          dosomething();  
       while(!P1^0)
          ;
   }
}

看看这个能否满足你的要求
不知道按键后会不会做不同的事,上面只说了你只要求MCU做一件事的情况。
点赞  2008-3-29 11:16
或者将
while(!P1^0)
    ;

改一下
while(!P1^0)
    anotherthing();  

点赞  2008-3-29 11:18
设一个全局变量作标志。
点赞  2008-3-29 14:30
你可以判别按键抬起,此时才识别为一次按键

或者检测到按键时置一个标志,按键抬起时才清这个标志,再检测按键的时候判断这个标志,决定是否识别
点赞  2008-3-29 19:45
边沿触发,延时防抖
点赞  2008-3-31 13:38
边沿触发,延时防抖
点赞  2008-3-31 16:42
1. first key pressed

2.check repeat time------------

点赞  2008-3-31 16:51
来个比较复杂的,
检验下降沿
#define HI_LEVEL (0)
#define LO_LEVEL (1)

sbit P10=P1^0;
bit Falling_edge_G;
static bit Test4, Test3, Test2, Test1, Test0;

void PluseCheck()  //call this function every 20ms
{
   Test4 = Test3;
   Test3 = Test2;
   Test2 = Test1;
   Test1 = Test0;
   // Get latest test result
   Test0 = P10;
   // Required result:
   // Test4 == HI_LEVEL
   // Test3 == HI_LEVEL
   // Test1 == LO_LEVEL
   // Test0 == LO_LEVEL

   if ((Test4 == HI_LEVEL) &&
       (Test3 == HI_LEVEL) &&
       (Test1 == LO_LEVEL) &&
       (Test0 == LO_LEVEL))
      {
      // Falling edge detected
      Falling_edge_G = 1;
      }
   else
      {
      // Default
      Falling_edge_G = 0;
      }
}
点赞  2008-4-1 16:36
四楼的比较简单实用
点赞  2008-4-1 21:55
其实,可以用while跟踪到真的对按键释放。。。。

或是在定时扫键盘时,连续多次的按键都视为未释放

呵呵

点赞  2008-4-2 12:14
这一版块,太没人气了,是不是大家都成大侠了

如果成大侠了,也常回家看看嘛,家里太冷清了

据说努力顶帖也是一种美德,但我只想大家常回家看看

毕竟每天都有新手需要帮忙,而我能帮的只能是把帖子顶起来
点赞  2008-4-4 00:56
接分是王道!
点赞  2008-5-1 02:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复