51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > 51单片机 > 详细内容
单片机系统与标准PC键盘的接口模块设计
发布时间:2009/6/29  阅读次数:1666  字体大小: 【】 【】【

标准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所示。

       在主程序中检测到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+按键等组合键,该模块并未考虑,但相对上位的单片机系统而言,目前所提供的按键数量已足够用了。

  

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号