PS2键盘与单片机通信.docVIP

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PS2键盘与单片机通信,单片机驱动ps2键盘,单片机与pc串口通信,单片机与蓝牙模块通信,单片机与上位机通信,fpga与单片机通信,组态王与单片机通信,单片机与电脑串口通信,vb与单片机串口通信,labview与单片机通信

PS/2键盘与单片机通信 PS/2接口通信协议PS/2接口键盘与主机采用双向通信方式,键盘可以向主机发送据主机也可以发送命令给键盘。主机具有最高优先权。通信协议是标准的串行异步通信格式,1位起始位,8位数据位(LSB在先),1位奇校验位P,1位停止位,若为主机发送状态,则还有一位应答位。数据格式如图2所示。 主机同键盘进行通信时,无论发送还是接收数据,都要依赖于键盘发送的时钟脉冲(每次数据传输发送l1个时钟脉冲),时钟频率为10-16.7kHz,通过判断时钟脉冲的上升沿和下降沿,逐位发送或读取数据位。当数据线DATA和时钟线CLK同时为高电平时,键盘可以发数据给主机。CLK可用作清除发送线。如果主机将CLK拉为低电平,则禁止键盘发送数据,而是将发送数据放到发送缓存区中,直到CLK变为高电平才开始发送数据。如果主机将DATA拉低,则当键盘检测到这一变化时,接收来自主机的命令。概括如表l所示。 当键盘发送数据时,键盘先将DATA 拉低,通知主机准备接收数据。键盘在CLK为高电平时建立数据,主机在CLK为低电平时读取数据。发送数据的时钟信号由键盘产生。时序如图3所示。 图4给出了键盘接受一个字节的时序。为了避免在同一时刻发送数据,应将CLK拉低大约100 uS以上, 以禁止键盘发送数据。然后主机将数据线DATA拉低,发送起始位,并释放CLK(高电平),由键盘接管CLK,以产生时钟信号。主机在此同步时钟信号下发送数据。键盘接收数 据是从检测到DATA变低开始,然后在CLK为高电平时读取数据,这与键盘发送数据时的情形相反。当主机发送完校验位后,释放数据线DATA(停止位)。随后,键盘将DATA置成低电平,作为收到数据的应答信号(ACK),并产生一个周期的时钟脉冲。如果在第11个脉冲后,主机未释放DATA,键盘将继续发送时钟信号到DATA空闲。 软件编程与调试 1、接口设计 PS/2键盘 单片机 Data T1(P3^5) CLk INT1(P3^3) LCD液晶 单片机 Data Bus P0 RS           P2^3 RW P2^5 E P2^7     流程简图 源程序 #includereg52.h #includelcd12864.c//包含128X64驱动程序 #includeintrins.h sbit Key_Data =P3^5;//定义Keyboard数据端口引脚 sbit Key_CLK=P3^3; //中断端口,时钟线 static unsigned char KeyV=0X00; //键值 static unsigned char BF = 0; //标识是否有字符被收到 static unsigned char IntNum = 0; //中断次数计数 bit dx=0; //大小写标志 dx==1时大写状态 /*************************/ void Keyboard_out(void) interrupt 2//键盘中断处理 键值存储在 KeyV 中 { if ((IntNum0) (IntNum 9)) { KeyV = KeyV 1; //因键盘数据是低高,结合上一句所以右移一位 if (Key_Data==1) //当键盘数据线为1时 {KeyV = KeyV | 0x80;} //存储一位 } IntNum++; //中断次数加一(中断一次接收一位数据) if (IntNum 10) //中断11次后数据发送完毕 { IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收 BF = 1; //标识有字符输入完了 EA = 0; //关中断等显示完后再开中 } } void Decode() //键值处理 { unsigned char TempCyc; signed char k; TempCyc=KeyV; if(BF==1) //接收完一个有效数据时 { BF=0; //准备下一次接收 switch ( TempCyc ) //键值与显示字符的对应关系 { //键值// //对应字符// case 0x8A:

文档评论(0)

mydoc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档