ImageVerifierCode 换一换
格式:DOC , 页数:4 ,大小:35.50KB ,
资源ID:3549693      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3549693.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(51单片机模拟PS2协议.doc)为本站会员(hw****26)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

51单片机模拟PS2协议.doc

1、摘要 分析 PS/2 协议;介绍 PS/2 标准键盘的第二套扫描码和命令集,并给出在单片机系统中支持 PS/2 键盘的硬件连接方式和利用 Keil C51 语言实现的驱动程序设计及部分代码。该驱动程序可以方便地移植到其他单片机或嵌入式系统中。关键词 PS/2 协议 PS/2 键盘 单片机 驱动程序在单片机系统中,经常使用的键盘都是专用键盘。这类键盘都是单独设计制作的,成本高,连线多,且可靠性不高。这些问题在那些要求键盘按键较多的应用系统中显得更加突出。与此相比,在 PC 系统中广泛使用的 PS/2 键盘具有价格低、通用可靠,且使用的连线少(仅使用2 根信号线)的特点,并可满足多数系统的要求。因

2、此,在单片机系统中应用 PS/2 键盘是一种很好的选择。本文在分析 PS/2 协议和 PS/2 键盘工作原理与特点的基础上,给出在 AT89C51 单片机上实现对 PS/2 键盘支持的硬件连接方法以及驱动程序的设计实现。1PS/2 协议现在 PC 机广泛采用的 PS/2 接口为 miniDIN 6 引脚的连接器。其引脚如图 1 所示。1数据线(DATA);2未用;3电源地(GND);4电源(+5 V);5时钟(CLK);6未用。图 1PS/2 连接器 PS/2 设备有主从之分,主设备采用 female 插座,从设备采用 male 插座。现在广泛使用的 PS/2 键盘鼠标均工作在从设备方式下。P

3、S/2 接口的时钟与数据线都是集电极开路结构的,必须外接上拉电阻。一般上拉电阻设置在主设备中。主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生。(1) 从设备到主设备的通信当从设备向主设备发送数据时,首先会检查时钟线,以确认时钟线是否是高电平。如果是高电平,从设备就可以开始传输数据;否则,从设备要等待获得总线的控制权,才能开始传输数据。传输的每一帧由 11 位组成,发送时序及每一位的含义如图 2 所示。图 2 从设备到主设备的通信每一帧数据中开始位总是为 0,数据校验采用奇校验方式,停止位始终为 1。从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟下

4、降沿读入数据线状态。(2) 主设备到从设备的通信主设备与从设备进行通信时,主设备首先会把时钟线和数据线设置为“请求发送”状态。具体方式为:首先下拉时钟线至少 100 s 来抑制通信,然后下拉数据线“请求发送”,最后释放时钟线。在此过程中,从设备在不超过 10 s 的间隔内就要检查这个状态。当设备检测到这个状态时,将开始产生时钟信号。此时数据传输的每一帧由 12 位构成,其时序和每一位含义如图 3 所示。图 3 主设备到从设备的通信与从设备到主设备通信相比,其每帧数据多了一个 ACK 位。这是从设备应答接收到的字节的应答位,由从设备通过拉低数据线产生,应答位 ACK 总是为 0。主设备到从设备通

5、信过程中,主设备总是在时钟为低电平时改变数据线的状态,从设备在时钟的上升沿读入数据线状态。2PS/2 键盘的编码与命令集(1) PS/2 键盘的编码现在 PC 机使用的 PS/2 键盘都默认采用第二套扫描码集。该扫描码集可参考文献1。扫描码有两种不同的类型:通码(make code)和断码(break code)。当一个键被按下或持续按住时,键盘会将该键的通码发送给主机;而当一个键被释放时,键盘会将该键的断码发送给主机。根据键盘按键扫描码的不同,在此可将按键分为如下几类:第一类按键,通码为 1 字节,断码为 0xF0+通码形式。如 A 键,其通码为 0x1C,断码为 0xF0 0x1C。第二类

6、按键,通码为 2 字节 0xE0+0xXX 形式,断码为 0xE0+0xF0+0xXX 形式。如 right ctrl键,其通码为 0xE0 0x14,断码为 0xE0 0xF0 0x14。第三类特殊按键有两个,print screen 键通码为 0xE0 0x12 0xE0 0x7C,断码为 0xE0 0xF0 0x7C 0xE0 0xF0 0x12; pause 键通码为 0x E1 0x14 0x77 0xE1 0xF0 0x14 0xF0 0x77,断码为空。组合按键的扫描码发送按照按键发生的次序,如以下面顺序按左 SHIFT+A 键:1 按下左 SHIFT 键,2 按下 A 键,3

