[51单片机] 旋转编码开关

[复制链接]
 楼主| 尚善励挚 发表于 2014-11-25 08:15 | 显示全部楼层 |阅读模式
参考:
#include "reg51.h"
#define uint unsigned int

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;            //
}

在网上参考了这段程序,我发现,当旋转得过快的时候,会有返回值。请问怎么解决?
wangch_sh 发表于 2014-11-25 08:23 | 显示全部楼层
你不希望有返回值吗?
 楼主| 尚善励挚 发表于 2014-11-25 08:38 | 显示全部楼层
wangch_sh 发表于 2014-11-25 08:23
你不希望有返回值吗?

我是意思是,在屏幕上显示的数字,应该是左旋就--,右旋就++,可是我转动过快时,左旋的时候,会出现返回值的现象。
luofeng2g 发表于 2014-11-25 08:52 | 显示全部楼层
没看懂,你程序就是有返回值!
wangch_sh 发表于 2014-11-25 09:03 | 显示全部楼层
你的意思是不是左旋时会加呀!
coody 发表于 2014-11-25 09:25 | 显示全部楼层
是楼主表述不清楚。。。所以,文字表述还是比较重要的。

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

是因为,编码开关部分识别处理不好。一般20脉冲一圈的可以做得很可靠,我用查询就可以了,不用外中断,外中断不好处理抖动的问题。
 楼主| 尚善励挚 发表于 2014-11-25 09:47 | 显示全部楼层
luofeng2g 发表于 2014-11-25 08:52
没看懂,你程序就是有返回值!

不好意思,是我表达没说好
 楼主| 尚善励挚 发表于 2014-11-25 09:47 | 显示全部楼层
wangch_sh 发表于 2014-11-25 09:03
你的意思是不是左旋时会加呀!

是的
 楼主| 尚善励挚 发表于 2014-11-25 09:52 | 显示全部楼层
coody 发表于 2014-11-25 09:25
是楼主表述不清楚。。。所以,文字表述还是比较重要的。

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

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;
                 }
         }
}

这个是我修改后的程序,还是有那种问题
 楼主| 尚善励挚 发表于 2014-11-25 09:53 | 显示全部楼层
sbit PINA=P1^2;
sbit PINB=P1^3;
sbit KEY1=P1^4;
 楼主| 尚善励挚 发表于 2014-11-25 09:54 | 显示全部楼层
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;
                 }
         }
}
 楼主| 尚善励挚 发表于 2014-11-25 10:36 | 显示全部楼层
wangch_sh 发表于 2014-11-25 09:03
你的意思是不是左旋时会加呀!

求指点啊
 楼主| 尚善励挚 发表于 2014-11-25 12:19 | 显示全部楼层
问题已解决 结贴给分
光晔秋秋 发表于 2014-11-25 20:51 | 显示全部楼层
问题说出来,学习下
 楼主| 尚善励挚 发表于 2014-11-27 10:11 | 显示全部楼层
光晔秋秋 发表于 2014-11-25 20:51
问题说出来,学习下

上面程序没问题,将定时器中按键扫描,改下初值就好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

144

帖子

0

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