资源简介
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;
}
相关资源
- stm32f407上的两个can发送和接收例程
- STM32 led 时钟
- STM32 2.4G通信例程
- 直流无刷电机方波驱动 stm32 例程代码
- STM32中文资料
- STM32蓝牙和串口程序
- STM32f103超声波模块例程
- stm32f103c8t6 4 oled.rar
- stm32f030 IAP Demo(原创)
- STM32基于rt_thread操作系统的SDHC卡文件
- NRF24L01实现51与STM32双向通讯
- STM32F103 串口程序(完整版)
- stm32 ds18b20 温度传感器 测试通过
- [免费]msp430f149控制PS2键盘并用1602显示
- stm32官方例程
- STM32F103定时器中断程序
- [免费]基于stm32f103ze 的OLED驱动代码
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- STM32定时器使用入门。看了这个程序会
- SIM908 SDIO FSMC STM32 FIFO
- STM32F103 CC2500完整驱动(模拟SPI)
- AD7606采集程序
- stm32 用SPI 方式读写 SDHC
- stm32通过DMA方式采集ADC数据
- 意法半导体STM全系列微控制器STM32ST
- 基于STM32芯片的SX1278 驱动 LORA.rar
- STM32的PCB封装库,以及原理图库,48
- SX1280.rar
- STM32 DS3231驱动.zip
评论
共有 条评论