7、释放 A 键,4 释放左 SHIFT 键,那么计算机上接收到的一串数据为 0x12 0x1C 0xF0 0x1C 0xF0 0x12。在驱动程序设计中,就是根据这样的分类来对不同的按键进行不同处理的。(2) PS/2 键盘的命令集主机可以通过向 PS/2 键盘发送命令来对键盘进行设置或者获得键盘的状态等操作。每发送一个字节,主机都会从键盘获得一个应答 0xFA(“重发 resend”和“回应 echo”命令例外) 。下面简要介绍驱动程序在键盘初始化过程中所用的指令(详细键盘命令集见参考文献1):0xED 主机在本命令后跟随发送一个参数字节,用于指示键盘上 num lock, caps lock

8、, scroll lock led 的状态;0xF3 主机在这条命令后跟随发送一个字节参数来定义键盘机打的速率和延时;0xF4 用于在当主机发送 0xF5 禁止键盘后,重新使能键盘。3PS/2 键盘与单片机的连接电路PS/2 键盘与 AT89C51 单片机的连接方式如图 4 所示。P1.0 接 PS/2 数据线,P3.2(INT0)接PS/2 时钟线。因为单片机的 P1、P3 口内部是带上拉电阻的,所以 PS/2 的时钟线和数据线可以直接与单片机的 P1、P3 相连接。4 驱动程序设计驱动程序使用 Keil C51 语言,Keil uVision2 编程环境。PS/2 104 键盘驱动程序的主

9、要任务,是实现单片机与键盘间 PS/2 通信 ,以及将接收到的按键扫描码转换为该按键的键值 KeyVal,提供给系统上层软件使用。(1) 单片机与键盘间 PS/2 通信的程序设计在 PS/2 通信过程中,主设备(单片机)是在时钟信号为低时发送和接收数据信号的。因为单片机到键盘发送的是指令,需要键盘回应,所以这部分程序采用查询方式;而单片机接收键盘数据时,数据线上的信号在时钟为低时已经稳定,所以这部分程序采用中断方式,且不需要在程序中加入延时程序。单片机的键盘发送接口程序见本刊网站 。(2) 键盘扫描码转换程序设计由于键盘扫描码无规律可循,因此由键盘扫描码获得相应按键的键值(字符键为其 ASCI

10、I 值,控制键如 F1、CTRL 等为自定义值) ,只能通过查表的方式。由于按键的三种类型及部分按键对应着两个键值(如 A 键的键值根据 CAPS 和 SHIFT 键状态有 0x41(A)和 0x61(a)两种),因此综合考虑查表转换速度和资源消耗,设计中使用 4 个键盘表:键盘扫描码转换基本集和切换集 kb_plain_mapNR_KEYS与 kb_shift_mapNR_KEYS;包含 E0 前缀的键盘扫描码转换基本集和切换集 kbe0_plain_mapNR_KEYS与 kbe0_shift_mapNR_KEYS。PS/2 104 键盘按键扫描码最大值为 0x83,所以设置 NR_KEY

11、S 为 132。所有四个键盘表的定义均为如下形式:KB_MAPMAKE CODE=KEYVAL,如果扫描码对应的按键为空,如KB_MAP0x00,则定义相应键值为 NULL_KEY(0x00) 。以下是键盘扫描码基本集的部分代码实例:kb_plain_mapNR_KEYS=NULL_KEY;0x2C;0x6B;0x69;0x6F;0x30;0x39;NULL_KEY;/ 扫描码 0x400x47 file:/对应按键空,逗号,K,I,O,0,9,空file:/对应键值 0x00,k,i,o,0,9,0x00;图 4 硬件连接电路如此设计键盘转换表的另一个好处在于,以后如需扩展支持有ACPI、W

12、indows 多媒体按键键盘时,只需要将键表中相应处修改即可。如 ACPI power 按键通码为 0xE0 0x37,修改 kbe0_plain_map0x37=KB_ACPI_PWR 即可。特殊按键 PAUSE 使用单独程序处理,如果接收到 0xE1 就转入这段程序;而 print screen 键则将其看作是两个通码分别为 0xE0 0x12 和 0xE0 0x7C 的“虚键”的组合键来处理。在驱动程序中声明如下全局变量:led_status 其 bit0scroll lock led 关 0、开 1;bit1num lock led 关为 0,开为 1;bit2caps lock le

