打印
[51单片机]

旋转编码开关

[复制链接]
2898|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
尚善励挚|  楼主 | 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 | 只看该作者
没看懂,你程序就是有返回值!

使用特权

评论回复
5
wangch_sh| | 2014-11-25 09:03 | 只看该作者
你的意思是不是左旋时会加呀!

使用特权

评论回复
6
coody| | 2014-11-25 09:25 | 只看该作者
是楼主表述不清楚。。。所以,文字表述还是比较重要的。

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

是因为,编码开关部分识别处理不好。一般20脉冲一圈的可以做得很可靠,我用查询就可以了,不用外中断,外中断不好处理抖动的问题。

使用特权

评论回复
7
尚善励挚|  楼主 | 2014-11-25 09:47 | 只看该作者
luofeng2g 发表于 2014-11-25 08:52
没看懂,你程序就是有返回值!

不好意思,是我表达没说好

使用特权

评论回复
8
尚善励挚|  楼主 | 2014-11-25 09:47 | 只看该作者
wangch_sh 发表于 2014-11-25 09:03
你的意思是不是左旋时会加呀!

是的

使用特权

评论回复
9
尚善励挚|  楼主 | 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;
                 }
         }
}

这个是我修改后的程序,还是有那种问题

使用特权

评论回复
10
尚善励挚|  楼主 | 2014-11-25 09:53 | 只看该作者
sbit PINA=P1^2;
sbit PINB=P1^3;
sbit KEY1=P1^4;

使用特权

评论回复
11
尚善励挚|  楼主 | 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;
                 }
         }
}

使用特权

评论回复
12
尚善励挚|  楼主 | 2014-11-25 10:36 | 只看该作者
wangch_sh 发表于 2014-11-25 09:03
你的意思是不是左旋时会加呀!

求指点啊

使用特权

评论回复
13
尚善励挚|  楼主 | 2014-11-25 12:19 | 只看该作者
问题已解决 结贴给分

使用特权

评论回复
14
光晔秋秋| | 2014-11-25 20:51 | 只看该作者
问题说出来,学习下

使用特权

评论回复
15
尚善励挚|  楼主 | 2014-11-27 10:11 | 只看该作者
光晔秋秋 发表于 2014-11-25 20:51
问题说出来,学习下

上面程序没问题,将定时器中按键扫描,改下初值就好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

144

帖子

0

粉丝