⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 编码器代码.c

📁 本代码为编码开关代码
💻 C
字号:
// Header:	编码开关代码
// File Name: Encoder
// Author:	李波
// Date: 2009-04-19  17:00
/*========================================
本代码为编码开关代码,编码开关也就是数字音响中的
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 10
		}


}
void main()
{	
	
	
	while (1)
	{
	EncoderProcess();
	P0=Led;	//流水灯连接的IO
	}
}

	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -