专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

用单片机来模拟ps2电脑键盘的程序

作者:佚名   来源:本站原创   点击数:  更新时间:2010年10月11日   【字体:
//本程序可实现用单片机来代替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(); } }

 

关闭窗口

相关文章