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