PS2键盘与单片机通信解读.docx
- 文档编号:3195009
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:13
- 大小:82.70KB
PS2键盘与单片机通信解读.docx
《PS2键盘与单片机通信解读.docx》由会员分享,可在线阅读,更多相关《PS2键盘与单片机通信解读.docx(13页珍藏版)》请在冰豆网上搜索。
PS2键盘与单片机通信解读
PS/2键盘与单片机通信
1、实验目的:
掌握PS/2键盘与单片机通信的原理,并能加以应用。
2、实验仪器:
单片机最小实验系统AT89S52,PS/2键盘
3、实验原理:
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拉低大约100uS以上,以禁止键盘发送数据。
然后主机将数据线DATA拉低,发送起始位,并释放CLK(高电平),由键盘接管CLK,以产生时钟信号。
主机在此同步时钟信号下发送数据。
键盘接收数
据是从检测到DATA变低开始,然后在CLK为高电平时读取数据,这与键盘发送数据时的情形相反。
当主机发送完校验位后,释放数据线DATA(停止位)。
随后,键盘将DATA置成低电平,作为收到数据的应答信号(ACK),并产生一个周期的时钟脉冲。
如果在第11个脉冲后,主机未释放DATA,键盘将继续发送时钟信号到DATA空闲。
4、软件编程与调试
1、接口设计
PS/2键盘单片机
DataT1(P3^5)
CLkINT1(P3^3)
LCD液晶单片机
DataBusP0
RS P2^3
RWP2^5
EP2^7
2、流程简图
3、源程序
#include
#include"lcd12864.c"//包含128X64驱动程序
#include
sbitKey_Data=P3^5;//定义Keyboard数据端口引脚
sbitKey_CLK=P3^3;//中断端口,时钟线
staticunsignedcharKeyV=0X00;//键值
staticunsignedcharBF=0;//标识是否有字符被收到
staticunsignedcharIntNum=0;//中断次数计数
bitdx=0;//大小写标志dx==1时大写状态
/*************************/
voidKeyboard_out(void)interrupt2//键盘中断处理键值存储在KeyV中
{
if((IntNum>0)&&(IntNum<9))
{
KeyV=KeyV>>1;//因键盘数据是低>>高,结合上一句所以右移一位
if(Key_Data==1)//当键盘数据线为1时(执行if语句里面的代码),当键盘数据线为0时(不执行if语句里面的代码),直接执行KeyV>>1
{KeyV=KeyV|0x80;}//当键盘数据线为1时,存储一位高电平1
}
IntNum++;//中断次数加一(中断一次接收一位数据)
if(IntNum>10)//中断11次后数据发送完毕
{
IntNum=0;//当中断11次后表示一帧数据收完,清变量准备下一次接收
BF=1;//标识有字符输入完了
EA=0;//关中断等显示完后再开中
}
}
voidDecode()//键值处理
{
unsignedcharTempCyc;
signedchark;
TempCyc=KeyV;
if(BF==1)//接收完一个有效数据时
{
BF=0;//准备下一次接收
switch(TempCyc)//键值与显示字符的对应关系
{//键值////对应字符//
case0x8A:
k=0;break;//0
case0x2C:
k=1;break;//1
case0x3C:
k=2;break;//2
case0x4C:
k=3;break;//3
case0x4A:
k=4;break;//4
case0x5C:
k=5;break;//5
case0x6C:
k=6;break;//6
case0x7A:
k=7;break;//7
case0x7C:
k=8;break;//8
case0x8C:
k=9;break;//9
case0x38:
k=17;break;//a
case0x64:
k=18;break;//b
case0x42:
k=19;break;//c
case0x46:
k=20;break;//d
case0x48:
k=21;break;//e
case0x56:
k=22;break;//f
case0x68:
k=23;break;//g
case0x66:
k=24;break;//h
case0x86:
k=25;break;//i
case0x76:
k=26;break;//j
case0x84:
k=27;break;//k
case0x96:
k=28;break;//l
case0x74:
k=29;break;//m
case0x62:
k=30;break;//n
case0x88:
k=31;break;//o
case0x9A:
k=32;break;//p
case0x2A:
k=33;break;//q
case0x5A:
k=34;break;//r
case0x36:
k=35;break;//s
case0x58:
k=36;break;//t
case0x78:
k=37;break;//u
case0x54:
k=38;break;//v
case0x3A:
k=39;break;//w
case0x44:
k=40;break;//x
case0x6A:
k=41;break;//y
case0x34:
k=42;break;//z
case0x98:
k=10;break;//;
case0xAA:
k=-5;break;//+
case0xF2:
k=43;break;//+
case0x52:
k=-16;break;//空格键
case0xB0:
k=101;break;//大小写控制键Capslock
}
if(k==101)
{
dx=!
dx;//按下大小写控制键时大小写标志取反
}
if(k==-16)//空格键按下时
{
write_data(-16+'0');
}
if(dx==1)//大写标志
{
if(k>=0&&k<=9)
{
if(k==0)
{
write_data(k-7+'0');
}
if(k==1)
{
write_data(k-16+'0');
}
if(k==2)
{
write_data(k+14+'0');
}
if(k>=3&&k<=5)
{
write_data(k-16+'0');
}
if(k==6)
{
write_data(k+40+'0');
}
if(k==7)
{
write_data(k-17+'0');
}
if(k==8)
{
write_data(k-14+'0');
}
if(k==9)
{
write_data(k-17+'0');
}
}
else
write_data(k+'0');
}
else//小写标志
{
if(k>16&&k<=42)
{
write_data((k+32)+'0');
}
if(k>=0&&k<=9)
{
write_data(k+'0');
}
if(k==10)
{
write_data((k+1)+'0');
}
if(k==-5)
{
write_data((k+18)+'0');
}
}
EA=1;
//write_data(0x01);
}
}
voiddelay(intx)//延时程序
{
inti,j;
for(i=0;i<600;i++)
for(j=0;j } voidmain() { lcd_init();//初始化液晶驱动硬件 //wlcome();//调用开机画面和欢迎界面子程序 IT1=1;//设外部中断1为下降沿触发 EA=1;//开总中断 EX1=1;//开中断1 while (1) { Decode(); delay(10); } } 4、程序调试与结果 测试软件: KeilC51Uvision3 结果: 按下PS/2键盘0-9、A-Z键都会在液晶上显示相应的键,如果按下CapsLock键再按0-9,A-Z,则显示相应按键的上标,或是大小写切换。 5、问题与讨论 1、PS/2协议是什么? 2、PS/2与单片机通信的原理如何? 附录1: lcd12864.c #include #include"LCD12864.h" #include #ifndefUCHAR #defineucharunsignedchar #ifndefUINT #defineuintunsignedint /*********初始化************/ voidlcd_init() { writeCmd(0x30);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PS2 键盘 单片机 通信 解读