13、d 关为 0,开为 1;bit3bit7 总是 0;agcs_status 记录左右 shift ctrl gui alt 状态,bit0左 shift 键,bit1左 ctrl 键,bit2 左 gui 键,bit3左 alt 键,bit4 右 shift 键,bit5右 ctrl 键,bit6 右 gui 键,bit7右 alt 键,相应键按下则对应位为 1,释放为0。E0_FLAG 接到 0xE0 置 1;E1_FLAG 接收到 0xE1 置 1;F0_FLAG 接收到 0xF0 置 1。按键键值通过 KeyVal 提供给上层使用。PS/2 键盘扫描码键值转换程序 ps2_codetra

14、ns()流程如图 5 所示。图 5 扫描码键值转换程序流程第一类按键的扫描码键值转换程序代码:if (F0_FLAG) /接收扫描码为断码switch (mcu_revchar)/处理控制键case 0x11: agcs_statusbreak;/左 alt 释放case 0x12: agcs_statusbreak;/左 shift 释放case 0x14: agcs_statusbreak;/左 ctrl 释放case 0x58: if(led_status/caps lock 键else led_status =0x04;ps2_ledchange();break;case 0x59:

15、agcs_statusbreak;/右 shift 释放case 0x77: if(led_status/num lock 键else led_status =0x02;ps2_ledchange();break;case 0x7E: if(led_status/scroll lock 键else led_status =0x01;ps2_ledchange();break;default:break;F0_FLAG = 0;else /接收扫描码为通码if (led_status else caps_flag = 0;if (led_status else num_flag = 0;if (

16、scga_status else shift_flag = 0;file:/扫描码键值转换if (caps_flag = shift_flag) (!num_flag) KeyVal=kb_plain_mapmcu_revchar;else KeyVal=kb_shift_mapmcu_revchar;switch(mcu_revchar)/处理控制键或状态键case 0x11: agcs_status = 0x08;/左 alt 按下case 0x12: agcs_status = 0x01;/左 shift 按下case 0x14: agcs_status = 0x02;/左 ctrl 按

17、下case 0x59: agcs_status = 0x10;/右 shift 按下default: break;第二类按键的扫描码键值转换程序与上相似。要注意的是在退出该程序段时对 E0_FLAG和 F0_FLAG 标志的清 0。PAUSE 键的处理程序:如果接收到 0xE1,置 E1_FLAG 1,然后顺次将后续接收到的 7 个字节数据和 PAUSE 的通码后 7 个字节比较,一致则返回 KeyVal=KB_PAUSE。在比较完所有7 个字节后清除 E1_FLAG 标志。键盘初始化程序 kb_init()流程: 上电后,接收键盘上电自检通过信号 0xAA,或者自检出错信号 0xFC。单片机

18、接收为0xAA,进入下一步,否则,进行出错处理。 关 LED 指示,单片机发送 0xED,然后接收键盘回应 0xFA,接着发送送 0x00 接收 0xFA。 设置机打延时和速率。 单片机发送 0xF3,接收 0xFA,发送 0x00(250ms,2.0cps),接收0xFA。 检查 LED,发送 0xED,接收 0xFA,发送 0x07(开所有 LED),接收 0xFA。发送 0xED,接收 0xFA,发送 0x00(关 LED),接收 0xFA。 允许键盘发送 0xF4,接收 0xFA。键盘 LED 改变 ps2_ledchange()函数流程:发送 0xED 接收 0xFA发送 led_s

19、tatus接收0xFA。结语该驱动程序经 Keil uVision2 编译,在 AT89C51 单片机上运行通过,实现了对 PS/2 104 键盘的支持,以及对字符按键大小写切换,num lock 切换,控制键及组合按键的支持。该程序对其他嵌入式或单片机系统中 PS/2 键盘的应用也有借鉴意义。参考文献1Adam Chapweske. The ATPS/2 Keyboard Interface. http:/panda.cs.ndsu.nodak.edu/%7Eachapwes/PICmicro/keyboard/atkeyboard.html2Adam Chapweske. PS/2 Mouse/Keyboard Protocol. http:/govschl.ndsu.nodak.edu/achapwes/PICmicro/PS2/ps2.htm3Network Technologies Incorporated. PS/2 Keyboard & Mouse Protocols. http:/ Linux 2.4.10 内核程序 defkeymap.c dn_keyb.c kbd.c keybdev.c keyboard.c kbd_kern.h kd.h keyboard.h

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。