//本程序可實現用單片機來代替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://m.izizhuan.cn/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();
}
}
