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

📄 shuttle_scan.c

📁 旋转编码开关(飞梭)
💻 C
字号:
/*
*******************************************************************************
*                     (c) Copyright 2008 
*                             All Rights Reserved
*
*                                   Version V1.00
*
* Product Number: 
* Compiler Tool : 
* MCU		: 
* File 		: Shuttle_Scan.c
* By   		: Tom.Yin
* Date 		: 
*******************************************************************************
*/

/*
*******************************************************************************
* 			          INCLUDE FILE
*******************************************************************************
*/
#include "Include.h"


/*
*******************************************************************************
*				      GLOBAL 
*******************************************************************************
*/
unsigned char New_Shuttle_Flg;
signed char Shuttle_Code;

/*
*******************************************************************************
* 		             LOCAL DEFINE
*******************************************************************************
*/
#define STATE_0_MASK                     	(((INT32U)BIN(00000000) << 24) + ((INT32U)BIN(00000000) << 16) + ((INT32U)BIN(00000000) << 8) + BIN(00000000))
#define STATE_1_MASK                     	(((INT32U)BIN(00000100) << 24) + ((INT32U)BIN(00000000) << 16) + ((INT32U)BIN(00000000) << 8) + BIN(00000000))
#define STATE_2_MASK                     	(((INT32U)BIN(00000100) << 24) + ((INT32U)BIN(00010000) << 16) + ((INT32U)BIN(00000000) << 8) + BIN(00000000))
#define STATE_3_MASK                     	(((INT32U)BIN(00000000) << 24) + ((INT32U)BIN(00010000) << 16) + ((INT32U)BIN(00000000) << 8) + BIN(00000000))

#define SHUTTLE_IO_MASK                  	(((INT32U)BIN(00000100) << 24) + ((INT32U)BIN(00010000) << 16) + ((INT32U)BIN(00000000) << 8) + BIN(00000000))

#define STATE_MACHINE_CLOCKWISE_A			(STATE_0 << 8 | STATE_1 << 4 | STATE_2)
#define STATE_MACHINE_CLOCKWISE_B			(STATE_2 << 8 | STATE_3 << 4 | STATE_0)

#define STATE_MACHINE_ANTICLOCKWISE_A		(STATE_0 << 8 | STATE_3 << 4 | STATE_2)
#define STATE_MACHINE_ANTICLOCKWISE_B		(STATE_2 << 8 | STATE_1 << 4 | STATE_0)

enum
{
	STATE_0,
	STATE_1,
	STATE_2,
	STATE_3,
};

/*
*******************************************************************************
* 		             LOCAL PARAMETER
*******************************************************************************
*/
static unsigned int Shuttle_State_Machine;
static unsigned char Actual_State;
static unsigned char Current_State;

/*
*******************************************************************************
* 		            FUNCTION DECLARE
*******************************************************************************
*/
void Shuttle_IO_Config(void);
unsigned char Get_State(void);
void Init_Shuttle(void);
void Shuttle_Scan(void);


/*
*******************************************************************************
*                             Shuttle_IO_Config
* Description: Shuttle IO Config
*
* Arguments  : None
*
* Returns    : None
* 
* Programers : Tom.Yin
*
* Date	     : 
*
*******************************************************************************
*/
void Shuttle_IO_Config(void)
{
	SET_PIN_DIR(GPIO_0_20, INPUT_ATTRIBUTE);		//encoder pin1
	SET_PIN_DIR(GPIO_0_26, INPUT_ATTRIBUTE);		//encoder pin3
}

/*
*******************************************************************************
*                             Get_State
* Description: Get actual shuttle pin state
*
* Arguments  : None
*
* Returns    : shuttle state(STATE_0...STATE_3)
* 
* Programers : Tom.Yin
*
* Date	     : 
*
*******************************************************************************
*/
unsigned char Get_State(void)
{
	unsigned int scan_dat;
	
	scan_dat	= IOPIN0 & SHUTTLE_IO_MASK;
	
	if (scan_dat == STATE_0_MASK)
	{
		return STATE_0;
	}
	
	if (scan_dat == STATE_1_MASK)
	{
		return STATE_1;
	}
	
	if (scan_dat == STATE_2_MASK)
	{
		return STATE_2;
	}
	
	if (scan_dat == STATE_3_MASK)
	{
		return STATE_3;
	}
	else
	{
		return STATE_0;
	}
}

/*
*******************************************************************************
*                             Init_Shuttle
* Description: Init Shuttle Module
*
* Arguments  : None
*
* Returns    : None
* 
* Programers : Tom.Yin
*
* Date	     : 
*
*******************************************************************************
*/
void Init_Shuttle(void)
{
	unsigned char state;
	
	Shuttle_IO_Config();
	state					= Get_State();
	Shuttle_State_Machine	= (state << 8) | (state << 4) | state;
	Actual_State			= state;
	Current_State			= state;
	New_Shuttle_Flg			= false;
	Shuttle_Code			= SHUTTLE_HOLDE_STILL;
}

/*
*******************************************************************************
*                             Shuttle_Scan
* Description: Shuttle Scan, this function will call by 1ms Interrutp
*
* Arguments  : None
*
* Returns    : None
* 
* Programers : Tom.Yin
*
* Date	     : 
*
*******************************************************************************
*/
void Shuttle_Scan(void)
{
	if (New_Shuttle_Flg == false)
	{
		Shuttle_Code = SHUTTLE_HOLDE_STILL;
	}
	
	Actual_State	= Get_State();
	
	if (Actual_State != Current_State)
	{
		Current_State			= Actual_State;
		Shuttle_State_Machine	= (Shuttle_State_Machine << 4) & 0xFFF;
		Shuttle_State_Machine	= Shuttle_State_Machine + Current_State;
		
		if (Shuttle_State_Machine == STATE_MACHINE_CLOCKWISE_A || Shuttle_State_Machine == STATE_MACHINE_CLOCKWISE_B)
		{
			Shuttle_Code++;
			New_Shuttle_Flg	= true;
		} 
		else if (Shuttle_State_Machine == STATE_MACHINE_ANTICLOCKWISE_A || Shuttle_State_Machine == STATE_MACHINE_ANTICLOCKWISE_B)
		{
			
			Shuttle_Code--;
			New_Shuttle_Flg	= true;
		}
	}
}




⌨️ 快捷键说明

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