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

📄 gpio_joystick.c

📁 SPG290 上SD卡读取写入程序源代码
💻 C
字号:
/******************************************************************************
 *
 *     The information contained herein is the exclusive property of
 *   Sunplus Technology Co. And shall not be distributed, reproduced,
 *   or disclosed in whole in part without prior written permission.
 *
 *         (C) COPYRIGHT 2005   SUNPLUS TECHNOLOGY CO.
 *                        ALL RIGHTS RESERVED
 *
 * The entire notice above must be reproduced on all authorized copies.
 *
 *****************************************************************************/

/******************************************************************************
 *  Filename:   	GPIO_joystick.c
 *  Author:     	xydeng  (eMail:  xydeng@sunplus.com)
 *  Tel:        	00885-028-87848688-5884
 *  Date:       	2005-11-14
 *  Description:	
 *  Reference:
 *  Version history:
 *-----------------------------------------------------------------------------
 *	Version   YYYY-MM-DD-INDEX   Modified By         Description
 *	1.0.0     2005-11-14          xydeng               Create
 *
 *****************************************************************************/

#include "Include/GPIO_Joystick.h"
#include "Include/ADC_Control.h"
 
//============================================================================
U32 g_Joystick_KeyCode1;		//the joystick key code
U32 g_Joystick_KeyCode2;		//the joystick key code
//=============================================================================

U32 g_Joystick_KeyCodeX;		//the joystick key code
U32 g_Joystick_KeyCodeY;		//the joystick key code

U32 g_Joystick_KeyCodeX_temp1;
U32 g_Joystick_KeyCodeX_temp2;
U32 g_Joystick_KeyCodeY_temp1;
U32 g_Joystick_KeyCodeY_temp2;
U32 DebounceCnt;
U32 DebounceCntY;
U32 DetectPosition;
U32 Location;

/* unsigned int x4=0,x8=0,x12=0,x15=0;
unsigned int y4=0,y8=0,y12=0,y15=0; */
//unsigned int p[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

			  
#define 		JOYSTICK_X1			bit1
#define 		JOYSTICK_X2			bit5
#define 		JOYSTICK_Y1			bit6
#define 		JOYSTICK_Y2			bit7

#define		Position_X_Ready	bit1
#define		Position_Y_Ready	bit2

void InitJoystick(void)
{	
	g_Joystick_KeyCode1 = 0;
	g_Joystick_KeyCode2 = 0;
	g_Joystick_KeyCodeX = 0;
	g_Joystick_KeyCodeY = 0;
	DebounceCnt = 0;
}

