首页 > 编程知识 正文

ps2原装手柄,origin平台怎么连接手柄

时间:2023-05-05 18:11:55 阅读:57716 作者:2361

PS2句柄代码移植-合泰平台1、PS2句柄端口和通信协议PS2句柄通信协议SPI协议是高速、全双工、同步的通信总线,而且芯片引脚上有4条线(DI、DO、CS、CLK )

博主由于项目需求,需要在合泰芯片上实现ps2手柄控制的代码。 因此,我把ps2的代码从另一个平台移植到了合泰芯片平台。 具体机型为合泰HT66F70A (类似开发板机型,不一定是芯片机型)。 我想现在整理一下,让有需要的朋友来帮助我。

2、移植码:文件主要由三部分组成。 ps2.c、ps2.h、main.c PS2.c # include ' PS2.h ' # include ' ht66 f70 a.h ' /全局变量区域unsignedshortintht unsignedcharcorcod //开始命令。 请求数据unsignedchardata [9]={0x 00,0x 00,0x 00,0x 00,0x 00,0x 00,0x 00,0x 00,0x 00,0x 00 }; //数据存储数组unsignedshortintmask [ ]={ PSB _ select,PSB_L3,PSB_R3,PSB_START,PSB_PAD_UP,PSB_RED //击键值和击键//手柄接口初始化输入DI-PB12 //输出do-pb13 cs-pb14 clk-pb15 void PS2_ init (void )//输入di-Pb2 _ //PB12被设定为输入默认的下拉_pcpu4=0; //DO-PB3 CS-PB4 CLK-PB5_pcc5=0; //PB3、PB4、PB5推挽输出_pcc6=0; _pcc7=0; _pcpu5=0; _pcpu6=0; _pcpu7=0; }voidPS2_cmd(unsignedcharcmd ) volatileunsignedshortintref=0x 01; Data[1]=0; for(ref=0x01; ref0x0100; ref=1(if ) refcmd ) {DO_H; //输出为控制位(}else DO_L; CLK_H; //时钟上调GCC_DELAY(5); //Delay_us(50; CLK_L; GCC_Delay(5; //Delay_us(50; CLK_H; if(di ) Data[1]=ref|Data[1]; }gcc_Delay(16; //判断是否为红色信号模式//返回值0、红色模式//其他模式unsignedcharPS2_redlight(void ) {CS_L; PS2_cmd(comd[0]; //开始命令PS2_cmd(comd[1]; //请求数据CS_H; if(data[1]==0x73 ) return 0; else return 1; 读取//句柄数据的voidPS2_readdata(void ) ) {volatile unsigned char byte=0; volatileunsignedshortintref=0x 01; CS_L; PS2_cmd(comd[0]; //开始命令PS2_cmd(comd[1]; //请求数据for(byte=2; 字节9; 开始接收字节数据{for(ref=0x01; ref0x100; ref=1(clk_h; GCC_Delay(5; CLK_L; GCC_Delay(5; //Delay_us(50; CLK_H; if(di ) Data[byte]=ref|Data[byte]; }gcc_Delay(16; //Delay_us(16 }CS_H; //处理读出的PS2的数据而只处理了键部分的默认数据,在红色模式下若仅按下了一个键,则为0,若未按下则为1unsignedcharPS2_datakey(void )。 PS2_ClearData (; PS2_ClearData (; PS2_ReadData (; handkey=(data[4]8)|Data[3]; //这是16个按钮被按下时为0,未被按下时为1 for (索引=0; 索引16; 索引(if ) Handkey ) )1) ma

