上面是部分PS2资料,电脑上还有点,下次再传...
下面是我写的 程序,有点乱,没有整理,之前有事,做了一半就没继续,不过程序可以用.
#include
#include
#include
#include
sbit ACC7=ACC^7;
sbit DATA="P3"^0; //数据线 可以用串口直接接收 ????????????
sbit SCK="P3"^2; //时钟线
unsigned char flag,getdata,F0_flag,E1_flag,E0_flag,NUM,CAP,shift_flag,lcd,a=0,b=0;
unsigned int j[6];
unsigned char s[8],f[8];//显示键盘码用
//用中断方式接收数据
void sentdata(unsigned char input); //模拟串口 向键盘发送数据,主机发送函数
void sdelay(unsigned char i); //短延时程序*
void get_key(unsigned char key); //键码处理函数
void first_flag(void); //键码初始处理
void main(void) //////主函数
{
unsigned char k,h;
DelayMs(100); //启动等待,等LCM进入工作状态
Lcd_Ini();
EX0=1; //开中断
IT0=1; //下降沿开始读取数据
EA=1;
sentdata(0xf4); //复位键盘
delay(1); // 延时一段时间,不然数据会乱!!!!?????????
//sentdata(0xed); //准备打开LED状态
//delay(1);
//sentdata(0x02); //LED状态
while(1)
{
if(j[0]==0x77)
{
sentdata(0xed); //准备打开LED状态
delay(1);
sentdata(0x02); //LED状态 打开
}
if(j[2]==0x77)
{
sentdata(0xed); //准备打开LED状态
delay(1);
sentdata(0x00); //LED状态 关闭 NUM
}
sprintf(s,"%02x%02x%02x",j[0],j[1],j[2]);
for(k=0;k<6;k++)
{
LcdWriteData(s[k],k);
}
sprintf(f,"%02x%02x%02x",j[3],j[4],j[5]);
for(h=0;h<6;h++)
{
LcdWriteData(f[h],h+6);
}
//LcdWriteCommand(0x01,1);//清屏
}
}
void receivedata()interrupt 0//中断函数 接收数据函数
{
unsigned char end,n;
EX0=0;
switch(a) //11数据位
{
case 0: a++;break;//起始位
case 9: a++;break;//校验位
case 10:
a="0";
end="1"; //置接收到数据标志位
break;//停止位
case 1: //数据位8
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8: getdata>>=1;
ACC="getdata";
ACC7=DATA;
getdata="ACC"; //数据到getchar中
a++;
break;
default: break;
}
EX0=1;//开中断0
if(end==1)
{
end=0;
j[n]=getdata;
flag=1;
n++;
if(n==6)
n=0;
}
}
void sdelay(unsigned char i) //短延时程序*
{
while(--i); //刚好两个指令周期。
}
void sentdata(unsigned char input) //模拟串口 向键盘发送数据,主机发送函数
{
unsigned char i="8",chek;
EX0=0; //关闭外部中断0
SCK=0;
sdelay(150);//将时钟线拉低100US
DATA=0;//起始位
SCK=1; //释放时钟
while(i--)//准备发送8位数据
{
while(SCK);//等待时钟变低
DATA=(bit)(input&0x01);
if(DATA)chek++;
while(!SCK);//等待时钟变高
input=input>>1;
}
while(SCK);//准备发送校验位
switch(chek)
{
case 0:
case 2:
case 4:
case 6: DATA="1";break;//奇校验
case 1:
case 3:
case 5:
case 7: DATA="0";break;//奇校验
default :break;
}
while(!SCK);//等待时钟变高
while(SCK);
DATA=1;//发送停止位,停止位为1
while(!SCK);//等待时钟变高
while(SCK); //PS/2发送ACK位,为低
while(!SCK);//等待时钟变高
while(SCK); //让过一个下降沿
//数据发送完毕
EX0=1; //打开中断
}
文章评论(0条评论)
登录后参与讨论