void GetTouchKeyCode(void)
{
	unsigned int i=0;
//	unsigned int readbuf[8];
	unsigned int status;
	unsigned int counter;
	unsigned int tempvalue;
	unsigned int tempX;
	unsigned int tempY;

	if((DetectPosition&0x0001) == 0)
	{	
		g_Joystick_KeyCodeX = 0;
		counter = 0;
		
   		//Detect axis X
		//ADC settings
		*P_ADC_SETUP = ANA_AD_POWON | ANA_AD_ON | ANA_MIC_OFF | ANA_MICBST_OFF | ANA_MICBIAS_OFF | ANA_ADV_INT | 
					   ANA_AD_CHANNEL6;
		*P_AM_CTRL2 = DIG_ADCIRQ_CLR | DIG_ADCIRQ_DIS | DIG_ASPIRQ_CLR | DIG_ASPIRQ_DIS | DIG_MICIRQ_CLR | 
					  DIG_MICIRQ_DIS | FIFO_ERR_CLR;
		*P_AM_CTRL1 = DIG_AD_ON | DIG_AD_AUTO | DIG_MICSIGN_OFF | DIG_MICMUTE_OFF | DIG_DMASIZE_32 | 
				      DIG_SMART_OFF | DIG_FIFO_L3;
		for(i = 0; i <100000; i++);		// Wait for ADC stable
		
		*P_ADC_GPIO_OE = (JOYSTICK_X1<<8) | (JOYSTICK_X2<<8);	// ADC0&2 as output, ADC3&4 as input
		*P_ADC_GPIO_AEN = 0x1D | JOYSTICK_X1 | JOYSTICK_X2;
		*P_ADC_GPIO_OE |= JOYSTICK_X1;							// ADC0 output high, ADC2 output low
		*P_ADC_GPIO_OE &= ~JOYSTICK_X2;
		
 		while(1)
		{
			while((*P_AM_CTRL2 & 0x20000000) == 0);
			tempvalue = 0;
			for(i=0;i<4;i++)
				tempvalue += (unsigned int)(*P_ASP_DATA)>>8;
			tempvalue /= i;
			status = *P_AM_CTRL2;
			*P_AM_CTRL2 = (status & 0x20000000);
			
			tempX = tempvalue >> 18;
			g_Joystick_KeyCodeX_temp2 += tempX;
			
			counter++;
			if(counter >= 4)
			{	
				g_Joystick_KeyCodeX_temp2 /= counter;
				counter = 0;
				break;
			}
		}
		*P_AM_CTRL1 = DIG_AD_OFF | DIG_AD_AUTO | DIG_MICSIGN_OFF | DIG_MICMUTE_OFF | DIG_DMASIZE_32 | 
				    DIG_SMART_ON | DIG_FIFO_L3;
		
		if(g_Joystick_KeyCodeX_temp1 == g_Joystick_KeyCodeX_temp2)
		{
			DebounceCnt++;
			g_Joystick_KeyCodeX_temp2 = 0;
		}
		else
		{
			DebounceCnt = 0;
			DetectPosition &= ~Position_X_Ready;
			g_Joystick_KeyCodeX_temp1 = g_Joystick_KeyCodeX_temp2;
			g_Joystick_KeyCodeX_temp2 = 0;
		}

		if(DebounceCnt >= 1)
		{
			DebounceCnt = 0;
			DetectPosition |= Position_X_Ready;
			g_Joystick_KeyCodeX = g_Joystick_KeyCodeX_temp1;
			g_Joystick_KeyCodeX_temp2 = 0;
			DetectPosition |= 0x0001;
		}
	}
	else
	{
		g_Joystick_KeyCodeY = 0;
		counter = 0;
		
   		//Detect axis Y 
		//ADC settings
		*P_ADC_SETUP = ANA_AD_POWON | ANA_AD_ON | ANA_MIC_OFF | ANA_MICBST_OFF | ANA_MICBIAS_OFF | ANA_ADV_INT | 
					   ANA_AD_CHANNEL1;
		*P_AM_CTRL2 = DIG_ADCIRQ_CLR | DIG_ADCIRQ_DIS | DIG_ASPIRQ_CLR | DIG_ASPIRQ_DIS | DIG_MICIRQ_CLR | 
					  DIG_MICIRQ_DIS | FIFO_ERR_CLR;
		*P_AM_CTRL1 = DIG_AD_ON | DIG_AD_AUTO | DIG_MICSIGN_OFF | DIG_MICMUTE_OFF | DIG_DMASIZE_32 | 
				      DIG_SMART_OFF | DIG_FIFO_L3;
		for(i = 0; i <100000; i++);		// Wait for ADC stable
		
		*P_ADC_GPIO_OE = (JOYSTICK_Y1<<8) | (JOYSTICK_Y2<<8);	// ADC3&4 as output, ADC0&2 as input
		*P_ADC_GPIO_AEN = 0x1D | JOYSTICK_Y1 | JOYSTICK_Y2;
		*P_ADC_GPIO_OE |= JOYSTICK_Y1;							// ADC3 output high, ADC4 output low
		*P_ADC_GPIO_OE &= ~JOYSTICK_Y2;
		
		while(1)
		{
			while((*P_AM_CTRL2 & 0x20000000) == 0);
			tempvalue = 0;
			for(i=0;i<4;i++)
				tempvalue += (unsigned int)(*P_ASP_DATA)>>8;
			tempvalue /= i;
			status = *P_AM_CTRL2;
			*P_AM_CTRL2 = (status & 0x20000000);
			
			tempY = tempvalue >> 18;		
			g_Joystick_KeyCodeY_temp2 += tempY;
			
			counter++;
			if(counter >= 4)
			{	
				g_Joystick_KeyCodeY_temp2 /= counter;
				counter = 0;
				break;
			}
		}
		*P_AM_CTRL1 = DIG_AD_OFF | DIG_AD_AUTO | DIG_MICSIGN_OFF | DIG_MICMUTE_OFF | DIG_DMASIZE_32 | 
				    DIG_SMART_ON | DIG_FIFO_L3;
		
		if(g_Joystick_KeyCodeY_temp1 == g_Joystick_KeyCodeY_temp2)
		{
			DebounceCntY++;
			g_Joystick_KeyCodeY_temp2 = 0;
		}
		else
		{
			DebounceCntY = 0;
			DetectPosition &= ~Position_Y_Ready;
			g_Joystick_KeyCodeY_temp1 = g_Joystick_KeyCodeY_temp2;
			g_Joystick_KeyCodeY_temp2 = 0;
		}

		if(DebounceCntY >= 1)
		{
			DebounceCntY = 0;
			DetectPosition |= Position_Y_Ready;
			g_Joystick_KeyCodeY = g_Joystick_KeyCodeY_temp1;
			g_Joystick_KeyCodeY_temp2 = 0;
			DetectPosition &= ~0x0001;
		}
	}
	
	if( (DetectPosition&Position_X_Ready)!=0 && (DetectPosition&Position_Y_Ready)!=0)
			{
				//Location = Position[g_Joystick_KeyCodeX][g_Joystick_KeyCodeY];
 				
 				if(g_Joystick_KeyCodeX<=29 && g_Joystick_KeyCodeX>=23)
 				{
 					if(g_Joystick_KeyCodeY<=28 && g_Joystick_KeyCodeY>=22)
 						Location = KEY_LEFTUP;
 					else if(g_Joystick_KeyCodeY<=21 && g_Joystick_KeyCodeY>=16)
 						Location = KEY_LEFT;
 					else if(g_Joystick_KeyCodeY<=15 && g_Joystick_KeyCodeY>=10)
 						Location = KEY_LEFTDOWN;
 				}
 				if(g_Joystick_KeyCodeX<=22 && g_Joystick_KeyCodeX>=17)
 				{
 					if(g_Joystick_KeyCodeY<=28 && g_Joystick_KeyCodeY>=22)
 						Location = KEY_UP;
 					else if(g_Joystick_KeyCodeY<=15 && g_Joystick_KeyCodeY>=10)
 						Location = KEY_DOWN;
 				}
 				if(g_Joystick_KeyCodeX<=16 && g_Joystick_KeyCodeX>=10)
 				{
 					if(g_Joystick_KeyCodeY<=28 && g_Joystick_KeyCodeY>=22)
 						Location = KEY_RIGHTUP;
 					else if(g_Joystick_KeyCodeY<=21 && g_Joystick_KeyCodeY>=16)
 						Location = KEY_RIGHT;
 					else if(g_Joystick_KeyCodeY<=15 && g_Joystick_KeyCodeY>=10)
 						Location = KEY_RIGHTDOWN;
 				}
 				
 				DetectPosition &= ~Position_X_Ready;
				DetectPosition &= ~Position_Y_Ready; 
			}
}

