|
发表于 2014-4-16 17:03:10
|
显示全部楼层
楼主看看有什么问题吧:
#include<reg52.h>
#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<k;i++);
}
void delay_1ms(uchar k)
{
do
{
TMOD=0x01;
TH0=-(300/256);
TL0=-(300%256);
TR0=1;
while(!TF0);
TF0=0;
}while (k--);
TR0=0;
TMOD=0x00;
}
|
|