原创 数字旋转编码开关的原理及使用方法

2010-9-13 10:26 4590 4 5 分类: 汽车电子

       在电子产品设计中,经常会用到旋转编码开关,比如数码电位器等,它的英文名翻译过来就是Rotary Encoder Switch。在写这个元件的驱动程序之前,我google、baidu了一些它的使用说明资料,知道了它具有左转、右转和按下三个功能,有五个脚,它的外形如下图所示:



   



(1)1、3脚要外接上拉电阻,一般10K就足矣;

(2)2脚一般接地就行;

(3)4、5脚是下按键的开关接线(按下时,4脚为低电平);

我调试这个元件时的实物接线示意图为:


 

其实它使用起来并不难,我看到网上的资料大都说操作它时判断正转和反转是一个难点,在这里我希望博友在看了我的代码后会觉得这其实只是一个“传说”!我的代码会把这个问题说的清清楚楚、简简单单的!我觉得其实判断正转和反转的关键就是:当BMA为低电平时,BMB的跳变沿是怎样的——上升沿表示正转,下降沿表示反转。只要用代码把这个描述清楚就OK了,这个器件就基本可以顺利地操作了。

没有多余的再说了,直接附上代码:

 

#include <reg52.h>

 


#define uchar unsigned char

#define uint  unsigned int

 


sbit BMA=P1^4;

sbit BMB=P1^5;

sbit BMC=P1^6;

sbit P27=P2^7;

sbit P26=P2^6;

sbit P25=P2^5;

 


uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

uchar count=0;

uchar flag;

uchar Last_BMB_status;

uchar Current_BMB_status;

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

void delay(uchar z)    //大约1ms的延时

{

    uchar x,y;

    for(x=z;x>0;x--)

     for(y=110;y>0;y--);

}

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

void display() //显示子程序

{

    P0=table[count%10];    //个位

    P27=0;

    delay(10);

    P27=1;

 


    P0=table[count%100/10];    //十位

    P26=0;

    delay(10);

    P26=1;

 


    P0=table[count/100];    //百位

    P25=0;

    delay(10);

    P25=1;

}

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

void main()

{

    TMOD="0x01";    //定时器0,工作方式1

    TH0=0xD8;

    TL0=0xF0;     //给定时器装上初值,10ms中断一次

    ET0=1;    //打开定时器中断

    EA =1;    //打开总中断

    TR0=1;    //启动定时器0

 


    while(1)

    {

        Last_BMB_status=BMB;


        while(!BMA)    //BMA为低电平时

        {

            Current_BMB_status=BMB;

            flag="1";    //标志位置为1说明编码开关被旋转了

        }


        if(flag==1)

        {

            flag="0";    //时刻要注意这一点!给标志位清零

            if((Last_BMB_status==0)&&(Current_BMB_status==1)) //BMB上升沿表示正转

            {

                count++;

                if(count==255)

                {

                    count="0";

                }

            }

            if((Last_BMB_status==1)&&(Current_BMB_status==0)) //BMB下降沿表示反转

            {

                count--;

                if(count==0)

                {

                    count="255";

                }

            }

        }

    }

}

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

void timer0() interrupt 1    //定时器0的中断服务程序

{

    TH0=0xD8;

    TL0=0xF0;    //再次装入初值

    display();   //每隔10ms显示一次

    if(!BMC)     //按下旋转编码开关则计数清零

    {

        count="0";

    }

}
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-5-24 06:40

谢谢
相关推荐阅读
用户1630269 2015-07-10 15:48
(转)色度副载波和声音载频
首先要明白什么是副载波?首先你把信号调制在载波1上,出于某种原因,你决定对这个结果再进行一次调制,于是你把这个结果去调制到另外一个更高频率的载波2。这里载波1就叫做副载波。具体到实例中,首先是亮度...
用户1630269 2010-09-13 10:45
单片机和嵌入式系统linux的区别
随着嵌入式行业硬件平台的性能增强,项目需求和功能日益复杂,ARM公司推出的 CORTEX-M3,更是让以往做单片机的工程师在芯片和技术选型面临两难选择,本专题将从芯片价格、整个系统的硬件软件设计及维护...
我要评论
1
4
关闭 站长推荐上一条 /3 下一条