/* #define 		KEY_UP						0xf7
#define 		KEY_DOWN					0xfb
#define 		KEY_LEFT					0xfd
#define 		KEY_RIGHT					0xfe
#define 		KEY_LEFTUP					0xf5
#define 		KEY_RIGHTUP					0xf6
#define 		KEY_LEFTDOWN				0xf9
#define 		KEY_RIGHTDOWN				0xfa */



/* #include "Include/GPIO_Joystick.h"
 
//============================================================================
U32 g_Joystick_KeyCode1;		//the joystick key code
U32 g_Joystick_KeyCode2;		//the joystick key code
//=============================================================================
void InitJoystick(void)
{
	*P_ADC_GPIO_OE |= (JOYSTICK_OUT1<<8) | (JOYSTICK_OUT2<<8) | (JOYSTICK_CLK<<8) | (JOYSTICK_STB<<8);				//set JOYSTICK_OUT1 & JOYSTICK_OUT2 input	
	*P_ADC_GPIO_AEN = 0xfa;
	
	g_Joystick_KeyCode1 = 0;
	g_Joystick_KeyCode2 = 0;
}
*/
void GetJoystickKeyCode(void)
{
	unsigned int i;

	g_Joystick_KeyCode1 = 0;
	g_Joystick_KeyCode2 = 0;	
	
	*P_ADC_GPIO_OE = 0xffff1d00;				//set JOYSTICK_OUT1 & JOYSTICK_OUT2 input	
	*P_ADC_GPIO_AEN = 0xfa;

	*P_ADC_GPIO_OE |= JOYSTICK_STB;										//JOYSTICK_STB Pin Hight

	g_Joystick_KeyCode1 |= (*P_ADC_GPIO_IN & JOYSTICK_OUT1) / JOYSTICK_OUT1 ;	
	g_Joystick_KeyCode2 |= (*P_ADC_GPIO_IN & JOYSTICK_OUT2) / JOYSTICK_OUT2 ;

	g_Joystick_KeyCode1 = g_Joystick_KeyCode1 << 1;
	g_Joystick_KeyCode2 = g_Joystick_KeyCode2 << 1;
	
	*P_ADC_GPIO_OE &= ~JOYSTICK_STB;										//JOYSTICK_STB Pin low		
	
	*P_ADC_GPIO_OE &= ~JOYSTICK_CLK;										//JOYSTICK_CLK Pin low	
	
	for(i = 0; i < 7; i++)
	{
		*P_ADC_GPIO_OE |= JOYSTICK_CLK;										//JOYSTICK_CLK Pin hight						
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
				
		g_Joystick_KeyCode1 |= (*P_ADC_GPIO_IN & JOYSTICK_OUT1) / JOYSTICK_OUT1 ;	
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		
		g_Joystick_KeyCode2 |= (*P_ADC_GPIO_IN & JOYSTICK_OUT2) / JOYSTICK_OUT2 ;
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		asm("nop!\t\n nop!");
		
		g_Joystick_KeyCode1 = g_Joystick_KeyCode1 << 1;
		g_Joystick_KeyCode2 = g_Joystick_KeyCode2 << 1;
		*P_ADC_GPIO_OE &= ~JOYSTICK_CLK;									//JOYSTICK_CLK Pin low			
	}
	g_Joystick_KeyCode1 = g_Joystick_KeyCode1 >> 1;
	g_Joystick_KeyCode2 = g_Joystick_KeyCode2 >> 1;		
} 


 

⌨️ 快捷键说明

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