相信看到这里你也知道,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按键
{
//......
}
注:这是库函数版本的代码,其他库的请找其他文章。