//本程序可實(shí)現(xiàn)用單片機(jī)來(lái)代替ps2鍵盤來(lái)給電腦輸入數(shù)據(jù).
//您只需從單片機(jī)上引出2根線到電腦的ps/2接口就可實(shí)現(xiàn)
//本程序在51hei-5開發(fā)板上測(cè)試通過(guò)
//跳線設(shè)置:默認(rèn)
//晶振:6M
#include<reg51.h> //包含單片機(jī)寄存器的頭文件
#include<intrins.h> //包含_nop_()函數(shù)定義的頭文件
//#include"51hei.h"
/*******************************************************************************
以下是引腳定義
*******************************************************************************/
sbit PS2CLK=P3^5;
sbit PS2DAT=P2^7;
/*****************************************************
函數(shù)功能:延時(shí)1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以認(rèn)為是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
//======================================================================
//2051模擬PS2鍵盤和PC機(jī)通訊程序 6M下 發(fā)送程序代碼
//程序的完整版本及hex文件下載地址:http://www.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;//獲取字節(jié)的奇偶信息
if(!P) //ACC中偶數(shù)時(shí),P為0,但是PS2中時(shí)奇校驗(yàn)( 字節(jié)中的1的個(gè)數(shù)+校驗(yàn)位 = 奇數(shù))
{ bparity = 1; }
if(PS2CLK&&PS2DAT) //發(fā)送前檢測(cè)PS2總線
{
for(J = 12 ;J > 0;J--) {;}//6M,大約延時(shí)40uS后再檢測(cè)
if(PS2CLK)//時(shí)鐘線空閑
{
if(PS2DAT)//數(shù)據(jù)線空閑
{
//for(t = 10;t > 0;t--){;} //6M,大約延時(shí)20uS
for(J = 11;J > 0;J--) //1共11個(gè)數(shù)據(jù)
{
if(h == 0) // 送起始位
{
PS2DAT = 0;
h++;
}
else if(h == 1)//送8位數(shù)據(jù)位
{
PS2DAT = vale & 0x01;//先LSB開始
vale >>= 1;
i--;
if(i == 0) //發(fā)送完成
{ h++; }
}
else if(h == 2)//送校驗(yàn)位
{
PS2DAT = bparity;
h++;
}
else{ PS2DAT = 1; } //送停止位
for(t = 12;t > 0;t--){;} //6M,大約延時(shí)40uS
PS2CLK = 0;//拉低時(shí)鐘線,主機(jī)接收
for(t = 12;t > 0;t--){;} //6M,大約延時(shí)40uS
PS2CLK = 1;//拉高時(shí)鐘線,設(shè)備發(fā)送
if(!PS2CLK) //檢測(cè)到時(shí)鐘線變低
{ //主機(jī)不要這次通訊 (很罕見(jiàn))
return(0);//返回 0
}
for(t = 6;t > 0;t--){;} //6M,大約延時(shí)20uS
}//for(J = 11;J > 0;J--)
for(t = 12;t >0;t--){;}
return(1);//返回 1
}//if(PS2DAT)
}//if(PS2CLK)
}//if(PS2CLK&&PS2DAT)
}//end
/*****************************************************
函數(shù)功能:主函數(shù)
***************************************************/
void main(void)
{
PS2keytohost(0X1C);
while(1)
{
delay1ms();
}
}
