旋转得过快的时候,会有返回值

[复制链接]
946|10
 楼主| dingy 发表于 2015-9-18 19:32 | 显示全部楼层 |阅读模式

sbit CodingsWitch_A=P1_1;
sbit CodingsWitch_B=P1_2;

uint CodingsWitchPolling()//
{
   static Uchar Aold,Bold;   //定义了两个变量用来储蓄上一次调用此方法是编码开关两引脚的电平
   static Uchar st;         //定义了一个变量用来储蓄以前是否出现了两个引脚都为高电平的状态
   uint tmp = 0;
   if(CodingsWitch_A&&CodingsWitch_B)
   st = 1;      //
   if(st)               //如果st为1执行下面的步骤
   {
      if(CodingsWitch_A==0&&CodingsWitch_B==0)      //如果当前编码开关的两个引脚都为底电平执行下面的步骤
      {
         if(Bold)      //为高说明编码开关在向加大的方向转
         {
            st = 0;      
            tmp++;      //
         }
         if(Aold)      //为高说明编码开关在向减小的方向转
         {
            st = 0;
            tmp--;      //设返回值
         }
      }
   }
   Aold = CodingsWitch_A;            //
   Bold = CodingsWitch_B;            //储
   return tmp;            //
}

在网上参考了这段程序,我发现,当旋转得过快的时候,会有返回值。请问怎么解决?
pengf 发表于 2015-9-18 19:32 | 显示全部楼层
你不希望有返回值吗?
 楼主| dingy 发表于 2015-9-18 19:32 | 显示全部楼层
我是意思是,在屏幕上显示的数字,应该是左旋就--,右旋就++,可是我转动过快时,左旋的时候,会出现返回值的现象。
renyaq 发表于 2015-9-18 19:32 | 显示全部楼层
没看懂,你程序就是有返回值!
supernan 发表于 2015-9-18 19:33 | 显示全部楼层
你的意思是不是左旋时会加呀!
栩栩如生 发表于 2015-9-18 19:33 | 显示全部楼层
是楼主表述不清楚。。。所以,文字表述还是比较重要的。

LZ的意思是,本来是数字做增加操作,转快时,却有减的操作。

是因为,编码开关部分识别处理不好。一般20脉冲一圈的可以做得很可靠,我用查询就可以了,不用外中断,外中断不好处理抖动的问题。
 楼主| dingy 发表于 2015-9-18 19:33 | 显示全部楼层
不好意思,是我表达没说好
 楼主| dingy 发表于 2015-9-18 19:34 | 显示全部楼层
void GetKey(void)
{         
    static uchar Aold,Bold;
        static uchar st;
        uchar key_right_count = 0; // 按键右旋计数,满N次,右旋一下
    uchar key_left_count = 0; // 按键左旋计数,满N次,左旋一下

        if(PINA&&PINB)
           st=1;
        if(st)                 
        {
          if(PINA==0&&PINB==0)
           {
                      if(Aold)
                   {
                             st=0;
                          key_right_count++;
                          if(key_right_count >= 10)
                                {
                                   pulse_BZ2();
                                   keynum = 1;               
                                   key_right_count = 0;
                                   key_left_count = 0;
                            }
                   }
                   if(Bold)
                   {
                             st=0;
                          key_left_count++;
                          if(key_left_count >= 10)
                                {  
                                   pulse_BZ2();                 
                                   keynum = 2;
                                   key_right_count = 0;
                                   key_left_count = 0;
                           }
                   }
           }        
        }
   Aold = PINA;
   Bold = PINB;

         if(KEY1 == 0)
         {
                 if(KEY1 == 0)
                 {
                         while(!KEY1){;}//key1为1时才能跳出                                         
                         pulse_BZ2();
                         keynum = 3;
                 }
         }
}

这个是我修改后的程序,还是有那种问题
houcs 发表于 2015-9-18 19:34 | 显示全部楼层
将定时器中按键扫描,改下初值
 楼主| dingy 发表于 2015-9-18 19:35 | 显示全部楼层
sbit PINA=P1^2;
sbit PINB=P1^3;
sbit KEY1=P1^4;
 楼主| dingy 发表于 2015-9-18 19:35 | 显示全部楼层
void GetKey(void)
{         
    static uchar Aold,Bold;
    static uchar st;
    uchar key_right_count = 0; // 按键右旋计数,满N次,右旋一下
    uchar key_left_count = 0; // 按键左旋计数,满N次,左旋一下

        if(PINA&&PINB)
           st=1;
        if(st)                 
        {
          if(PINA==0&&PINB==0)
           {
                      if(Aold)
                   {
                             st=0;
                          key_right_count++;
                          if(key_right_count >= 10)
                                {
                                   pulse_BZ2();//蜂鸣器
                                   keynum = 1;        //用在MAIN.C中        
                                   key_right_count = 0;
                                   key_left_count = 0;
                            }
                   }
                   if(Bold)
                   {
                             st=0;
                          key_left_count++;
                          if(key_left_count >= 10)
                                {  
                                   pulse_BZ2();                 
                                   keynum = 2;
                                   key_right_count = 0;
                                   key_left_count = 0;
                           }
                   }
           }        
        }
   Aold = PINA;
   Bold = PINB;

         if(KEY1 == 0)
         {
                 if(KEY1 == 0)
                 {
                         while(!KEY1){;}//key1为1时才能跳出                                         
                         pulse_BZ2();
                         keynum = 3;
                 }
         }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

745

主题

10920

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部