资源简介
PS2游戏手柄资料。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
代码片段和文件信息
#include “ps2.h“
/*********************************************************
Copyright (C) 2015-2025 LHRobot.
www.peihua13.com
File:PS2驱动程序
Author:hua13 Version:1.0 Data:2017/11/01
Description: PS2驱动程序
**********************************************************/
u16 Handkey;
u8 Comd[2]={0x010x42}; //开始命令。请求数据
u8 Data[9]={0x000x000x000x000x000x000x000x000x00}; //数据存储数组
u16 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->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_Cmd(u8 CMD)
{
volatile u16 ref=0x01;
Data[1] = 0;
for(ref=0x01;ref<0x0100;ref<<=1)
{
if(ref&CMD)
{
DO_H; //输出以为控制位
}
else DO_L;
CLK_H; //时钟拉高
delay_us(50);
CLK_L;
delay_us(50);
CLK_H;
if(DI)
Data[1] = ref | Data[1];
}
}
//判断是否为红灯模式
//返回值;0,红灯模式
// 其他,其他模式
u8 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 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;
CLK_L;
delay_us(50);
CLK_H;
if(DI)
Data[byte] = ref | Data[byte];
}
delay_us(50);
}
CS_H;
}
//对读出来的PS2的数据进行处理 只处理了按键部分 默认数据是红灯模式 只有一个按键按下时
//按下为0, 未按下为1
u8 PS2_DataKey()
{
u8 index;
PS2_ClearData();
PS2_ReadData();
Handkey=(Data[4]<<8)|Data[3]; //这是16个按键 按下为0, 未按下为1
for(index=0;index<16;index++)
{
if( (Handkey&(1<<(MASK[index]-1) ) )==0)
return index+1;
}
return 0; //没有任何按键按下
}
//得到一个摇杆的模拟量 范围0~256
u8 PS2_AnologData(u8 button)
{
return Data[button];
}
//清除数据缓冲区
void PS2_ClearData()
{
u8 a;
for(a=0;a<9;a++)
Data[a]=0x00;
}
相关资源
- stm32驱动si4463收发
- 基于gprs的udp连接stm32程序代码
- STM32 TCS3200颜色识别 超声波 PWM 程序源
- 单片机或者STM32能直接用的sht读温湿度
- OpenGL+IMU显示姿态
- STM32 的TIM 定时器参数计算工具
- STM32F407 OV7670摄像头例程
- 数模转换-DAC124s085
- 基于STM32F103CBT6的BC95指令收发
- STM32F103C8T6核心板PCB工程
- 基于STM32F7 + USB3300 USB-HS 枚举为复合设
- STM32F103C8T6最小系统--原理图
- 基于STM32的简易运动控制器直线插补、
- MODBUS从机基于STM32
- 基于STM32实现的模拟I2C
- STM32电机闭环代码.7z
- 基于STM32的1MHz、1KHz和1Hz同步方波产生
- STM32库函数DS1302驱动文件
- STM32 DS1302驱动
- STM32 DS18b20
- 基于STM32F103C8T6的手持MP3完整PCB工程文
- STM32L4超低功耗特性概述
- STM32智能家居完整项目代码
- 用STM32的内置Flash做一个超小U盘
- stm32基于轮询方式的串口收发程序
- STM32F030C8T6串口例程
- RFID RC522 stm32f103c8t6 读写demo
- STM32 单位时间内输入方波个数统计函
- 可控硅调节220光程序和原理图.zip
- STM32_ad7705程序
评论
共有 条评论