PS2按键通讯

相信看到这里你也知道,PS2手柄最重要的控件莫过于按键了。PS2手柄接收器有7个引脚,其中按键的数据在DI引脚。

参考:​​​​​​STM32中使用PS2手柄_stm32 游戏手柄-CSDN博客​​​​​​

这个图就是按键信号的分布图。当有按键按下时,对应位为0,否则为1。例如当按键“SELECT”被按下时,Data[3]=01111111.

pstwo.c

//......
void PS2_Init(void)
{
    //输入  DI->PB12
	RCC->APB2ENR|=1<<3;     //使能PORTB时钟
  GPIOB->CRH&=0XFFF0FFFF;//PB12设置成输入	默认下拉  
	GPIOB->CRH|=0X00080000;   

    //  DO->PB13    CS->PB14  CLK->PB15
	RCC->APB2ENR|=1<<3;    //使能PORTB时钟  	   	  	 
	GPIOB->CRH&=0X000FFFFF; 
	GPIOB->CRH|=0X33300000;//PB13、PB14、PB15 推挽输出   	 											  
}
//......

void PS2_ReadData(void)
{
	volatile u8 byte=0;
	volatile u16 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;
			Delay_us(10);
			CLK_L;
			Delay_us(10);
			CLK_H;
		      if(DI)
		      Data[byte] = ref|Data[byte];
		}
    Delay_us(16);
	}
	CS_H;	
}

pstwo.h

#ifndef __PSTWO_H
#define __PSTWO_H
#include "delay.h"
#include "sys.h"
#define DI   PBin(12)           //PB12  输入

#define DO_H PBout(13)=1        //命令位高
#define DO_L PBout(13)=0        //命令位低

#define CS_H PBout(14)=1       //CS拉高
#define CS_L PBout(14)=0       //CS拉低

#define CLK_H PBout(15)=1      //时钟拉高
#define CLK_L PBout(15)=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      26

//#define WHAMMY_BAR		8

//These are stick values
#define PSS_RX 5                //右摇杆X轴数据
#define PSS_RY 6
#define PSS_LX 7
#define PSS_LY 8



extern u8 Data[9];
extern u16 MASK[16];
extern u16 Handkey;

void PS2_Init(void);
void PS2_ReadData(void);


#endif

main.c

​
//......
PS2_ReadData();
//......
if((Data[4]&(0x1<<1))>>1==0)  //当按下R2按键
{
    //......
}

​

注:这是库函数版本的代码,其他库的请找其他文章。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值