?? 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"
//#define LCD_360 1
//#define LCD_236 1
//============================================================================
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;
/* 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 = JOYSTICK_Y1 | JOYSTICK_Y2;
*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 = JOYSTICK_X1 | JOYSTICK_X2;
*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;
}
}
/* #ifdef LCD_360
if( (DetectPosition&Position_X_Ready)!=0 && (DetectPosition&Position_Y_Ready)!=0)
{
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;
}
#endif
*/
//#ifdef LCD_236
if( (DetectPosition&Position_X_Ready)!=0 && (DetectPosition&Position_Y_Ready)!=0)
{
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>=14)
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<=13 && g_Joystick_KeyCodeX>=5)
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;
}
//#endif
}
void GetJoystickKeyCode(void)
{/*
unsigned int i;
g_Joystick_KeyCode1 = 0;
g_Joystick_KeyCode2 = 0;
// *P_ADC_GPIO_OE = 0x00000300; //set JOYSTICK_OUT1 & JOYSTICK_OUT2 input
// *P_ADC_GPIO_AEN = 0xfc;
*P_ADC_GPIO_OE = 0xffff0f00; //set JOYSTICK_OUT1 & JOYSTICK_OUT2 input for A
*P_ADC_GPIO_AEN = 0xfc;
*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;*/
unsigned int i;
//U32 tmpCode1,tmpCode2;
g_Joystick_KeyCode1 = 0;
g_Joystick_KeyCode2 = 0;
// *P_ADC_GPIO_OE = 0xffff0f00; //set JOYSTICK_OUT1 & JOYSTICK_OUT2 input for A
// *P_ADC_GPIO_AEN = 0xfc;
*P_ADC_GPIO_OE = 0x00000300; //set JOYSTICK_OUT1 & JOYSTICK_OUT2 input for B
*P_ADC_GPIO_OE |= JOYSTICK_STB; //JOYSTICK_STB 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_STB; //JOYSTICK_STB Pin low
*P_ADC_GPIO_OE &= ~JOYSTICK_CLK; //JOYSTICK_CLK Pin low
for(i = 1; i < 8; 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!");
//tmpCode1 = (*P_ADC_GPIO_IN & JOYSTICK_OUT1) / JOYSTICK_OUT1;
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!");
//tmpCode2 = (*P_ADC_GPIO_IN & JOYSTICK_OUT2) / JOYSTICK_OUT2;
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 |= ((tmpCode1 << i)); //& (~(1<<(i+1))));
//g_Joystick_KeyCode2 |= ((tmpCode2 << i)); //& (~(1<<(i+1))));
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 + -