为什么PS2手柄的数据很不稳定,需要复位才能采集到,求救
我用的是无线PS2手柄
#include
#define uchar unsigned char
#define uint unsigned int
#define time 100
uchar HAND;
uchar keybuf0; //手柄按键编码存储单元
uchar keybuf1;
uchar RES[8];
uchar t=0;
sbit DAT=P3^0;
sbit CMND=P3^1;
sbit ATT=P3^2; //手柄控制信号
sbit CLK=P3^3;
void delay_1ms(uchar k);
void key_scan();
void psout();
void psinout();
void delay(uchar k) ;
void key_function();
void main()
{
while(1)
{
delay_1ms(1);
key_scan();
delay_1ms(1);
key_function(); //各个按键对应的功能
}
}
void key_function()
{
P0=keybuf0; //RES[3]%256;
P1=keybuf1; //RES[4]%256;
delay(5);
}
void key_scan()//键扫描
{
t=0;
ATT=0; //主机读手柄先拉低ATT
HAND=0x01; //主机发送开始命令
psinout(); //0xff
delay(5);
HAND=0x42; //主机发送请求数据命令
psinout(); //0x41:手柄返回请求应答信号
delay(25);
/*psout(); //0x5A
delay(25);
psout(); //keybuf0(空0xff) //手柄返回按键编码第一字节
delay(25);
psout(); //keybuf1(空0xff) //手柄返回按键编码第二字节*/
HAND=0x00; //主机发送请求数据命令
psinout(); //0x41:手柄返回请求应答信号
delay(25);
HAND=0x00; //主机发送请求数据命令
psinout(); //0x41:手柄返回请求应答信号
delay(25);
HAND=0x00; //主机发送请求数据命令
psinout(); //0x41:手柄返回请求应答信号
//delay(25);
keybuf0=RES[3];
keybuf1=RES[4];
delay(10);
ATT=1;
}
void psout()//主机接收子程序
{
int j,k;
unsigned char duf=0;
j=1;
for(k=0;k<=7;k++) //逐位发送
{
CLK=1;
delay(5);
CLK=0;
delay(5);
if(DAT==1)
duf=duf+j;
j=j*2;
CLK=1;
delay(5);
}
RES[t++]=duf;
//if(t==6)t=0;
}
void psinout()//手柄发送子程序
{
uchar buf,duf=0;
uchar i,j=1;
buf=HAND;
for(i=0;i<=7;i++) //逐位接收
{
CLK=1;
delay(5);
if(buf&0x01)
CMND=1;
else
CMND=0;
buf=buf>>1;
CLK=0;
delay(5);
if(DAT==1)
duf=duf+j;
j=j*2;
CLK=1;
delay(5);
}
RES[t++]=duf;
}
void delay(uchar k)
{
uchar i;
for(i=0;i 本帖最后由 穿越火线大月 于 2014-4-16 18:15 编辑