单片机源程序如下:
- #include <pstwo.h>
- u16 Handkey;
- u8 Comd[2]={0x01,0x42}; //开始命令。请求数据
- u8 Data[9]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //数据存储数组
- 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;
- }
复制代码
所有资料51hei提供下载:
PS2手柄.rar
(281.58 KB, 下载次数: 60)
|