旋转编码开关(Rotary Encoder switch)_lovebluetears_新浪博客

这种旋转编码开关(Rotary Encoder switch),一个使用3脚的,后面一个使用5脚的,大家可能对这种玩意都不是很了解,但涉及到有调整的地方,这个玩意使用真是很爽。

5脚的ALPS:

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

着这是标准资料:

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

旋转编码开关(Rotary Encoder switch) - Even - 没有陌生人的世界

由此可见,如果输出1为高电平时,输出2出现一个高电平,这时开关就是向顺时针旋转; 当输出1 为高电平,输出2出现一个低电平,这时就一定是逆时针方向旋转.

所以,在单片机编程时只需要判断当输出1为高电平时,输出2当时的状态就可以判断出是左旋转或是右旋转了。

还有另外一种3脚的,除了不带按钮开关外,和上面是一样的使用。

参考:

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

}

//编码器计数程序

void encoder_cnt(void)

{

        uchar temp;

        temp = PIND; //取端口D管脚信号

        couch_clr = (temp & 0x08); //取编码器清零信号

        if(couch_clr != false) //有编码器清零信号

        {

                couch_num = 0; //水平床码清零

        }

        else

        {

                if(encoder_cnt_en == false) //编码器计数模块没有启动

                {

                        pr_couch_ba = temp & 0x03; //取编码器A、B相电平信号

                }

                else

                {

                        couch_ba = temp & 0x03; //取编码器A、B相电平信号

                        if(pr_couch_ba == 0x00)

                        {

                                if(couch_ba == 0x01)

                                {

                                        couch_num++; //水平床码加1

                                }

                                else if(couch_ba == 0x10)

                                {

                                        couch_num--; //水平床码减1

                                }

                        }

                        else if(pr_couch_ba == 0x01)

                        {

                                if(couch_ba == 0x11)

                                {

                                        couch_num++; //水平床码加1

                                }

                                else if(couch_ba == 0x00)

                                {

                                        couch_num--; //水平床码减1

                                }

                        }

                        else if(pr_couch_ba == 0x10)

                        {

                                if(couch_ba == 0x00)

                                {

                                        couch_num++; //水平床码加1

                                }

                                else if(couch_ba == 0x11)

                                {

                                        couch_num--; //水平床码减1

                                }

                        }

                        else if(pr_couch_ba == 0x11)

                        {

                                if(couch_ba == 0x10)

                                {

                                        couch_num++; //水平床码加1

                                }

                                else if(couch_ba == 0x01)

                                {

                                        couch_num--; //水平床码减1

                                }

                        }

                }

                pr_couch_ba = couch_ba;

        }

}

编码器及其计数模块原理

 

飘扬的旋转编码器的检测程序(MCS51)

//旋转编码器检测程序,A/B信号分别接在了INT0和INT1上

//程序作者:BG4UVR

//2005年1月15用KEIL编译、硬件测试通过

//注意:编码器的信号,程序未做消抖处理。测试中,A/B信号上各

//接了一只104的瓷片电容,工作很正常。如果不接电容,请自行编

//写信号消抖程序。

#include <at89x51.h>

sbit led="0xB1";//有一只LED接在了RXD引脚上,用来指示正反转;

main()

{

EA=1; //总中断允许

EX0=1; //外部中断0允许

IT0=1; //外部中断0为边沿触发方式

while(1);;

}

 

void encoder(void) interrupt 0 { //外部中断0

if (INT1){

led=1;

}else{

led=0;

}

}

whimsy 的AVR程序

//外部中断0,用于编码开关解码,解码图:   A接中断脚(AVR的PD2),以此为基准,B用来判断方向(连到AVR的PA1), C接地

//A -|

//    -----|__________|----------|____________

//C -|

//

//B -|

//    ----------|__________|----------|____________

//C -|  

//             CW  ===>>> ROTATION

//外部中断设置(ISC01=0,ISC00=1): INT0 引脚上任意的逻辑电平变化都将引发中断

#pragma interrupt_handler int0_isr:2

void int0_isr(void)

{

//external interupt on INT0

    GICR=0;    //禁止外部中断

    if ((PIND & 0x04)==0)           //先判断是高电平产生的中断还是低点平的中断

                if ((PINA & 0x02)==0)         //再判断B线上的电平

                    {

                    keycounter--;      

                     keydirection="0";

                     

                else

                    {

                     keycounter++;

                     keydirection="1";

                             

                

        else

             if ((PINA & 0x02)==0)

            {

             keycounter++;  

             keydirection="1";

             

          else

           {

            keycounter--;

            keydirection=0;

           }

        GICR=0x40;

}

郑重声明:资讯 【旋转编码开关(Rotary Encoder switch)_lovebluetears_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——