切换到宽版
  • 1951阅读
  • 5回复

[C51]ec11旋转编码器程序,不知哪里有问题解码不了20定位20脉冲的ec11,请大神修改下!! [复制链接]

上一主题 下一主题
离线taoghua
 

发帖
103
M币
1917
专家
4
粉丝
17
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2017-09-10
/*========================================  
本代码为编码开关代码,编码开关也就是数字音响中的  
360度旋转的数字音量以及显示器上用的(单键飞梭开  
关)等类似鼠标滚轮的手动计数输入设备。  
我使用的编码开关为5个引脚的,其中2个引脚为按下  
转轮开关(也就相当于鼠标中键)。另外3个引脚用来  
检测旋转方向以及旋转步数的检测端。引脚分别为a,b,c  
b接地a,c分别接到P2.0和P2.1口并分别接两个10K上拉  
电阻,并且a,c需要分别对地接一个104的电容,否则  
因为编码开关的触点抖动会引起轻微误动作。本程序不  
使用定时器,不占用中断,不使用延时代码,并对每个  
细分步数进行判断,避免一切误动作,性能超级稳定。  
我使用的编码器是APLS的EC11B可以参照附件的时序图  
编码器控制流水灯最能说明问题,下面是以一段流水  
灯来演示。  
(单片机为STC89C52)=================*/  
#include <REGX52.H>  
#include <intrins.h>  
#define uint unsigned int  
#define uchar unsigned char  
#define NULL 0  
  
uchar x,WheelOld;  
uchar Led=0xfe;//LED流水灯初始化  
  
/*定义一下端口为编码器开关输入端=========*/  
sbit PINA=P2^0;    //定义编码器连接的IO  
sbit PINB=P2^1;    ////定义编码器连接的IO  
  
/*过程返回==========*/  
uchar WheelLeft()      
{      
    //左转一步的操作  
    Led=_crol_(Led,1);          
   return(NULL);      
}    
uchar WheelRight()      
{      
    //右转一步的操作  
    Led=_cror_(Led,1);    
    return(NULL);      
}    
  
/*编码器过程====================*/  
uchar EncoderProcess()  
{      
    uchar keytmp,keytmp1,keytmp2,WheelNow;  
  
    PINA=1; //PINA至高电平  
    PINB=1;//PINB至高电平  
    if(PINA==1) //如果PINA为高电平  
        {  
        keytmp1=0x01;  
        }  
    else keytmp1=0;    
    
    if(PINB==1) //如果PINB为高电平  
        {  
        keytmp2=0x02;  
        }        
    else keytmp2=0;
    
    WheelNow=keytmp1+keytmp2; //根据两个IO组合成16进制数为0x00|0x01|0x02|0x03  的旋转状态
    keytmp=WheelNow;  
    keytmp^=WheelOld;            //判断新数据同旧数据  
    if(keytmp==0)
    return(NULL); //如果新数据和原来的数据一样 就直接退出      
    if(WheelOld==0 && WheelNow==0x01)  
        {  
        x=WheelNow;  
        }  
  
    if(WheelOld==0 && x==0x01 && WheelNow==0x03)  
        {  
        WheelOld=WheelNow;  
        x=0;  
        return(WheelLeft()); //左旋转00 01 03  
        }  
  
    if(WheelOld==0x03 && WheelNow==0x02)  
        {  
        x=WheelNow;  
        }  
  
    if(WheelOld==0x03 && x==0x02 && WheelNow==0x00)  
        {  
        WheelOld=WheelNow;  
        x=0;  
        return(WheelLeft()); //左旋转03 02 00  
        }  
  
    if(WheelOld==0 && WheelNow==0x02)  
        {  
        x=WheelNow;  
        }  
  
    if(WheelOld==0 && x==0x02 && WheelNow==0x03)  
        {  
        WheelOld=WheelNow;  
        x=0;          
        return(WheelRight());  //右旋转00 02 03  
        }  
  
    if(WheelOld==0x03 && WheelNow==0x01)  
        {  
        x=WheelNow;  
        }  
  
    if(WheelOld==0x03 && x==0x01 && WheelNow==0x00)  
        {  
        WheelOld=WheelNow;  
        x=0;      
        return(WheelRight());  //右旋转03 01 00  
        }  
  
  
}  
void main()  
{      
      
      
    while (1)  
    {  
    EncoderProcess();  
    P0=Led; //流水灯连接的IO  
    }  
}  
本帖最近打赏记录:共1条打赏M币+6

发帖
502
M币
924
专家
11
粉丝
15
只看该作者 1楼 发表于: 2017-09-10
Re:ec11旋转编码器程序,不知哪里有问题解码不了20定位20脉冲的ec11,请大神修改下 ..
去年底我也学会使用这个,也是用端口查询法。不过我用的是汇编语言。还有一小问题没有解决,就是旋转开关还没扭到位,停在中间时,单片机会不断查询,而导致显示部分在闪啊闪。
离线292285967

发帖
581
M币
686
专家
3
粉丝
27
只看该作者 2楼 发表于: 2017-09-10
Re:ec11旋转编码器程序,不知哪里有问题解码不了20定位20脉冲的ec11,请大神修改下 ..
我也自己写了个,但是非常不稳定。没有什么好的算法
离线lxa0

发帖
1125
M币
351
专家
10
粉丝
42
只看该作者 3楼 发表于: 01-13
回 广东梁百万 的帖子
广东梁百万:去年底我也学会使用这个,也是用端口查询法。不过我用的是汇编语言。还有一小问题没有解决,就是旋转开关还没扭到位,停在中间时,单片机会不断查询,而导致显示部分在闪啊闪。 (2017-09-10 17:27) 回 广东梁百万 的帖子

看到你玩过旋转编码器,用的是汇编。厉害!
这几天我也在研究旋转编码器,我也是用汇编,能交流一下吗?

发帖
502
M币
924
专家
11
粉丝
15
只看该作者 4楼 发表于: 01-13
回 lxa0 的帖子
lxa0:看到你玩过旋转编码器,用的是汇编。厉害!
这几天我也在研究旋转编码器,我也是用汇编,能交流一下吗? (2018-01-13 14:59) 回 lxa0 的帖子

可以交流,我另一贴子有内容。
离线lxa0

发帖
1125
M币
351
专家
10
粉丝
42
只看该作者 5楼 发表于: 01-13
回 广东梁百万 的帖子
广东梁百万:可以交流,我另一贴子有内容。 (2018-01-13 20:19) 回 广东梁百万 的帖子

加个微信吗?
快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个