//本程序可实现用单片机来接受从ps2键盘上传输过来的数据. //把电脑键盘插入51hei-5开发板的ps2,然后按键p0口就会有不同的灯亮 //跳线设置:默认 //晶振:6M #include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 //#include"51hei.h" /******************************************************************************* 以下是引脚定义 *******************************************************************************/ sbit PS2CLK=P3^5; sbit PS2DAT=P2^7; sbit leds =P1^4; /***************************************************** 函数功能:延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } //主机到键盘的,接口程序! //命令字这些,自己去看协议吧!比如接收到主机给键盘的数据,是什么含义,这个去找协议看! //程序最新版本及hex文件下载地址:http://www.51hei.com/ziliao/file/ps2jieshou.rar //我这个可以保证数据正确接收! //因为还有些必须保密,我不想剥离,见谅,有想法可以交流! unsigned char PS2hosttokey() { bit berr_stop = 0;//停止位错 bit berr_parity = 0;//校验位错 unsigned char h; unsigned char i; unsigned char J; unsigned char t; unsigned char pcval;//接收的数据 if(!PS2CLK) //检测到时钟线为L { if(PS2DAT) { for(i=200;i>0;i--) { if(!PS2DAT) { break; } } } if(!PS2DAT)//再次检测数据线 { i = 8; PS2CLK = 1; while(!PS2CLK){;}//等待PC释放时钟线 for( t = 20;t > 0;t--){;} //12M 延时40uS for( J = 11; J > 0 ;J--) { PS2CLK = 0; for( t = 20;t > 0;t--){;} //12M 延时40uS PS2CLK =1; if(h == 0)//读8位数据位 { pcval >>= 1; if(PS2DAT) { pcval |= 0x80;} i --; if(i == 0) //完成 { h++; } } else if( h == 1)//读校验位 { ACC = pcval; if(P == PS2DAT)//校验错误 { berr_parity = 1; } h++; } else if(h == 2)//停止位 { if(!PS2DAT) { berr_stop = 1; break; } PS2DAT = 0; h++; } else{ break; } if(!PS2CLK) //检测到主机停止发送,返回0xFE { PS2DAT = 1 ;return(0xFE); } for( t = 20;t > 0;t--){;} //12M 延时20uS }//for( J = 11; J > 0 ;J--) PS2DAT = 1;//释放 if(berr_stop||berr_parity)//停止位错误或者校验错误,返回0XFF { while(!PS2DAT){;} return(0xFF); } else { return(pcval); }//返回数据 }//if(!PS2DAT) }//if(!PS2CLK) }//end /***************************************************** 函数功能:主函数 ***************************************************/ void main(void) { leds=0; while(1) { P0= PS2hosttokey(); } }