按键计数时间延误问题,num值0~1的变换轻按按键key0即可,1~2,2~3则需重按key0

2019-07-15 16:40发布

void main (void)
{
unsigned char num=0;                  
key0=1;
key1=1; //按键输入端口电平置高
key2=1;
//key3=1;
Init_timer0();

while (1)         //主循环
{
if(!key0)
{
   DelayMs(10);
   if(!key0)
   {
         while(!key0);
         num++;
         if(num==4)
         {
           num=0;
         }
  }
  }        
     if(num==1)
           {
             TempData[6]=dofly_DuanMa[s/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
             TempData[7]=dofly_DuanMa[s%10];
                 DelayMs(250);
                 DelayMs(250);
                 TempData[6]=0;
                 TempData[7]=0;
                 DelayMs(250);
                 DelayMs(250);
                }
              TempData[6]=dofly_DuanMa[s/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
           TempData[7]=dofly_DuanMa[s%10];
           TempData[5]=0x40;
           if(num==2)
           {
             TempData[3]=dofly_DuanMa[m/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
             TempData[4]=dofly_DuanMa[m%10];
                 DelayMs(250);
                 DelayMs(250);
                 TempData[3]=0;
                 TempData[4]=0;
                 DelayMs(250);
                 DelayMs(250);
           }
           TempData[3]=dofly_DuanMa[m/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
           TempData[4]=dofly_DuanMa[m%10];
           TempData[2]=0x40;
           if(num==3)
           {
             TempData[0]=dofly_DuanMa[h/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
             TempData[1]=dofly_DuanMa[h%10];
                 DelayMs(250);
                 DelayMs(250);
                 TempData[0]=0;
                 TempData[1]=0;
                 DelayMs(250);
                 DelayMs(250);
           }
           TempData[0]=dofly_DuanMa[h/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
           TempData[1]=dofly_DuanMa[h%10];
                     // Display(0,8); //显示全部8位
     //主循环中添加其他需要一直工作的程序
}                                                                 
}
num值0~1的变换轻按按键key0即可,1~2,2~3则需重按key0,这应该也不是DelayMS()的问题,我改变过DelayMS()的值,也没有解决上述问题!会不会是后面的执行程序太多而耽误的问题呢?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
moonyuan
1楼-- · 2019-07-15 17:40
本帖最后由 moonyuan 于 2015-8-27 20:39 编辑

当你 num = 0 是, 后续的程序不成立, 那么程序有足够时间 去响应按键。 当num = 1,2,3,程序不断进入Delay。阻塞性的延时,程序自然不会实时响应按键啦。
对策:
1) 短按按键 改为 长按按键

2) 增加 按键标记, 只有按键按下的时候才执行 需要执行的代码 ( 见以下代码 )

3) 改用 状态机

希望这些有帮助


  1. void main (void)
  2. {
  3.         unsigned char num=0;

  4.         unsigned char keyPressFlag = 0;  <span style="line-height: 27.2000007629395px;">//   <--------------加这一句</span>
  5.        
  6.         key0=1;
  7.         key1=1; //按键输入端口电平置高
  8.         key2=1;
  9.         //key3=1;
  10.         Init_Timer0();

  11.         while (1)         //主循环
  12.         {
  13.                 if(!key0)
  14.                 {
  15.                         DelayMs(10);
  16.                         if(!key0)
  17.                         {
  18.                                 while(!key0);
  19.                                 keyPressFlag = 1;  //   <--------------加这一句
  20.                                 num++;
  21.                                 if(num==4)
  22.                                 {
  23.                                         num=0;
  24.                                 }
  25.                         }
  26.                 }        
  27.                 if( num==1 && keyPressFlag )   <span style="line-height: 27.2000007629395px;">//   <--------------加这一句</span>
  28.                 {
  29.                         keyPressFlag = 0;   <span style="line-height: 27.2000007629395px;">//   <--------------加这一句</span>
  30.                         TempData[6]=dofly_DuanMa[s/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
  31.                         TempData[7]=dofly_DuanMa[s%10];
  32.                         DelayMs(250);
  33.                         DelayMs(250);
  34.                         TempData[6]=0;
  35.                         TempData[7]=0;
  36.                         DelayMs(250);
  37.                         DelayMs(250);
  38.                 }
  39.                 TempData[6]=dofly_DuanMa[s/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
  40.                 TempData[7]=dofly_DuanMa[s%10];
  41.                 TempData[5]=0x40;
  42.                 if( num==2 && keyPressFlag )  <span style="line-height: 27.2000007629395px;">//   <--------------加这一句</span>
  43.                 {
  44.                         keyPressFlag = 0;   <span style="line-height: 27.2000007629395px;">//   <--------------加这一句</span>
  45.                         TempData[3]=dofly_DuanMa[m/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
  46.                         TempData[4]=dofly_DuanMa[m%10];
  47.                         DelayMs(250);
  48.                         DelayMs(250);
  49.                         TempData[3]=0;
  50.                         TempData[4]=0;
  51.                         DelayMs(250);
  52.                         DelayMs(250);
  53.                 }
  54.                 TempData[3]=dofly_DuanMa[m/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
  55.                 TempData[4]=dofly_DuanMa[m%10];
  56.                 TempData[2]=0x40;
  57.                 if( num==3 && keyPressFlag )  <span style="line-height: 27.2000007629395px;">//   <--------------加这一句</span>
  58.                 {
  59.                         keyPressFlag = 0;  <span style="line-height: 27.2000007629395px;">//   <--------------加这一句</span>
  60.                         TempData[0]=dofly_DuanMa[h/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
  61.                         TempData[1]=dofly_DuanMa[h%10];
  62.                         DelayMs(250);
  63.                         DelayMs(250);
  64.                         TempData[0]=0;
  65.                         TempData[1]=0;
  66.                         DelayMs(250);
  67.                         DelayMs(250);
  68.                 }
  69.                 TempData[0]=dofly_DuanMa[h/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
  70.                 TempData[1]=dofly_DuanMa[h%10];
  71.                 // Display(0,8); //显示全部8位
  72.                 //主循环中添加其他需要一直工作的程序
  73.         }                                                                 
  74. }
复制代码

最佳答案
yuhonglong
2楼-- · 2019-07-15 23:01
你的意思是你按完key0,自动从0~1.1~2,2~3?

按键是一个触发动作

一周热门 更多>