SK[index]-1)))==0)return index+1;}return 0; //没有任何按键按下}//得到一个摇杆的模拟量 范围0~256unsigned char PS2_AnologData(unsigned char button){return Data[button];}//清除数据缓冲区void PS2_ClearData(){unsigned char a;for(a=0;a<9;a++)Data[a]=0x00;}//short pollvoid PS2_ShortPoll(void){CS_L;GCC_DELAY(16);//delay_us(16);PS2_Cmd(0x01);PS2_Cmd(0x42);PS2_Cmd(0x00);PS2_Cmd(0x00);PS2_Cmd(0x00);CS_H;GCC_DELAY(16);}//进入配置void PS2_EnterConfig(void){CS_L;GCC_DELAY(16);PS2_Cmd(0x01);PS2_Cmd(0x43);PS2_Cmd(0x00);PS2_Cmd(0x01);PS2_Cmd(0x00);PS2_Cmd(0x00);PS2_Cmd(0x00);PS2_Cmd(0x00);PS2_Cmd(0x00);CS_H;GCC_DELAY(16);}//发送模式设置void PS2_TurnOnAnalogMode(void){CS_L;//GCC_DELAY(16);PS2_Cmd(0x01);PS2_Cmd(0x44);PS2_Cmd(0x00);PS2_Cmd(0x01);//analog=0x01;digital=0x00 软件设置发送模式PS2_Cmd(0xEE);//0x03锁存设置,即不可通过按键"MODE"设置模式 //0xEE不锁存软件设置,可通过按键"MODE"设置模式PS2_Cmd(0x00);PS2_Cmd(0x00);PS2_Cmd(0x00);PS2_Cmd(0x00);CS_H;GCC_DELAY(16); }//震动设置void PS2_VibrationMode(void){CS_L;GCC_DELAY(16);PS2_Cmd(0x01);PS2_Cmd(0x4D);PS2_Cmd(0x00);PS2_Cmd(0x00);PS2_Cmd(0x01); CS_H; GCC_DELAY(16);}//完成并保存配置void PS2_ExitConfig(void){CS_L;GCC_DELAY(16);PS2_Cmd(0x01);PS2_Cmd(0x43);PS2_Cmd(0x00);PS2_Cmd(0x00);PS2_Cmd(0x5A);PS2_Cmd(0x5A);PS2_Cmd(0x5A);PS2_Cmd(0x5A);PS2_Cmd(0x5A);CS_H;GCC_DELAY(16);}//手柄配置初始化void PS2_SetInit(void){PS2_ShortPoll();PS2_ShortPoll();PS2_ShortPoll();PS2_EnterConfig();//进入配置模式PS2_TurnOnAnalogMode();//"红绿灯"配置模式,并选择是否保存PS2_VibrationMode();//开启震动模式PS2_ExitConfig();//完成并保存配置}//只有PS2_VibrationMode();开启之后可用//motor1:右侧小振动电机 0x00关,其他开//motor2:左侧大震动电机 0x40~0xFF 电机开,值越大,震动越大void PS2_Vibration(unsigned char motor1,unsigned char motor2){CS_L;GCC_DELAY(16);PS2_Cmd(0x01);PS2_Cmd(0x42);PS2_Cmd(0x00);PS2_Cmd(motor1);PS2_Cmd(motor2);PS2_Cmd(0x00);PS2_Cmd(0x00);PS2_Cmd(0x00);PS2_Cmd(0x00);CS_H;GCC_DELAY(16);} ps2.h #ifndef _PS2_H_#define _PS2_H_#define DI _pc4 //PB2 输入#define DO_H _pc5=1 //命令位高#define DO_L _pc5=0 //命令位低#define CS_H _pc6=1 //CS拉高#define CS_L _pc6=0 //CS拉低#define CLK_H _pc7=1 //时钟拉高#define CLK_L _pc7=0 //时钟拉低//These are our button constants#define PSB_SELECT 1#define PSB_L3 2#define PSB_R3 3#define PSB_START 4#define PSB_PAD_UP 5#define PSB_PAD_RIGHT 6#define PSB_PAD_DOWN 7#define PSB_PAD_LEFT 8#define PSB_L2 9#define PSB_R2 10#define PSB_L1 11#define PSB_R1 12#define PSB_GREEN 13#define PSB_RED 14#define PSB_BLUE 15#define PSB_PINK 16#define PSB_TRIANGLE 13#define PSB_CIRCLE 14#define PSB_CROSS 15#define PSB_SQUARE 16//#define WHAMMY_BAR8//These are stick values#define PSS_RX 5 //右摇杆X轴数据#define PSS_RY 6#define PSS_LX 7#define PSS_LY 8extern unsigned char Data[9];extern unsigned short int MASK[16];extern unsigned short int Handkey;void PS2_INIT(void);//PS2初始化unsigned char PS2_RedLight(void);//判断是否为红灯模式void PS2_ReadData(void);//void PS2_Cmd(unsigned char CMD);//unsigned char PS2_DataKey(void);//键值读取unsigned char PS2_AnologData(unsigned char button); //得到一个摇杆的模拟量void PS2_ClearData(void);//清除数据缓冲区void PS2_ShortPoll(void);//short pollvoid PS2_EnterConfig(void);//进入配置void PS2_TurnOnAnalogMode(void);//发送模式设置void PS2_VibrationMode(void);//震动设置void PS2_ExitConfig(void);//完成并保存配置void PS2_SetInit(void);//手柄配置初始化void PS2_Vibration(unsigned char motor1,unsigned char motor2);//#endif main.c #include "HT66F70A.h"#include "Interrupt.h"#include "TM.h"#include "UART.h"#include "PS2.h"#include "Motor.h"//全局变量区extern char buff[num];extern char Buff[32];extern unsigned int count;//函数声明区void delay1s(void);//主程序入口void main(){//初始化区 _wdtc = 0xab;//看门狗失能 unsigned char key; UART_INIT(); PS2_INIT(); MOTOR_INIT(); //TO DO while(1) { key = PS2_DataKey(); GCC_DELAY(16); switch(key) { case 1:GCC_DELAY(2000); if((key = PS2_DataKey()) == 1) Send( "1rn"); break; case 2:GCC_DELAY(2000); if((key = PS2_DataKey()) == 2) Send( "2rn");break; case 3:GCC_DELAY(2000); if((key = PS2_DataKey()) == 3) Send( "3rn");break; case 4:GCC_DELAY(2000); if((key = PS2_DataKey()) == 4) Send( "4rn");break; case 5:GCC_DELAY(2000); if((key = PS2_DataKey()) == 5) Send( "5rn");Motor(1,1,300);break; case 6:GCC_DELAY(2000); if((key = PS2_DataKey()) == 6) Send( "6rn");Motor(1,1,300);break; case 7:GCC_DELAY(2000); if((key = PS2_DataKey()) == 7) Send( "7rn");Motor(1,1,1000);break; case 8:GCC_DELAY(2000); if((key = PS2_DataKey()) == 8) Send( "8rn");Motor(1,0,1000);break; case 9:GCC_DELAY(2000); if((key = PS2_DataKey()) == 9) Send( "9rn");break; case 10:GCC_DELAY(2000); if((key = PS2_DataKey()) == 10) Send("10rn");break; case 11:GCC_DELAY(2000); if((key = PS2_DataKey()) == 11) Send("11rn");break; case 12:GCC_DELAY(2000); if((key = PS2_DataKey()) == 12) Send("12rn");break; case 13:GCC_DELAY(2000); if((key = PS2_DataKey()) == 13) Send("13rn");break; case 14:GCC_DELAY(2000); if((key = PS2_DataKey()) == 14) Send("14rn");break; case 15:GCC_DELAY(2000); if((key = PS2_DataKey()) == 15) Send("15rn");break; case 16:GCC_DELAY(2000); if((key = PS2_DataKey()) == 16) Send("16rn");Motor_Stop(1);break; default:break; } } }void delay1s(void) //误差 -1us{ unsigned char a,b,c,n; for(c=205;c>0;c--) for(b=171;b>0;b--) for(a=8;a>0;a--); for(n=1;n>0;n--);}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。