51单片机系统与标准PC键盘的接口模块设计

发布者:山宝宝最新更新时间:2011-11-07 关键字:单片机系统  PC键盘  接口模块  输入  FIFO 手机看文章 扫描二维码
随时随地手机看文章

概述
    在单片机系统中,当输入按键较多时,在硬件设计和软件编程之间总存在着矛盾。对于不同的单片机系统需要进行专用的键盘硬件设计和编程调试,通用性差,使项目开发复杂化。标准PC键盘在工艺与技术上都已相当成熟,而且工作稳定,价格低廉。本设计实现了一个接口模块,它将标准PC键盘发出的位置扫描码,变换为标准的ASCII码和OEM扫描码或Windows虚拟键代码,再以并行或串行方式传送给上位单片机。

接口模块的特点
    该模块在PC键盘与上位单片机之间起转换作用,它屏蔽了与PC键盘进行数据和命令交互的复杂过程,大大简化了上位单片机系统的输入设计;它实现了类似DOS操作系统中键盘中断服务程序的功能,使设计人员只需关心接收按键的结果,并可使用标准的键盘编码进行编程;它要求上位单片机通过8位并行接口与其相接,对于不能提供并行接口的系统,可使用SPI兼容的同步串行接口与其相接,特别是对于那些希望占用单片机的系统资源少而需要扩展的键数较多、仪器整体需要美观大方的应用场合,其性能价格比更具优势。该模块与单片机系统的连接关系如图1所示,在图中也给出与上位单片机相接的20脚接插件的信号定义。

计算机中标准PC机键盘的工作原理


 

           图1 该模块与上位单片机系统的连接关系及信号定义

 

      图2 键盘接口时序(a) 键盘发送时序;(b) 键盘接收时序

 

     图3 单片机系统与标准PC键盘接口模块原理框图

    键盘与主机通过键盘插头相接,键盘插头有5芯大插头和6芯小插头(PS/2接口)两种。接口信号有:电源、地、键盘时钟KB_CLK、键盘数据KB_DAT。正常工作时,键盘电路不断地扫描键盘矩阵。若有键按下,则以串行方式发送按键的位置扫描码给主板键盘接口电路。按下键时,发送接通扫描码,松开键时,发送该键的断开扫描码。断开扫描码一般是在接通扫描码前加一个断开标志字节F0H。若某键一直按下,则以按键重复率连续发送该键的接通扫描码。扫描码与按键的位置有关,与该键的ASCII码并无对应关系。表1第二列给出经实际测试得到的若干按键的位置扫描码。由表1可见,根据键的按下或释放及所按键的不同,这个序列可以是1、2、3、4、6、或8字节,可称之为位置扫描码序列。

    标准键盘与主机的通信是双向的,并采用11位的串行异步通信格式,这11位数据包括:起始位0、8位数据位(LSB在先)、奇校验位P、停止位1。图2(a)给出了键盘发送时序。数据(KB_DAT)在时钟(KB_CLK)的上升沿改变,下降沿时有效,可被主机读取。图2(b)给出键盘接收时序。主机发送前,先将KB_CLK拉低,以抑制键盘发送,再将KB_DAT拉低发送起始位,然后释放KB_CLK线,键盘接管KB_CLK并产生时钟信号,主机在KB_CLK信号同步下发送其他位。

标准PC键盘接口模块的工作原理
基本工作原理概述
    该模块的原理框图如图3所示。PC键盘与该模块通过专用插座相连,数据KB_DAT接到AT89C2051的P3.0引脚,时钟KB_CLK接到引脚。在PC键盘有键按下时,KB_CLK信号会引起AT89C2051的连续中断,通过定时器T0与外中断的协同工作,可将PC键盘发出的位置扫描码序列接收至缓冲区中。然后,在主程序中将位置扫描码解码、查表换算,再编码成一字节的WINDOWS虚拟键代码或两字节的OEM扫描码与ASCII码,并存入系统中FIFO栈。在上位单片机可以接收新键值时,将FIFO栈中编码数据以并行或串行方式传送给上位单片机。

    为了能更清楚地指示系统当前的工作状态,在硬件上加装了电源、正在解码、FIFO栈溢出、码值准备好等指示灯。

