PS2手柄代码移植-合泰平台

PS2手柄代码移植-合泰平台

1、PS2手柄端口及通讯协议

PS2手柄的通讯协议是SPI协议是一种高速的、全双工、同步的通信总线,并且在芯片的管脚上只占用四根线(DI、DO、CS、CLK),PS2手柄的通讯协议破解后在C51、STM32、Arduino、FPGA等平台上均有应用,其端口、通讯协议及使用方法的介绍在网上一搜一大堆,大家自行下载即可。

博主本科期间由于项目需求,需要在合泰芯片上实现ps2手柄控制的代码。于是将ps2的代码从别的平台上移植到合泰芯片平台上,具体型号为合泰HT66F70A(好像是开发板型号,不一定是芯片型号),如今整理出来,希望能帮助到有需要的朋友。

ps2

2、移植代码:文件主要包括三份:ps2.c、ps2.h、main.c

  • ps2.c

#include "PS2.h"
#include "HT66F70A.h"

//全局变量区
unsigned short int Handkey;
unsigned char Comd[2] = {
   0x01,0x42};//开始命令。请求数据
unsigned char Data[9] = {
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //数据存储数组
unsigned short int MASK[] = {
   
	PSB_SELECT,
    PSB_L3,
    PSB_R3 ,
    PSB_START,
    PSB_PAD_UP,
    PSB_PAD_RIGHT,
    PSB_PAD_DOWN,
    PSB_PAD_LEFT,
    PSB_L2,
    PSB_R2,
    PSB_L1,
    PSB_R1 ,
    PSB_GREEN,
    PSB_RED,
    PSB_BLUE,
    PSB_PINK
    };//按键值与按键明   
  
//手柄接口初始化    输入  DI->PB12 
//                  输出  DO->PB13    CS->PB14  CLK->PB15    
void PS2_INIT(void)
{
   
	//输入 DI->PB2
	_pcc4 = 1;//PB12设置成输入	默认下拉 
	_pcpu4 = 0;
	//DO->PB3 CS->PB4 CLK->PB5
	_pcc5 = 0;//PB3、PB4、PB5 推挽输出
	_pcc6 = 0;
	_pcc7 = 0;
	_pcpu5 = 0;
	_pcpu6 = 0;
	_pcpu7 = 0;
}
	
void PS2_Cmd(unsigned char CMD)
{
   
	volatile unsigned short int ref = 0x01;
	Data[1] = 0;
	for(ref=0x01;ref<0x0100;ref<<=1)
	{
   
		if(ref&CMD)
		{
   
			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,红灯模式
//		  其他,其他模式
unsigned char PS2_RedLight(void)
{
   
	CS_L;
	PS2_Cmd(Comd[0]);  //开始命令
	PS2_Cmd(Comd[1]);  //请求数据
	CS_H;
	if( Data[1] == 0X73)   return 0 ;
	else return 1;
}

//读取手柄数据
void PS2_ReadData(void)
{
   
	volatile unsigned char byte=0;
	volatile unsigned short int ref=0x01;

	CS_L;

	PS2_Cmd(Comd[0]);  //开始命令
	PS2_Cmd(Comd[1]);  //请求数据

	for(byte=2;byte<9;byte++)          //开始接受数据
	{
   
		for(ref=0x01;ref<0x100;ref<<=1)
		{
   
			CLK_H;
			GCC_DELAY(5);
			CLK_L;
			GCC_DELAY(5);//delay_us(50);
			CLK_H;
		      if(
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值