旋转编码开关用法

来源:互联网 发布:多迪网络是培训机构吗 编辑:程序博客网 时间:2024/05/02 09:16

旋转编码开关用法

By:陈浩

 

5脚的ALPS

 

具有左转,右转,按下三个功能。45脚是中间按下去的开关接线  1 2 3一般是中间2脚接地,13脚上拉电阻后,当左转、右转旋纽时,在13脚就有脉冲信号输出了。这是标准资料:



在单片机编程时,左转和右转的判别是难点,用示波器观察这种开关左转和右转时两个输出脚的信号有个相位差,见下图:

CW direction
顺时针方向

 

程序:

 


/**********************************************************                                                                     

扫描编码开关子函数  by                                                            

正转(时钟方向)

11

10

00

01

 

11     //开始第二角度

10

……

 

反转(时钟反方向)

11

01

00

10

 

11   //开始第二角度

01

……

 

程序从00开始 

 

如果还是00则等待如果在延时这么长时间0ffff*yans(1)还是00 则返回  (如果转的速度非常快,则可使减小;相反亦然)

如果收到01则正转加1返回

如果收到10则反转减1返回

如果收到11则错误   返回     11为静止时状态,  00状态下必须经过01(正转)或10(反转)状态后,才能到11状态

                                                                                                                                    

**********************************************************/

unsigned char DUAJ()

{

         unsigned int i;

         static bitsszt=AX;      //SS状态

//       while(1)

//       {

                   if(BMA==0&&BMB==0)              //收到0 0后开始判断

                   {

                            for(i=0;i<0xfff0;i++)

                            {

                                     if(BMA==AX&&BMB==AX)                  //状态未变,等待

                                               yans(1);

                                     elseif(BMA==AX&&BMB==TQ)         //正转

                                               return0xbf;

                                     elseif(BMA==TQ&&BMB==AX)         //反转

                                               return0xdf;

                                     if(BMA==TQ&&BMB==TQ)                  //错误

                                               return0xff;

                            }

                   }

                   elseif(AX==BMC)

                            return0xef;

//                 elseif(0==FUNC)

//                       return0x1f;        

                   elseif(sszt==SS)

                   {       

                            sszt=~sszt;

                         return0x7f;

                   }

//                 else

                            return0xff;

//                kmg();

//       }       

}

unsigned char capd(unsigned char jz)   //0短按  1长按 2更长按返回的值越大,按的越长。

{

         unsigned int i;

         for(i=0;i<60000;i++)

         {

                   yans(20);

                   if(DUAJ()!=jz)   //短按就返回

                                     return(unsigned char)(i/250);           

         }

         return 0xff;

}

 



原创粉丝点击