工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->光电电路图->其他光电实用电路图->用单片机设计制作的PS/2标准键盘接口

用单片机设计制作的PS/2标准键盘接口

作者:dolphin时间:2016-09-14

  标准PS/2键盘在微机中广泛使用,其性能优异、使用方便、价格低廉。由于此键盘接口通信协议简洁、在系统中占用软硬件资源少、可靠性高、表达信息量大,因而同样适合于要求按键较多的嵌入式系统。

  1.PS/2协议分析
  
  PS/2通信协议是一种双向同步串行通信协议。通信的双方通过CLOCk时钟脚同步,通过Data数据脚交换数据。PS/2的数据是按帧进行传输的,每帧数据有11位(键盘对主机)或12位(主机对键盘),包括一个起始位、8个数据位(低位在前)、一个校验位(奇校验)、一个停止位及一个应答位(仅用于主机对键盘的通信)。常用的PS/2连接器如下图所示。

PS/2连接器

  任何一方想抑制另外一方通讯时,只需要把Clock时钟脚拉到低电平。如果是PC机和PS/2键盘间的通讯,则PC机必须做主机。也就是说,PC机可以抑制PS/2键盘发送数据,而PS/2键盘则不会抑制PC机发送数据。两设备间传输数据的最大时钟频率是33kHz,推荐值为l5kHz左右,即Clock时钟脚高、低电平的持续时间都约为40μs。
  
  (1)PS/2键盘到主机的通信
  
  当键盘向主机发送数据时,检查时钟脚Clock,如果是低电平,则认为是PC机抑制了通讯,此时它必须缓冲需要发送的数据直到重新获得总线的控制权(一般PS/2键盘有16个字节的缓冲区):如果为高电平,PS/2设各使开始按照数据帧格式顺序将数据发送到PC机,数据位在时钟线为高电平时准备好,在时钟线的下降沿时被主机读取。
  
  (2)主机到PS/2键盘的通信
  
  主机与键盘进行通信肘,首先要下拉时钟线至少1OOμs来抑制通信,然后下拉数据线“请求发送”,最后释放时钟线。当键盘检测到上述状态时,开始产生时钟信号,并检测数据线是否为低,为高则认为是错误并退出,为低则继续执行。此时,每一帧数据由12位构成,比键盘到主机的数据多一个ACK位。ACK是从设备发出的应答位,ACK位总是为0。主机到键盘通信过程中,主机总是在时钟为低电平时改变数据线的状态键盘则在时钟的上升沿时读取数据。
  
  (3)键盘命令
  
  主机通过向PS/2键盘发送命令来对键盘进行设置或获得键盘的状态。每发送一个字节,主机都会从键盘获得一个应答OxFA(除“重发resend”和“回应echo”命令外)。键盘命令包括19个主机到键盘的命令和8个键盘到主机的回应命令。常用的主机到键盘的命令包括:
  
  键盘复位命令(reset-HexValue:FF):键盘接收到该命令后发送一个ACK位通知主机已收到命令,并等待主机确认收到ACK位,确认过程是主机收到ACK后将时钟线和数据线置高至少500μs,键盘检测到该状态后将执行复位操作并进行自检。
  
  扫描码集选择命令(selectaLTErnatesCANcodes-HexValue:FO):主机发送该命令并通过随后发送的参数字节指示键盘选用现有三套扫描码集中的哪一套,通常使用的是第二套扫描码集。参数字节为Hex01时使用第一套,为Hex02时使用第二套,为Hex03时使用第三套,为Hex00时为查当前使用的扫描码集。键盘接收到该命令并据其选择对应的扫描码集后,会再发送一个字节给主机,告知其当前使用的扫描码集。设置指示灯状态命令(set/resetstatusinDICators-HexValue:ED):主机在该命令后接着发送一个参数字节,用于指示键盘上numlock、capslock、scrolllockLED的状态。参数字节的高5位必须为0,低三位由低到高分别为scrolllock、numlock、capslock指示位,置1时对应LED灯亮,置0对应时LED灯灭。
  
  设置机打速率和延时命令(settyPematICrate/delay-HexValue:F3):主机在这条命令后接着发送一个字节参数来定义键盘机打的速率和延时。
  
  键盘使能命令(enable--HexValue:F4):用于在当主机发送禁止键盘命令(HexValue:F5)后,重新使能键盘。
  
  回音命令(echo--HexValue:EE):主机发送该命令后,键盘应回应一个“EE”宇节。该命令属于诊断辅助命令,常用于检测通信是否正常。
  
  (4)键码分析
  
  PS/2键盘中的微处理器负责扫描或监视按键信息,并发送扫描码信息包。扫描码包括通码和断码,当一个键被按下或持续按住时,键盘会将该键的通码发送给主机,而当一个键被释放时,键盘会将该键的断码发送给主机。例如,对于大写字母“F”,当接下时通码是“2B”,弹起时断码是“FO,2B”。每个键的被分配了唯一的通码和断码,若干个键构成的一套通码和断码组合成扫描码集。标准PC键盘普遍采用第二套扫描码集。
  
  根据扫描码查找ASCII码对照表,即可完成扫描码与ASCII码的关联。应当注意的是,键盘断开标志码FOH和接通码之间应该有一定的延时间隔(几十毫秒即可)。

  2.实现原理
  
  用一片AT89C2O5l单片机作PS/2接口控制部件,扩展PS/2接口并配以一些外围电路来实现PS/2接口协议。扩展l602LCD接口及LCD以显示PS/2键盘所输入字符。电路如下图所示,AT89S52单片机可用任何其他嵌入式处理器替换。AT89C2O5l单片机负责实现PS/2接口协议,正确可靠地接收键盘发来的数据并与通过中断方式并行传送给嵌入式系统。其优点是:独立的PS/2接口无需过多占用主CPU89522的资源,且通用性强,可以与以任何处理器为核心的嵌入式系统连接。

  当使用键盘输入数据时,PS/2接口首先将串行数据信号和时钟信号发送给AT89C2O51,如果检测到起始位,则开始记录随后的串行数据,经校验、串并转换、缓冲等处理后,向应用系统模块发送中断请求和并行数据,该并行数据为除去起始位、停止位以及奇偶校验位后的8位帧数据。应用系统模块随后进行奇偶校验和数据处理,并提交给上层软件使用,本设计为提交给LCD显示程序做屏幕显示。
  
  当主机向键盘发送命令时,应用系统模块首先通过AT89S52的p3.4引脚向AT89C2O5l单片机发送中断请求信号和并行命令数据,AT89C2O5l单片机收到中断请求后进入中断处理程序,先按时序要求下拉clk和data信号线向PS/2键盘请求发送,随后读入并行数据,计算出校验位数值,组合成包含停止位的帧数据,以串行方式发送到data信号线。键盘接收到数据后,反馈一个ACK信号给AT89C2O5l单片机。
  
  在以往的工程实例中,往往用MCU口线模拟时序进行接收,即将键盘时钟线接至MCU的中断线,将数据线接至MCU的任一I/0口,通过查询DATA的位状态,来进行通信。该方式实现简单,不用添加任何硬件,但至少要中断33次才能完成一次接收,如果系统任务较多,容易导致系统反应迟缓或容易丢失键盘数据。用本设计中的设计方法,则很好地解决了这个问题,且通用性强,具有很高的实用价值。

PS/2标准键盘接口电路

  3.驱动程序设计
  
  驱动程序在KeiluVision2编程环境下使用C语言编写。其主要任务是实现系统与键盘间的PS/2通信,以及将接收到的按键扫描码转换为按键的键值KeyVal,提供给系统上层软件使用。在PS/2通信过程中,主设各是在时钟信号为低时发送和接收数据信号的,且系统到键盘发送的是指令需要键盘回应;而系统接收键盘数据时,数据线上的信号在时钟为低时已经稳定,因此也不需要单独加入延时程序一样运行良好。
  
  (1)系统到键盘的通信程序设计
  
  系统到键盘的通信主要是发送一些键盘命令,例如键盘指示灯的控制是通过系统发送命令的方式来实现的,键盘本身并不会根据numLOCk,capslock,scroUlock键的状态改变指示灯的状态。首先由AT89S52向AT89C2O51发送中断请求,后者进入中断服务程序,以并行方式读取命令数据,之后以串行方式发送并等待ACK确认信号。该部分的程序流程如下图所示,该部分功能由AT89C2O5l完成。
  
  如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0。也就是说数据位中1的个数加上校验位中1的个数总为奇数,所以总进行奇校验。

系统到键盘通信程序流程图

  (2)键盘到系统的通信程序设计
  
  键盘到系统的通信,是由AT89C2O5l以查询方式接收来自键盘的数据,如收到有效数据,则向AT89S52发送中断请求,后者进入中断服务程序进行处理。AT89C2O51检测到起始位就开始接收数据,校验有效则向AT89S52发送中断请求和并行数据。该部分的程序流程如下图所示。该部分功能由AT89C2O51完成。

键盘到系统通信程序模块流程图

  每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1。键盘到系统通信时,系统总在时钟下降沿读入数据线状态。
  
  (3)数据处理程序设计
  
  数据处理程序对接收到的来自键盘的数据进行处理,这些数据可以是回应命令或者扫描码,因此需要有合理的判断和处理。
  
  回应命令一共有8条,最常用的是AcknowLEDge(HexValue:FA),对于扫描码,根据其字节长度可分为以下几类:
  
  第一类扫描码,通码为1字节,断码为“OxFO+通码形式”。如A键,其通码为1C,断码为“FO1C”。
  
  第二类扫描码,通码为2字节“EO+XX”形式,断码为“EO+FO+XX”形式。
  
  如rightCTRl键,其通码为“EO14”,断码为“EOFO14”。
  
  第三类特殊扫描码,有两个,printscreen键通码为“EO12EO7C”,断码为“EOFO7CEOFO12”;pause键通码为“E11477E1FO14FO77”,断码为空。
  
  组合按键的扫描码序列则是按照按键发生的次序构成的。如左Ctrl键的通码为14,断码为FO14,C键的通码为21,断码为FO21,若以下面顺序按左Ctrl+C键:(1)接下左Ctrl键,(2)接下C键,(3)释放C键,(4)释放左Ctrl键,那么计算机接收到的一串数据为“1421FO21FO14”。
  
  数据处理模块的程序流程如下图所示。

数据处理模块的程序流程

  在驱动程序中应声明numlock、capslock、scrolllock、SHIFT、ALT、CTRL(L/R)、GUI(L/R)键的标志变量为全局变量,还要建立一个数组SCAN_data用于存放扫描码序列,还要建立EO_FLAG、E1_FLAG、FO_FLAG三个标志变量用于数据处理程序模块内部做分支选择,以及一个keypress_fl标志变量用于标示键的状态。该部分功能由AT89S52完成。
  
  从上图可以看出,数据分为回应命令、PAUSE键、PRINTSCREEN键、第二类扫描码、第一类扫描码五个分支块来处理,而后面的三个分支块都内含一个相同的程序流程结构,如下图所示。该流程结构用于将扫描码细化到通码和断码分开处理。


  
  该设计方法保证了第二类扫描码和PRJNTSCREEN键的断码有独立的处理过程,在开发驱动程序时忽略这个步骤。
  
  (4)键盘扫描码转换程序设计
  
  将扫描码转换成ASCII码需要建立一张完备的对照表。该部分的设计需要考虑键接下与放开的状态,以及shift键和CapsLock键在不同状态下的逻辑上下面给出扫描码转换时大小写处理的关键程序。
  
  If((shift_flag==Falandcapslock-flag==False)or(sflag==Trueandcapslock_flag==True))and(tempASCllOx40)and(temPASCiiOx5Aand(keypress-flag==True)) {temPASCu..=temPASCii+321}
  
  (5)LCD显示程序设计
  
  RTl602C是基于HD44780芯片构建的2行16列字符型的液晶显示模块,其接口只需要8条数据线和3条控制线即可。下面给出该部分驱动程序的部分代码。
  
  voidwriteIColu.struction(charinstru)//向LCD写命令
  
  {
  
  inti;
  
  for(i=DELAY;i0;i-.};//延时
  
  LCD_CTL=Ox4;//清零RS位(命令),清零R/W位(写入)
  
  LCD-DATA-DIR=LCD-DATAOUTI檄据传输方向
  
  LCD_DATA=instru;//发送命令
  
  for(i=DELAY;i0;i一一);//延时
  
  LCD-CTL=0;
  }
  
  voidwritelcddata{charlcddata)//向LCD写数据
  
  {lnt1;
  
  for(i=DELAY;i0;i一一);//延时
  
  LCD_CTL=Ox6;//置位RS位(数据),清零R/W位(写入)  
  
  LCD-DATA-DIR=LCD-DATA-OUT;/,,IAII方向LCD_DATA=kddata;//发送数据
  
  for(i=DELAY;i0;i-→;//延时
  
  LCD-CTL=0;}



评论

技术专区