曾家键鼠控制
This commit is contained in:
parent
7e6a3673fb
commit
e949580221
|
@ -0,0 +1,115 @@
|
|||
#include "ps_handle.h"
|
||||
uint8_t PS2_RawData[9] = {0};
|
||||
PS2_Instance PS2_Data = {0};
|
||||
void PS2_CS(uint8_t Val)
|
||||
{
|
||||
if (Val)
|
||||
HAL_GPIO_WritePin(PS2_CS_GPIOx, PS2_CS_Pin, GPIO_PIN_SET);
|
||||
else
|
||||
HAL_GPIO_WritePin(PS2_CS_GPIOx, PS2_CS_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
void PS2_CLK(uint8_t Val)
|
||||
{
|
||||
if (Val)
|
||||
HAL_GPIO_WritePin(PS2_CLK_GPIOx, PS2_CLK_Pin, GPIO_PIN_SET);
|
||||
else
|
||||
HAL_GPIO_WritePin(PS2_CLK_GPIOx, PS2_CLK_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
void PS2_DO(uint8_t Val)
|
||||
{
|
||||
if (Val)
|
||||
HAL_GPIO_WritePin(PS2_DO_GPIOx, PS2_DO_Pin, GPIO_PIN_SET);
|
||||
else
|
||||
HAL_GPIO_WritePin(PS2_DO_GPIOx, PS2_DO_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
uint8_t PS2_Read_DI()
|
||||
{
|
||||
return HAL_GPIO_ReadPin(PS2_DI_GPIOx, PS2_DI_Pin);
|
||||
}
|
||||
void PS2_Delay()
|
||||
{
|
||||
for (int i = 0; i < 0xBf; i++)
|
||||
__NOP();
|
||||
}
|
||||
uint8_t PS2_ReadWrite_Byte(uint8_t TxData)
|
||||
{
|
||||
uint8_t TX = TxData;
|
||||
uint8_t RX = 0;
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
if (TX & 0x01)
|
||||
PS2_DO(1);
|
||||
else
|
||||
PS2_DO(0);
|
||||
TX >>= 1;
|
||||
PS2_CLK(1);
|
||||
PS2_Delay();
|
||||
PS2_CLK(0);
|
||||
RX >>= 1;
|
||||
RX |= (PS2_Read_DI() << 7);
|
||||
PS2_Delay();
|
||||
PS2_CLK(1);
|
||||
PS2_Delay();
|
||||
}
|
||||
return RX;
|
||||
}
|
||||
|
||||
static void PS2_Decode()
|
||||
{
|
||||
if (PS2_RawData[2] == 0x5A)
|
||||
{
|
||||
PS2_Data.Key_Select = (~PS2_RawData[3] >> 0) & 0x01; //选择键
|
||||
PS2_Data.Key_Start = (~PS2_RawData[3] >> 3) & 0x01; //开始键
|
||||
|
||||
//左侧按键
|
||||
PS2_Data.Key_L_Up = (~PS2_RawData[3] >> 4) & 0x01;
|
||||
PS2_Data.Key_L_Right = (~PS2_RawData[3] >> 5) & 0x01;
|
||||
PS2_Data.Key_L_Down = (~PS2_RawData[3] >> 6) & 0x01;
|
||||
PS2_Data.Key_L_Left = (~PS2_RawData[3] >> 7) & 0x01;
|
||||
|
||||
//后侧按键
|
||||
PS2_Data.Key_L2 = (~PS2_RawData[4] >> 0) & 0x01;
|
||||
PS2_Data.Key_R2 = (~PS2_RawData[4] >> 1) & 0x01;
|
||||
PS2_Data.Key_L1 = (~PS2_RawData[4] >> 2) & 0x01;
|
||||
PS2_Data.Key_R1 = (~PS2_RawData[4] >> 3) & 0x01;
|
||||
|
||||
//右侧按键
|
||||
PS2_Data.Key_R_Up = (~PS2_RawData[4] >> 4) & 0x01;
|
||||
PS2_Data.Key_R_Right = (~PS2_RawData[4] >> 5) & 0x01;
|
||||
PS2_Data.Key_R_Down = (~PS2_RawData[4] >> 6) & 0x01;
|
||||
PS2_Data.Key_R_Left = (~PS2_RawData[4] >> 7) & 0x01;
|
||||
|
||||
if (PS2_RawData[1] == 0x41)
|
||||
{ //无灯模式(摇杆值八向)
|
||||
PS2_Data.Rocker_LX = 127 * (PS2_Data.Key_L_Right - PS2_Data.Key_L_Left);
|
||||
PS2_Data.Rocker_LY = 127 * (PS2_Data.Key_L_Up - PS2_Data.Key_L_Down);
|
||||
|
||||
PS2_Data.Rocker_RX = 127 * (PS2_Data.Key_R_Right - PS2_Data.Key_R_Left);
|
||||
PS2_Data.Rocker_RY = 127 * (PS2_Data.Key_R_Up - PS2_Data.Key_R_Down);
|
||||
}
|
||||
else if (PS2_RawData[1] == 0x73)
|
||||
{ //红灯模式(摇杆值模拟)
|
||||
|
||||
//摇杆按键
|
||||
PS2_Data.Key_Rocker_Left = (~PS2_RawData[3] >> 1) & 0x01;
|
||||
PS2_Data.Key_Rocker_Right = (~PS2_RawData[3] >> 2) & 0x01;
|
||||
|
||||
//摇杆值
|
||||
PS2_Data.Rocker_LX = PS2_RawData[7] - 0x80;
|
||||
PS2_Data.Rocker_LY = -1 - (PS2_RawData[8] - 0x80);
|
||||
PS2_Data.Rocker_RX = PS2_RawData[5] - 0x80;
|
||||
PS2_Data.Rocker_RY = -1 - (PS2_RawData[6] - 0x80);
|
||||
}
|
||||
}
|
||||
}
|
||||
void PS2_Read_Data(void)
|
||||
{
|
||||
PS2_CS(0);
|
||||
PS2_RawData[0] = PS2_ReadWrite_Byte(0x01); // 0
|
||||
PS2_RawData[1] = PS2_ReadWrite_Byte(0x42); // 1
|
||||
for (int i = 2; i < 9; i++)
|
||||
PS2_RawData[i] = PS2_ReadWrite_Byte(0xff);
|
||||
PS2_CS(1);
|
||||
PS2_Decode();
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
#ifndef PS_HANDLE_H
|
||||
#define PS_HANDLE_H
|
||||
|
||||
#include "bsp_spi.h"
|
||||
#include "bsp_gpio.h"
|
||||
#include "bsp_dwt.h"
|
||||
|
||||
#define PS2_CS_GPIOx GPIOB
|
||||
#define PS2_CS_Pin GPIO_PIN_12
|
||||
|
||||
#define PS2_CLK_GPIOx GPIOB
|
||||
#define PS2_CLK_Pin GPIO_PIN_13
|
||||
|
||||
#define PS2_DO_GPIOx GPIOB
|
||||
#define PS2_DO_Pin GPIO_PIN_15
|
||||
|
||||
#define PS2_DI_GPIOx GPIOB
|
||||
#define PS2_DI_Pin GPIO_PIN_14
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t A_D; //模拟(红灯)为1 数字(无灯)为0
|
||||
int8_t Rocker_RX, Rocker_RY, Rocker_LX, Rocker_LY; //摇杆值(模拟状态为实际值0-0xFF)(数字态为等效的值0,0x80,0xFF)
|
||||
//按键值0为未触发,1为触发态
|
||||
uint8_t Key_L1, Key_L2, Key_R1, Key_R2; //后侧大按键
|
||||
uint8_t Key_L_Right, Key_L_Left, Key_L_Up, Key_L_Down; //左侧按键
|
||||
uint8_t Key_R_Right, Key_R_Left, Key_R_Up, Key_R_Down; //右侧按键
|
||||
uint8_t Key_Select; //选择键
|
||||
uint8_t Key_Start; //开始键
|
||||
uint8_t Key_Rocker_Left, Key_Rocker_Right; //摇杆按键
|
||||
|
||||
} PS2_Instance;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // !PS_HANDLE_H#define PS_HANDLE_H
|
Loading…
Reference in New Issue