嵌入式之EC11编码开关


一、编码开关原理?


在这里插入图片描述

--------------有趣的是顺时针方向A端子比B端子快半个周期,而逆时针方向A端子比B端子慢半个周期

二、示例代码

1.头文件

代码如下(示例):

#ifndef	__EC11_H_
#define	__EC11_H_

void EC11_Key_Detect(void);


#define	K1			_pc0	//根据自己所使用的芯片规则定义
#define	K1A			_pc2	//根据自己所使用的芯片规则定义
#define	K1B			_pc1	//根据自己所使用的芯片规则定义
//如果实际的正转和反转方向不对可以把K1A和K1B引脚定义调换
#define	TIME_OF_ROTATION	2	//根据自己所使用的编码器的灵敏度和芯片的主频来设定

#endif

2.C文件

代码如下(示例):

#include "EC11.h"

void EC11_Key_Detect(void)
{
	
		static  unsigned char input_status=0;
		static	unsigned char last_status=0;
		static	unsigned char Left_status=0;
		static	unsigned char right_status=0;	

		//	根据原理图可以知道关键点在以下的4个状态
				
		if(K1A) {
	
			if(K1B)				input_status=1;		//11
			else if(!K1B)		input_status=2;		//10
			
		}
		else 	if(!K1A) {
			
			if(K1B)				input_status=3;	//01
			else if(!K1B)		input_status=4;	//00
			
		}
		//

		if(last_status != input_status) {
	
	
			if(input_status == 2 && last_status == 1)	{
				
				
				++Left_status;		right_status=0;
			}
			else if(input_status == 4 && last_status == 2)	{
				
				++Left_status;		right_status=0;
					
			}
			else if(input_status == 3 && last_status == 4)	{
				
				++Left_status;		right_status=0;
					
			}
			else if(input_status == 1 && last_status == 3)	{
				
				++Left_status;		right_status=0;
					
			}	//反转
			else	if(input_status == 3 && last_status == 1)	{
				
				++right_status;		Left_status=0;
					
			}
			else if(input_status == 4 && last_status == 3)	{
				
				++right_status;		Left_status=0;	
					
			}
			else if(input_status == 2 && last_status == 4)	{
					
				++right_status;		Left_status=0;
			}
			else if(input_status == 1 && last_status == 2)	{
				
				++right_status;		Left_status=0;
					
			}	//正转
			
			
			if(Left_status >= TIME_OF_ROTATION || right_status >= TIME_OF_ROTATION ) { //防抖动
			
				if(Left_status >= TIME_OF_ROTATION) {
						
					;	//执行左旋的功能
					
				}
				else if(right_status >= TIME_OF_ROTATION) {
					
					;	//执行右旋的功能
				
				}
			
				Left_status=0;
				right_status=0;	
		
			
				
			}
			last_status=input_status;

	
		}//last_status != input_status
	
	
		
	
}

电路设计

例如:R9 R12 为上拉电阻 C11 C12为下拉电容 大家可以适当调整阻值和容值 (感兴趣的可以尝试)。

在这里插入图片描述

总结

本人抱着学习的心态 , 欢迎大家指教 , 无论是代码或者电路方面的疑问或者存在错误 , 本人乐意解答和学习,欢迎加本人QQ 243700588

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值