中断解码的工作原理
   
由于键盘的按键输入是随机的,为了能实时地响应,在程序中使用定时器T0中断和中断协同工作,将位置扫描码序列恢复至键盘接收缓冲区中。中断服务程序用来将码值的一位移入缓冲区中,T0溢出的中断服务程序主要用来判断一次按键所发出的码是否已全部接收。系统设置T0的定时间隔为5ms,并在系统启动后就开始定时。由于在正常接收每个按键的码值序列过程中,键盘发送的每位数据间隔不会大于5ms,因此在每次中断服务中,首先要判断T0是否溢出过,若曾经溢出,则认为该次中断是一次新码值接收的开始,需将位计数器清零,否则只需移入一位数据即可,然后重新启动定时器,退出中断服务程序。在新按键码值序列接收完成后,设置blnDataValid标志,以通知主程序。

主程序的工作原理
    主程序主要有四个任务:①将键盘接收缓冲区的位置扫描码通过查表等算法换成统一编码的一个字节Windows虚拟键代码或两个字节的OEM扫描码与ASCII码;②根据系统中CAPS LOCK键、NUM LOCK键及SCROLL LOCK键的状态信息控制键盘上三个指示灯的亮灭;③系统中设立的FIFO栈的维护;④与上位单片机码值传送的握手交互过程。主程序的流程图如图4所示。[page]

    在主程序中检测到blnDataValid标志后,即说明在键盘接收缓冲区中已接收到一个新的位置扫描码序列,程序根据这个序列的不同特点做不同的处理,最后再根据硬件跳线的设置得到相应按键的Windows虚拟键代码或ASCII码与OEM扫描码,图4中的跳线接至“W”位时,编码为Windows虚拟键代码。虚拟键代码是Windows系统中引入的一组按键编码常量,每一个按键都有惟一的码值与之对应。ASCII码与OEM扫描码则是在DOS系统定义的,但在Windows系统中沿用的按键码值定义,每一个按键都有两个码值与之对应,对于功能键,例如F1、HOME、UP等,只存在OEM扫描码,其ASCII码为0,参见表1。

    FIFO栈是程序中设置的发送缓冲区,它是按“先进先出”原则建立的32字节循环队列,有一个队列头指针和一个队列尾指针。进队列时,编码数据进入由队列尾指针所指单元,同时队列尾指针增量,指向下一个单元,当数据不断进入队列,使尾指针指向队列末端时,尾指针循环重新绕回队列始端;出队列时,编码数据从队列头指针所指的单元取出,同时队列头指针增量,指向下一个单元,在头指针指向队列末端时,也要重新绕回队列始端,但头指针始终不能“超过”尾指针。如果按键速度快于上位单片机接收码值的速度,有可能尾指针绕回后与头指针再次相等,这时表明队列已满,不能再存入数据,如果此时再有键按下,那么栈溢出指示灯将点亮。

    在系统中设立了三个标志分别对应于CAPS LOCK键、NUM LOCK键及SCROLL LOCK键的状态,每次有这三个键按下时,程序都要翻转相应标志,然后向键盘发送EDH命令,命令键盘对其上的三个LED指示灯做相应激励。
