//本程序可实现用单片机来代替ps2键盘来给电脑输入数据.
//您只需从单片机上引出2根线到电脑的ps/2接口就可实现
//本程序在51hei-5开发板上测试通过
//跳线设置:默认
//晶振:6M
#include<reg51.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
//#include"51hei.h"
/*******************************************************************************
以下是引脚定义
*******************************************************************************/
sbit PS2CLK=P3^5;
sbit PS2DAT=P2^7;
/*****************************************************
函数功能:延时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++)
;
}
//======================================================================
//2051模拟PS2键盘和PC机通讯程序 6M下 发送程序代码
//程序的完整版本及hex文件下载地址:http://www.51hei.com/ziliao/file/ps2dfe.rar
//======================================================================
PS2keytohost(unsigned char vale)
{
unsigned char h = 0;
unsigned char i = 8;
unsigned char J;
unsigned char t;
bit bparity =0 ;
ACC = vale;//获取字节的奇偶信息
if(!P) //ACC中偶数时,P为0,但是PS2中时奇校验( 字节中的1的个数+校验位 = 奇数)
{ bparity = 1; }
if(PS2CLK&&PS2DAT) //发送前检测PS2总线
{
for(J = 12 ;J > 0;J--) {;}//6M,大约延时40uS后再检测
if(PS2CLK)//时钟线空闲
{
if(PS2DAT)//数据线空闲
{
//for(t = 10;t > 0;t--){;} //6M,大约延时20uS
for(J = 11;J > 0;J--) //1共11个数据
{
if(h == 0) // 送起始位
{
PS2DAT = 0;
h++;
}
else if(h == 1)//送8位数据位
{
PS2DAT = vale & 0x01;//先LSB开始
vale >>= 1;
i--;
if(i == 0) //发送完成
{ h++; }
}
else if(h == 2)//送校验位
{
PS2DAT = bparity;
h++;
}
else{ PS2DAT = 1; } //送停止位
for(t = 12;t > 0;t--){;} //6M,大约延时40uS
PS2CLK = 0;//拉低时钟线,主机接收
for(t = 12;t > 0;t--){;} //6M,大约延时40uS
PS2CLK = 1;//拉高时钟线,设备发送
if(!PS2CLK) //检测到时钟线变低
{ //主机不要这次通讯 (很罕见)
return(0);//返回 0
}
for(t = 6;t > 0;t--){;} //6M,大约延时20uS
}//for(J = 11;J > 0;J--)
for(t = 12;t >0;t--){;}
return(1);//返回 1
}//if(PS2DAT)
}//if(PS2CLK)
}//if(PS2CLK&&PS2DAT)
}//end
/*****************************************************
函数功能:主函数
***************************************************/
void main(void)
{
PS2keytohost(0X1C);
while(1)
{
delay1ms();
}
}
