📄 gpio_joystick.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 + -