在向上位单片机发送FIFO栈首的码值之前要先检测ACK信号状态以确定上位单片机是否已取走上次码值。若ACK信号有效,则将码值锁存在P1口上,然后由P3.7产生模拟的时钟脉冲信号,一方面将8位并行码值置入串-并转换芯片(74LS165)中,另一方面将触发器(74LS74)置为1,使端变为0,为上位单片机提供码值准备好(PS_READY#)的状态信号,并点亮指示灯。在上位单片机中,可查询此状态信号也可利用此状态信号申请中断。上位单片机若采用并行接口方法,则发出读缓冲器信号(P_RD#)和片选信号(P_CS#),便可通过三态缓冲器(74LS244)取得键值;若采用串行接口方法,则需发出串行时钟(S_CLK),从74LS165的串行数据端(S_DAT)读回8位码值。在上位单片机读取完当前的键值后,ACK信号将由握手逻辑自动置为有效,系统可通过检测ACK信号的状态以发送下一个码值。

 

图4 主程序流程图

结语
     实践证明应用该模块不但可大大地简化键盘输入电路及程序设计,而且在使用高级语言书写程序时更加方便。该模块可识别标准PC键盘上的所有按键,并能自动考虑SHIFT、NUMLOCK及CAPLOCK键对编码的影响。对于DOS系统中CRTL+按键、ALT+按键等组合键,该模块并未考虑,但相对上位的单片机系统而言,目前所提供的按键数量已足够用了。

 

 

关键字:单片机系统  PC键盘  接口模块  输入  FIFO 引用地址:51单片机系统与标准PC键盘的接口模块设计

上一篇:基于51单片机的智能婴儿车控制系统设计
下一篇:基于51单片机多机通信的交通灯控制网络设计

推荐阅读最新更新时间:2024-03-16 12:45

STM32的8种GPIO输入输出模式深入详解
输入模式 -输入浮空(GPIO_Mode_IN_FLOATING) -输入上拉(GPIO_Mode_IPU) -输入下拉(GPIO_Mode_IPD) -模拟输入(GPIO_Mode_AIN) 输出模式 -开漏输出(GPIO_Mode_Out_OD) -开漏复用功能(GPIO_Mode_AF_OD) -推挽式输出(GPIO_Mode_Out_PP) -推挽式复用功能(GPIO_Mode_AF_PP) 输入浮空:浮空就是逻辑器件与引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时, 相当于该引脚接了高电平。一般实际运用时,引脚不建议悬
[单片机]
STM32的8种GPIO<font color='red'>输入</font>输出模式深入详解
模块接口设计不匹配引起的问题
如果没有一个技术能力很强的集成者,往往在模块间容易出现设计上的错误。这种情况是灾难性的,双方都是在需求文件上设计出来的东西,但是由于集成者的问题,这方面往往变成模糊设计或者假定设计,然后就会出现很多问题。 如下: 甲方的设计如图1,假定输出信号的通断的内阻是变化的,如下: 乙方的实际设计与甲方设想的完全不同,采用OC门做设计,而且加入上拉环节,最致命的还是外部限流电阻。 实际考虑因素: 1.由于OC门的集电极电流增大了,OC门的饱和性受一定影响,Vce电压增大 2.由于地偏移的因素,可能两个电压相差1V                                                      
[电源管理]
<font color='red'>模块</font>间<font color='red'>接口</font>设计不匹配引起的问题
MPLAB C30安装后没有输入序列号的步骤
在安装MPLAB IDE v8.40完成后,需要安装编译器。我安装的是MPLAB C30,安装过程没有任何提示也没有输入序列号的界面,直接安装完成了。此时的安装不完整的,需要自己输入序列号才可以使用。(在网上找了好多方式,自己试成功了来分享一下经验。) 输入序列号步骤: 1. 打开pic30-lm.exe所在文件夹。我的文件目录为:C:Program Files (x86)MicrochipMPLAB C30bin。 2.在命令状态下查看该文件许可状态 ,并输入相应序列号。 3 . 退出命令状态,重新运行pic-lm.exe文件。
[单片机]
MPLAB C30安装后没有<font color='red'>输入</font>序列号的步骤
Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入
前面几篇文章试验都是讲解如何使用 I.MX6U 的 GPIO 输出控制功能, I.MX6U 的 IO 不仅能作为输出,而且也可以作为输入。 I.MX6U-ALPHA 开发板上有一个按键,按键连接了一个 IO,将这个 IO 配置为输入功能,读取这个 IO 的值即可获取按键的状态(按下或松开)。本篇文章通过这个按键来控制蜂鸣器的开关 1、按键输入简介 按键就两个状态:按下或弹起,将按键连接到一个 IO 上,通过读取这个 IO 的值就知道按键是按下的还是弹起的。至于按键按下的时候是高电平还是低电平要根据实际电路来判断。 I.MX6U-ALPHA 开发板上有一个按键 KEY0,本篇文章我们将会编写代码通过这个 KEY0 按键来控制
[单片机]
Linux之ARM(IMX6U)裸机按键<font color='red'>输入</font>实验(GPIO的输出与<font color='red'>输入</font>)
LVDS输入电平问题
LVDC输入电平 低压差分发信(LVDS)系统(见图1)运行在高数据率。这些系统在无噪声干扰和VCC稳定性方面非同一般,它们为两点间快速获得数据提供一种简易方法。LVDS系统其中一个设计参量是提供给LVDS驱动器输入的信号电平。重要的是在阈值电平附近(此时驱动吕在状态间开关转换输出)使LVDS驱动器的高电平和低电平输入保持平衡(对称)。 非对称输入影响 非对称输入影响很容易看到。如图2所示。当输入不在驱动器VTHRES开关转换电平中心时,接收器输出明显出现失真。 LVDS电平规范 到3.3V LVDS线驱动器的输入电平对于逻辑0为0.0VDC到0.8VDC、对于逻辑1为2.0VDC到3.0VDC。0.8VDC和2.0VD
[模拟电子]
解析80C51单片机中的cpu、存储器配置以及并行输入/输出口
单片机按存储结构可分为二类:一类是哈佛结构,另一类是普林斯顿结构。 ①哈佛结构所谓哈佛结构是指程序存储器地址空间与数据存储器地址空间分开的单片机结构,如80C51单片机采用哈佛结构,所以80C51单片机的程序存储器地址空间与数据存储器地址空间是分开的,各有64K存储空间。 ②普林斯顿结构所谓普林斯顿结构是指程序存储器地址空间与数据存储器地址空间合并的单片机结构,如MCS-96单片机采用普林斯顿结构,所以MCS-96单片机的程序存储器地址空间与数据存储器地址空间是合并的,共有64K存储空间。 1.单片机的CPU 图1是80C51单片机的内部结构框图。若除去图中的存储器电路和I/O部件,剩下的便是CPU。它可以分为运算器和控制
[单片机]
解析80C51单片机中的cpu、存储器配置以及并行<font color='red'>输入</font>/输出口
输入信号放大整形电路
输入信号放大整形电路 对于输出幅度比较小的正弦波信号,要测量其频率大小,首先要进行放大整形,变换成同频方波信号。实现北功能的电路如图所示。信号首先经过两只二极管D1,D2进行输入嵌位限幅,然后通过两级三极管组成的共射极放大器进行放大,待放大到足够的幅度后送至CD4093 施密特触发器 整形,从而可得到上,下沿非常陡峭的脉冲。
[模拟电子]
<font color='red'>输入</font>信号放大整形电路
2.75W恒压/恒流通用输入充电器电源的电路介绍
图1所示为2.75 W恒压/恒流(CV/CC)通用输入充电器电源的电路图,该设计采用了Power Integrations的LinkSwitch系列产品LNK613DG。这种设计非常适合手机或类似的USB充电器应用,包括手机电池充电器、USB充电器或任何有恒压/恒流特性要求的应用。 在本设计中,二极管D1至D4对AC输入进行整流,电容C1和C2对DC进行滤波。L1、C1和C2组成一个π型滤波器,对差模传导EMI噪声进行衰减。这些与Power Integrations的变压器E-sheild™技术相结合,使本设计能以充足的裕量轻松满足EN55022 B级传导EMI要求,且无需Y电容。防火、可熔、绕线式电阻RF1提供严重故障保
[电源管理]
2.75W恒压/恒流通用<font color='red'>输入</font>充电器电源的电路介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved