资源目录
压缩包内文档预览:(预览前20页/共28页)
编号:512607
类型:共享资源
大小:146.16KB
格式:RAR
上传时间:2015-11-11
上传人:QQ28****1120
认证信息
个人认证
孙**(实名认证)
辽宁
IP属地:辽宁
6
积分
- 关 键 词:
-
毕业设计
- 资源描述:
-
基于单片机的PS2键盘的驱动设计,毕业设计
- 内容简介:
-
2008 届 毕业设计 (论文 ) 1 第一章 绪 论 1.1 选题的依据及意义 在工业化社会突飞猛进的今天,人力作业逐渐被全自动工业机械所取代,在现代化的工厂中往往一个工作人员坐在布满按键的控制车间里操纵一条生产线 。这些发布指令的键盘大多是专为特定机型单独设计制作,虽然这样有较好的针对性,但是此类系统中的专用键盘在使用中暴露出这样那样不少致命的缺陷, 例如:单独设计制作 、通用性差、 成本高、使用硬件连接线多 、 可靠性不高 、替换时费时且麻烦等, 这一状况在那些要求键盘按键较多 且需自定义键盘按键 的应用系统中更为突出 。设计一种通用型强、价格低廉、可靠性高的键盘 来取代这些专用键盘,是一种非常好的选择。 PC机上使用的 PS/2 标准键盘包含了输入信息的绝大部分,而且部分按键还可以自定义,这样的配置可以满足大部分系统的输入请求。 本项目是编辑一个基于单片机的 PS/2 键盘的驱动, 主要内容是使得 PS/2键盘能在单片机系统中顺利使用。 若能顺利完成,达到预期的目的,将大大改善当前 单片机系统中键盘 的诸多问题, 所以本课题具有很强的实际意义和研究价值。 1.2 本课题 的可行性分析 PS/2键盘是各个电脑公司为其台式 PC机设计制造的具有各个特色的信息输入设备,尤其以 IBM 公司的 PS/2 键盘 为代表。 在 键盘内部采用的 是 Intel8048单片机微处理器,这是一个 40引脚的芯片,内部集成了 8位 CPU、 10248 位的ROM、 648 位的 RAM 以及 8 位的定时器计数器等。译码器即信号编码转译装置,把键盘的字符信号通过编码翻译转换成相应的二进制码 。 其支持多种操作系统,同时也支持多种编辑语言编写的驱动程序。 再则,单片机系统中提供 Keil C51语言以及 KeiluVision2 编程环境 , 通过这个工具可以方便的根据不同的硬件,制定基于单片机要求的 PS/2键盘驱动 。 所以,该系统在硬件和开发环境上都得到了满足, 它是可行的 。 1.3 本课题的 应用 前景 随着社会工业化进程的加快,机械自动化生产越来越体现出其精确、快速、不受工作时间地点限制的优越性。在自动生产中发挥核心作用是以单片机为核心的系统,此类单片机系统中主要以键盘按键较多的应用系统为主。然而此类系统中的专用键盘在使用中暴露出这样那样不少致命的缺陷,例如: 单独设计制作 、nts2008 届 毕业设计 (论文 ) 2 通用性差、 成本高、使用硬件连接线多 、 可靠性不高 、替换时费时且麻烦等, 这一状况在那些要求键盘按键较多 且需自定义键盘按键 的应用系统中更为突出 。 与此 寻找价格低、通用可靠、维修替换方便的通用键盘显得尤为重要 。 在 PC 系统中广泛使用 PS/2 键盘具有价格低、通用可靠 ,且使用连接线少 (仅使用 2 根信号线 ),并可满足多种系统要求 等 的特点 。 因此在单片机系统中 用 PS/2 键盘 代替专用键盘 是一种很好的选择 。 在 PS/2 键盘普及的今天其使用者越来越多,技术越来越成熟,使用 PS/2键盘代替单片机系统的专用键盘有着非常明显的优势: (1) 无需为每个单片机系统,单独设计键盘 (2) 成本低,使用简单 (3) 通用性强、替换方便 1.4 本课题研究目标与内容 本系统的开发 使用 Keil C51 语言以及 KeiluVision2 编程环境 ,对基于单片机的 PS/2 键盘的驱动进行编写。 研究目标:掌握 PS/2 键盘协议、 掌握单片机的引脚使用方法、 掌握 Keil C51语言以及 KeiluVision2 编程环境 、 编写适用于单片机系统的 PS/2 键盘驱动程序,调试驱动程序实现 PS/2 键盘在单片机系统中的使用。 本课题的主要内容是编写驱动程序、设计键盘与单片机的引脚连接方式,使PS/2 键盘在单片机系统中顺利的使用。 1.5 本课题研究方案 本课题的研究开发过程大致分为以下几个步骤: (1) 查阅资料,掌握 PS/2键盘协议, PS/2键盘 的物理结构及工作原理,掌握单片机引脚 的使用方法 。 (2) 建立并熟悉开发环境,进行概要设计 。 (3) 编写程序,调试并完善 驱动 。 (4) 撰写文档,整理资料,完成设计工作 。 nts2008 届 毕业设计 (论文 ) 3 第二章 系统分析 2.1 系统的设计目标及实现方案 2.1.1 系统的设计目标 在 KeiluVision2编 程环境 中 使用 Keil C51语言 编辑 PS/2键盘驱动,通过 Flash下载到单片机系统中,使之支持 PS/2 键盘的信息输入。 2.1.2 系统的实现方案 : 1 掌握 PS/2 键盘通信原理、了解 PS/2 键盘协议 。 2 掌握单片机工作原理 。 3 掌握基于单片机的 Keil C51语言及 KeiluVision2编程环境 。 4 勾画 驱动程序 流程图。 5 初步编辑 基于单片机的 PS/2键盘的驱动 。 6 对程序出现的错误进行修改同时 编译,调试系统,验证修改结果并完善系统 。 2.2 系统硬 件平台的分析 2.2.1 AT89C51 简介 AT89C51芯片 如图 1所示: 图 1 AT89C51 芯片 nts2008 届 毕业设计 (论文 ) 4 AT89C51是一种带 4K字节闪烁可编程可擦除 只读存储器 的低电压,高性能CMOS8位微处理器,俗称 单片机 。 AT89C2051 是一种带 2K字节闪烁可编 程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦 100次。该器件采用 ATMEL高密度非易失存储器制造技术制造,与工业标准的 MCS指令集和输出管脚相兼容。由于将多功能 8位 CPU和闪烁存储器组合在单个芯片中, ATMEL的AT89C51是一种高效微控制器, AT89C2051 是它的一种精简版本。 AT89C 单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 主要特性: 1 与 MCS-51 兼容 2 4K字节可编程闪烁存储器 3 寿命: 1000写 /擦循环 4 数据保留时间: 10年 5 全静态工作: 0Hz-24Hz 6 三级程序存储器锁定 7 1288 位内部 RAM 8 32可编程 I/O 线 9 两个 16位定时器 /计数器 10 5个中断源 11 可编程串行通道 12 低功耗的闲置和掉电模式 13 片内振荡器和时钟电路 管脚说明: VCC:供电电压。 GND:接地。 P0口 : P0 口为一个 8位漏级开路双向 I/O口,每脚可吸收 8TTL门电流。当 P1口的管脚第一次写 1时,被定义为高阻输入。 P0能够用于外部程序数据存储器,它可以被定义为数据 /地址的第八位。在 FIASH编程时, P0 口作为原码输入口,当 FIASH 进行校验时, P0输出原码,此时 P0外部必须 被拉高。 P1口 : P1口是一个内部提供上拉电阻的 8位双向 I/O口, P1口缓冲nts2008 届 毕业设计 (论文 ) 5 器能接收输出 4TTL 门电流。 P1口管脚写入 1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在 FLASH编程和校验时, P1 口作为第八位地址接收。 P2口 : P2口为一个内部上拉电阻的 8位双向 I/O口, P2 口缓冲器可接收,输出 4个 TTL 门电流,当 P2口被写 “1” 时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时, P2口的管脚被外部拉低,将输出电流。这是由于 内部上拉的缘故。 P2口当用于外部程序存储器或 16位地址外部数据存储器进行存取时, P2口输出地址的高八位。在给出地址 “1” 时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时, P2口输出其特殊功能寄存器的内容 , P2口在 FLASH 编程和校验时接收高八位地址信号和控制信号。 P3口 : P3 口管脚是 8个带内部上拉电阻的双向 I/O口,可接收输出 4个 TTL门电流。当 P3口写入 “1” 后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平, P3口将输出电流( ILL)这是由于上拉的缘故。 P3口也可作为 AT89C51 的一些特殊功能口 : 口管脚 备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断 0) P3.3 /INT1(外部中断 1) P3.4 T0(记时器 0外部输入) P3.5 T1(记时器 1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制 信号。 在此课题中我们用到了单片机的 P32 口、 P10口、 VCC口和 GND 口来连接键盘的接口线。 6 nts2008 届 毕业设计 (论文 ) 6 2.2.2 键盘构造及工作原理 PS/2 键盘接口简介: PS/2 键盘的接口是一个非常成熟的串行数据传出接口,此键盘接口为从设备属于 mini-DIN 6pin 的连接器 , 共有 六根连接线 , 其中 1 号线为数据线、 2 号线空余 没有 任何功能、 3 号线是接地线、 4 号线为电源线、 5 号线为时钟线、 6号线空余 没有 任何功能。 PS/2 键盘接口及功能 如图 2 所示 : 图 2 PS/2键盘接口 PS/2接口功能介绍 如表 1所示 : 表 1 PS/2接口功能介绍 1 DATA Key Date 2 n/c Not connected 3 GND Gnd 4 VCC Power, +5VDC 5 CLK Clock 6 n/c Not connected 其中主要承担数据传输和键盘响应控 制的是数据线和时钟线 。 PS/2 键盘工作原理 如图 3 所示 : 图 3 PS/2键盘硬件连接图 nts2008 届 毕业设计 (论文 ) 7 PS/2 设备履行一种双向同步串行协议。换句话说,每次数据线上发送一位数据并且每在时钟线上发一个脉冲就被读入。设备可以发送数据到主机,而主机也可以发送数据到设备,但主机总是在总线上有优先权,它可以在任何时候抑制来自设备的通信,只需把时钟线电平拉低即可。 键盘的内部结构主要包括控制电路板、按键、底板和面板等。电路板是整个键盘的控制 核心,位于键盘的内部,主要担任按键扫描识别、编码和传输接口工作 。 它将各个 按 键所表示的数字或字母转换成计算机可以识别的信号,是用户和计算机之间主要的沟通者之一。 键盘主要由键开关矩阵、单片机和译码器三大部分组成。键开关矩阵即键盘按键由一组排列成矩阵方式的按键开关组成,所输入的信号由按键所在的位置决定。单片机即键盘内部采用的 Intel 8048 单片机微处理器,这是一个 40 引脚的芯片,内部集成了 8 位 CPU、 10248 位的 ROM、 648 位的 RAM 以 及 8 位 的定时器 /计数器等。译码器即信号编码转译装置,把键盘的字符信号通过编码翻译转换成相应的二进制码。由于键盘排列成矩阵格式 ,被按键的识别和行列位置扫描码的产生,是由键盘内部的单片机通过译码器来实现的。根据键盘向主机送入的二进制代码类型,可把键盘分为编码键盘和非编码键盘两种。 IBM PC 机的键盘属于非编码键盘,其特点是不直接提供所按键的编码信息,而是用较为简单的硬件和一套专用程序来识别所按键的位置,并提供与所按键相对应的中间 代码,然后再把中间代码转换成要对应的编码。这样,非编码键盘就为系统软件在定义键盘的某些操作功能上提供了更大的灵活性。 计算机键盘通常采用行列扫描法来确定按下键所在的行列位置。所谓行列扫描法是指 , 把 键盘按键排列成 n行 m 列的 n*m行列点阵,把行、列线分别连接到两个 并行接口双向传送的连接线上,点阵上的键一旦被按动,该键所在的行列点阵信号就被认为已接通。按键所排列成的矩阵,需要用硬件或软件的方法轮转顺序地对其行、列分别进行扫描,以查询和确认是否有键按动。如有键按动,键盘就会向主机发送被按键所在的行列点阵的位置编码,称为键扫描码。单片机通过周期性扫描行、列线,读回扫描信号结果,判断是否有键按下,并计算按键nts2008 届 毕业设计 (论文 ) 8 的位置以获得扫描码。键被按下时,单片机分两次将位置扫描码发送到键盘接口:按下一次,叫接通扫描码;按完释 放一次,叫断开扫描码。这样通过硬件或软件的方法对键盘分别进行行、列扫视,就可以确定按下键所在位置,获得并输出扫描位置码,然后转换为 ASCII码,经过键盘 I/O电路送入主机,并由显示器显示出来。 键盘要增加键数是很容易的,任何矩阵键盘通过增加键盘的行或列便可实现增加按键数。如 64 键的键盘排列成 8 行 8 列 的行列点阵, 128 键的键盘排列成 8行 16 列 的行列点阵, 256键的键盘排列成 16行 16 列的行列点阵 。 3 2.2.3 系统的硬件连接 硬件连接中主要连接的是 PS/2 键盘上的数据线( DATA) 、时钟线( CLK)、电源线( +5V)及接地线( GND),其中电源线与接地线直接连接到单片的的电源线和接地线上。在数据线和时钟 线的连接中要注意选好引脚,因为键盘数据线使用双向串行传输方式,所以应选择单片机上的串行输入口 : P1 口(如: P1.0)如果不注意 使用了错误的引脚 就会 导致键盘输入功能的不正常运行。 硬件连接 如 图 4 所示: 图 4 键盘与单片机连线图 2.3 驱动模块 结构分析 该驱动程序 主要由以下 10个函数组成: (1) main 函数 PS/2 键盘 +5V CLK DATA GND AT89C51 +5V P3.2 P1.0 GND nts2008 届 毕业设计 (论文 ) 9 此函数为 主函数,在运行基于 PS/2 键盘驱动后,首先运行此函数,其作用为对变量进行初始化,为波特率发生器设置 19200 波特率、对键盘发送自检命令、 在有信息传送时调用发送数据函数、接收数据函数和中断函数等,由于驱动的各项操作指令都在此函数中进行调用和操作,所以此函数非常重要。 (2) uart 函数 此函数的作用是编写两种中断:接受中断和发送中断,其目的是为接收主机命令或发送键码提出申请 。 (3) keytransmit 函数 定义串口,把缓冲区的键值键值通过串口发送出去 。 (4) order 函数 主机向 键盘发送命令,由于主机发送命令优先级最高,所以可以打断键盘发送数据,直接拉低时钟线,等待键盘响应,发送数据时数据位与“ 0x01”取与再进行发送,期间发送函数循环八次,即可发送完一个数据位。再进行发送校验位的操作,确认发送数据无误时,发送终止位,等待ACK 握手信号,等待时钟线信号拉高,进行下一数据位的发送 。 (5) Readps2 函数 此函数的作用为向主机发送数据,首先向主机发送传输数据请求,同时拉迪时钟线,等待时钟线拉高,确定时钟线拉高,从缓冲区中读取一个键值,发送键值,发送校验位,确定键值发送无误, 进行下一位键盘发送 。 (6) Keyscan 函数 通过调用 Readps2函数,得到一键值,把键值放入缓冲区中等待发送 。 (7) Ex0 函数 获取键值并判断键值类型(通码或断码) 。 nts2008 届 毕业设计 (论文 ) 10 (8) KeyTransmit 函数 扫描键盘获取按键的通码与断码,存储到缓冲区中 。 (9) LedLock 函数 此函数为控制键盘灯的状态, 调用 order 函数进行 控制命令 发送 。 (10) Delay 函数 软件延时,赋予不同的参数,提供不同的延时,作用是为键盘发送及接受数据时,等待时钟 线拉高,提供延时 。 nts2008 届 毕业设计 (论文 ) 11 第三章 驱动 总体设计 3.1 键盘编程资料 简介 3.1.1 数据格式 键盘数据格式见表 2: 表 2 数据格式 1个起始位 总是逻辑 0 8个数据位 ( LSB)低位前 1个奇偶校验位 奇校验位 1个停止位 总是逻辑 1 1个应答位 仅用在主机对从设备的通讯中 表中,如果数据位中 1 的个数为偶数,校验位就为 1;如果数据位中 1 的个数为奇数,校验位就为 0;总之,数据位中 1 的个数加上校验位中 1 的个数总为奇数,因此总进行奇校验。 3.1.2 单片机接受 数据 时序图 如图 5所示 : 图 5 单片机接受数据时序图 PS/2向 单片 机发送一个字节可按照下面的步骤进行 : 1 检测时钟线电平,如果时钟线为低,则延时 50 s。 2 检测判断时钟信号是否为高,为高,则向下执 行,为低,则转到 (1)。 3 检测数 据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时PC机在向 PS/2 设备发送数据,所以 PS/2 设备要转移到接收程序处接收数nts2008 届 毕业设计 (论文 ) 12 据) 。 4 延时 20 (如果此时正在发送起始位,则应延时 40 s) 。 5 输出起始位( 0)到数据线上。这里要注意 的是:在送出每一位后都要检测时钟线,以确保 PC机没有抑制 PS/2设备,如果有则中止发送 。 6 输出 8个数据位到数据线上 。 7 输出校验位 。 8 输出停止位( 1) 。 9 延时 30 s(如果在发送停止位时 释放时钟信号则应延时 50 s。 读数据线的步骤 : 1 准备数据位 2 延时 20 s 3 把时钟线拉低 4 延时 40 s 5 释放时钟线 6 延时 20 s 3.1.3 单片机发送数据 时序图 如图 6所示 : 图 6 单片机 发送数据时序图 单片 机 发送数据步骤: 由于 PS/2 设备能提供串行同步时钟,因此,如果 PC 机发送数据,则 PC 机要先把时钟线和数据线置为请求发送的状态。 PC机通过下拉时钟线大于 100 nts2008 届 毕业设计 (论文 ) 13 来抑制通讯,并且通过下拉数据线发出请求发送数据的信号,然后释放时钟。当PS/2 设备检测到需要接收的数据时,它会产生时钟信号并记录下面 8 个数据位和一个停止位。主机此时在时钟线变为低时准备数据到数据线,并在时钟上升沿锁存数据。而 PS/2 设备则要配合机才能读到准确的数据。 具体连接步骤如下: 1 等待时钟线为高电平。 2 判断数据线是否为低,为高则错误退出,否则继续执行。 3 读地址线上的数据内容,共 8个 bit,每读完一个位,都应检测时钟线是否被 PC机拉低,如果被拉低则要中止接收。 4 读地址线上的校验位内容, 1个 bit。 5 读停止位。 6 如果数据线上为 0(即还是低电平), PS/2 设备继续产生时钟,直到接收到1且产生出错信号为止(因为停止位是 1,如果 PS/2设备没有读到停止位,则表明此次传输出错)。 7 输出应答位。 8 检测 奇偶校验位,如果校验失败,则产生错误信号以表 明此次传输出现错误 延时 45 s,以便 PC机进行下一次传输。 读数据线的步骤 : 1 延时 20 s 2 把时钟线拉低 3 延时 40 s 4 释放时钟线 5 延时 20 s 6 读数据线 通过一下 步骤可用于发出应答位 : nts2008 届 毕业设计 (论文 ) 14 1 延时 15 s 2 把数据线拉低 3 延时 5 s 4 把时钟线拉低 5 延时 40 s 6 释放时钟线 7 延时 5 s 8 释放数据线 3.1.4 键盘返回值介绍 键盘的处理器如果发现有键被按下释放或按住键盘将发送扫描码的信息包到计算机 扫描码有两种不同的类型通码和断码当一个键被按下或按住就发送通码当一个键被释放就发送断码每个按键被分配了唯一的通码和断码这样主机通过查找唯一的扫描码就可以测定是哪个按键每个键一整套的通断码组成了扫描码集有三套标准的扫描码集分别是第一套第二套和第三套所有现代的键盘默认使用第二套扫描码 。 虽然多数第二套通码都只有一个字节宽但也有少数扩展按键的通码是两字节或四字节宽这类的通码第一个字节总是为 E0h。 正如键按下通码就被发往计算机一样只要键一释放断码就会被发送每个键都有它自己唯一的通码它们 也都有唯一的断码幸运的是你不用总是通过查表来找出按键的断码在通码和断码之间存在着必然的联系多数第二套断码有两字节长它们的第一个字节是 F0h 第二个字节是这个键的通码扩展按键的断码通常有三个字节它们前两个字节是 E0h,F0h 最后一个字节是这个按键通码的最后一个字节作为一个例子我在下面列出了几个按键的第二套通码和断码 。 8 表 3 部分第二套通码断码实例 No. KEY 通码 (第二套 ) 断码 (第二套 ) 1 A 1C F0 1C 2 5 2E F0 2E 3 F10 09 F0 09 4 Right Arrow E0 74 E0 F0 74 nts2008 届 毕业设计 (论文 ) 15 5 Right Ctrl E0 14 E0 F0 14 一个键盘发送值的例子 : 通码和断码是以什么样的序列发送到你的计算机从而使得字符 G 出现在你的字处理软件里的呢因为这是一个大写字母需要发生这样的事件次序按下Shift 键按下 G 键释放 G 键释放 Shift 键与这些时间相关的扫描码如下 Shift 键的通码 12hG 键的通码 34hG 键的断码 F0h 34h Shift 键的断码 F0h 12h 因此发送到你的计算机的数据应该是 : 12h 34h F0h 34h F0h 12h 第二套扫描码 : 101 102 和 104 键的键盘 : 表 4 104键盘各按键通码与断码 KEY 通码 断码 KEY 通码 断码 KEY 通码 断码 A 1C F0 1C 9 46 F0 46 54 F0 54 B 32 F0 32 0E F0 0E INSERT E0 70 E0 F0 70 C 21 F0 21 - 4E F0 4E HOME E0 6C E0 F0 6C D 23 F0 23 = 55 F0 55 PG UP E0 7D E0 F0 7D E 24 F0 24 5D F0 5D DELETE E0 71 E0 F0 71 F 2B F0 2B BKSP 66 F0 66 END E0 69 E0 F0 69 G 34 F0 34 SPACE 29 F0 29 PG DN E0 7A E0 F0 7A H 33 F0 33 TAB 0D F0 0D U ARROW E0 75 E0 F0 75 I 43 F0 43 CAPS 58 F0 58 L ARROW E0 6B E0 F0 6B J 3B F0 3B L SHFT 12 F0 12 D ARROW E0 72 E0 F0 72 K 42 F0 42 L CTRL 14 F0 14 R ARROW E0 74 E0 F0 74 L 4B F0 4B L GUI E0 1F E0 F0 1F NUM 77 F0 77 M 3A F0 3A L ALT 11 F0 11 KP / E0 4A E0 F0 4A N 31 F0 31 R SHFT 59 F0 59 KP * 7C F0 7C O 44 F0 44 R CTRL E0 14 E0 F0 14 KP - 7B F0 7B P 4D F0 4D R GUI E0 27 E0 F0 27 KP + 79 F0 79 Q 15 F0 15 R ALT E0 11 E0 F0 11 KP EN E0 5A E0 F0 5A nts2008 届 毕业设计 (论文 ) 16 R 2D F0 2D APPS E0 2F E0 F0 2F KP 71 F0 71 S 1B F0 1B ENTER 5A F0 5A KP 0 70 F0 70 T 2C F0 2C ESC 76 F0 76 KP 1 69 F0 69 U 3C F0 3C F1 05 F0 05 KP 2 72 F0 72 V 2A F0 2A F2 06 F0 06 KP 3 7A F0 7A W 1D F0 1D F3 04 F0 04 KP 4 6B F0 6B X 22 F0 22 F4 0C F0 0C KP 5 73 F0 73 Y 35 F0 35 F5 03 F0 03 KP 6 74 F0 74 Z 1A F0 1A F6 0B F0 0B KP 7 6C F0 6C 0 45 F0 45 F7 83 F0 83 KP 8 75 F0 75 1 16 F0 16 F8 0A F0 0A KP 9 7D F0 7D 2 1E F0 1E F9 01 F0 01 58 F0 58 3 26 F0 26 F10 09 F0 09 ; 4C F0 4C 4 25 F0 25 F11 78 F0 78 52 F0 52 5 2E F0 2E F12 07 F0 07 , 41 F0 41 6 36 F0 36 PRNT SCRN E0 12 E0 7C E0 F0 7C E0 F0 12 . 49 F0 49 7 3D F0 3D SCROLL 7E F0,7E / 4A F0 4A 8 3E F0 3E PAUSE E1 14 77 E1 F0 14 F0 77 -NONE- ACPI 扫描码 : 表 5 ACPI扫描码 KEY 通码 断码 Power E0, 37 E0, F0, 37 Sleep E0, 3F E0, F0, 3F Wake E0, 5E E0, F0, 5E nts2008 届 毕业设计 (论文 ) 17 3.2 Readps2()函数 3.2.1 Readps2()函数 流程 如图 7 所示 : 图 7 Read ps2()函数流程图 3.2.2 Readps2()函数 程序 设计 : unsigned char ReadPS2() unsigned char KeyCode; /键盘键值 unsigned char bitCount; /位数 while(clock); / 等待键盘把时钟第一次拉低 for(bitCount = 8; bitCount != 0; bitCount -) / 把起始位算入 WAITFORKEYBOARDPULSE; / 等待一个有效的下跳沿 KeyCode = 1; / 按照 PS2 格式 ,数据低位在前 clock = 1; DATA = 1; 开始 时钟线是否 拉 高? Y N 计数 i=i+1 时钟线是否 拉 高? N N Y Y 结束 发送数据 判断, i 是否为 8 nts2008 届 毕业设计 (论文 ) 18 if(DATA = 1) KeyCode |= 0x80; / 得到有效的数据位 WAITFORKEYBOARDPULSE; / 等待按键发送效验位 WAITFORKEYBOARDPULSE; / 等待按键发送终止 位 while(!clock); / 等待键盘把时钟线拉高 if(KeyCode = CODE_POST) KeyBoardConnectFlag = 1; return(KeyCode); / 返回按键扫描 nts2008 届 毕业设计 (论文 ) 19 3.3 Order()函数 3.3.1 Order()函数 流程 如图 8 所示 : 图 8 Order() 函数流程图 3.3.2 Order()函数 程序 设计 : void Order(unsigned char orderByte) 开始 下拉时钟至少 100us 下拉数据线 释放数据线 记数 i=i+1; i=0 等待数据线拉高 发送数据位与 0x01取与 发送数据值 1 并 check+ 发送数据值 0 等待数据线拉高 判断 check 奇偶 N 值为 1 值为 0 校验位置 0 校验位置 1 为奇 为偶 等待 ACK 握手信号 结束 N Y Y 判断 i=8? nts2008 届 毕业设计 (论文 ) 20 unsigned char cnt; unsigned char check; /DINT; /关闭总中断 ,发送命令到键盘 clock = 0; DATA = 1; for(cnt = 0xff; cnt != 0; cnt -); / 拉低时钟与数据并延时 DATA = 0; clock = 1; for(cnt = 8; cnt != 0; cnt -) / 发送八位数据,循环八次 while(clock); if(orderByte & 0x01) DATA = 1; / 根据低位设定输出数据 check +; / 如果输出一个 1,效验记录数据加一 else DATA = 0; orderByte = 1; / 命令字调整 while(!clock); / 输出脉冲 while(clock); if(check % 2) / 如果输出过偶数个脉冲 DATA = 0; / 效验数据位置 1 else DATA = 1; / 否则数据位置 0 while(!clock); while(clock); DATA = 1; while(!clock); / 发送终止位 DATA = 1; clock = 1; while(clock) | (DATA); / 等待 ACK 握手信号 while(!clock); /等待 clock 变高 /EINT; /开总中断 nts2008 届 毕业设计 (论文 ) 21 3.4 main()函数 3.4.1 主程序流程 如图 9 所示 : 图 9 main()函数流程图 3.4.2 主程序代码: void main() DINT; /关中断 for(i=0;i1000;i+) ;/延时稳定 /* 初始化变量 */ DATA = 0; clock = 0; /端口设置为高 开始 系统初始化 主机发送命令 ? 键盘发送数据? 扫描键盘 调用 Order() 发送缓冲区中数据 Y N Y 数据存入缓冲区 N nts2008 届 毕业设计 (论文 ) 22 key_sw = 1; /关键盘 for(i=0;i1000;i+) Delay(10); for(i = 0;i16;i+) KeyCodeBuff = 0; KeyCodeSum = 0; KeyFlag = 0; KeyUpFlag = 0; KeyExtendFlag = 0; KeyLedLockFlag = 0; KeyBoardConnectFlag = 0; KeyPauseFlag = 0; KeyMakeCodeFlag = 0; KeyIDLo = 0; KeyIDHi = 0; LedStatus = 0; TMOD = 0x22; /T1 为波特率发生器设置 19200 波特率 /T0 为采样键盘时钟发生器 TL1 = 0xFD; TH1 = 0xFD; / TL0 = / TH0 = PCON |= 0x80; /SMOD 设置为 1 SCON = 0x50; /串口控制寄存器 /工作方式 /非多机通讯方式 /允许接收 / TR1 = 1; /定时器 1 开始 IT0 = 0; /低电平引起中断 ES = 1; /开串口中断 EX0 = 1; /开外部 0 中断 key_sw = 0; /开键盘电源 clock = 1; DATA = 1; Delay(1); while(!KeyBoardConnectFlag) ReadPS2();/等待键盘自检成功 nts2008 届 毕业设计 (论文 ) 23 Order(COMMAND_RESET); /复位键盘 ReadPS2(); /等待键盘应答 Delay(5); Order(COMMAND_SETSTATUS);/设置状态灯 CapsLock,NumLock,ScrollLock ReadPS2(); /等待键盘应答 LedStatus = DISALL; Order(LedStatus); /关闭所有灯 ReadPS2(); /等待键盘应答 /* Order(COMMAND_READID); /读键盘 ID ReadPS2(); /等待键盘应答 KeyIDLo = ReadPS2(); /获得键盘 ID 低字节 KeyIDHi = ReadPS2(); /获得键盘 ID 高字节 */ LedStatus = NUMLOCK_EN; /开 NumLock 灯 Order(COMMAND_SETSTATUS); ReadPS2(); /等待应答 Order(LedStatus); / ReadPS2(); /等待应答 Order(COMMAND_SETRATE); /设置速率延时 ReadPS2(); /等待应答 Order(0x20); /500ms/30 ReadPS2();/等待应答 Order(COMMAND_ENABLE); /使能键盘 ReadPS2();/等待应答 Order(COMMAND_SETRATE); /设置速率延时 ReadPS2();/等待应答 Order(0x20); / ReadPS2();/等待应答 Delay(200); /延时 EINT; /开总中断 for(;) /KeyScan();/扫描键盘 if(KeyFlag = 1) KeyFlag = 0; KeyTransmit();/ nts2008 届 毕业设计 (论文 ) 24 3.5 键盘扫描码转换程序设计 由于键盘扫描码无规律可循 ,因此由键盘扫描码获得相应按键的键值 (字符键为 ASCII 值 ,控制键如 F1,Ctrl 等为自定义值 ), 只能通过查表的方式获得 。 由于按键的 3 种类型及部分按键对应着两个键值 (如 A 键的键值根据 Caps 和 Shift 键状态有 0x41(A)和 0x61(a)两种 ),因此综合考虑查表转换速度和资源消耗 ,设计中使用 4 个键盘表 : 键盘扫描码转换基本集和切换集 (kb_plain_mapNR_KEYS与kb_shift_mapNR_KEYS); 包含 E0 前缀的键盘扫描码转换基本集和切换集(kbeO_plain_mapNR_KEYS与 kbe0_shiftmapNR_KEYS)。 PS/2 104 键盘按键扫描码最大值为 0x83,所以设置 NR_KEYS 为 132。 所有 4 个键盘表的定义均为如下形式 :KB_MAPMAKE CODE=KEYVAL,如果扫描码对应的按键为空 (如KB_MAP0x00),则定义相应键值为 NULL_KEY(0x00)。 以下是键盘扫描码基本集的部分代码实例 : 特殊按键 Pause 使用单独程序处理 ,如果接收到 0xE1 就转入这段程序 。 而Print Screen 键则将其看作是两个通码分别为 0xE0 0x12 和 0xE0 0x7C 的 “虚键 ”的组合键处理 。 在驱动程序中 设定如下全局变量 : led_status 记 Scroll Lock Led,Num Lock Led 和 Caps Lock Led 的状态 (关为 0,开为 1); agcs_status 记录左右Shift Ctrl Gui Alt 状态 ,相应键按下则对应位为 1,释放为 0.E0_FLAG 接到 0xE0 置1; E1_FLAG 接收到 0xE1 置 1。 F0_FLAG 接收到 0xF0 置 1, 按键键值通过 KeyVal提供上层程序使用 。 3.5.1 扫描码键值转换流程 如图 10 所示: revchar_flag=1? revchar_flag=1? N Pause 按键扫描码键值转换处理程序 Y Y EO_FLAG=1?=1 第二类案件扫描码键值转换处理程序 muc_revchar =E0? muc_revchar =E1? muc_revchar =F0? E0_FLAG=1 E1_FLAG=1 F0_FLAG=1 扫描码键值转换处理程序结束 第一类案件扫描码键值转换处理程序 扫描码键值转换处理程序开始 N N Y Y Y nts2008 届 毕业设计 (论文 ) 25 图 10 扫描码键值转换流程图 3.5.2 第 1 类按键键值转换: if(F0_FLAG)/接收扫描码为断码 switch(mcu_revchar)/处理控制键 case 0x11:ages_status&=0xF7;break;/左 alt 释放 case 0x12:ages_status&=0xFE;break;/左 shift 释放 case 0x14:agcs_status&=0xFD;break;/左 ctrl 释放 case 0x58;if(led_status&0x04) led_status &= 0x03; /caps lock else led_status |=0x04; ps2_ledchange(); break; case 0x59: agcs_status &= 0xEF;break;/右 shift 释放 case 0x77: if(led_status&0x02)led_status&=0x05;/num lock else led_status |=0x02; ps2_ledchange(); break; case 0x7E:if(led_status&0x01) led_status&=0x06;/scroll lock else led_status |=0x01; ps2_ledchange(); break; default;break; F0_FLAG=0; else/接收扫描码为通码 if(led_status&0x04) caps_flag=1;else caps_flag = 0; if(led_status&0x02) num_flag =1;else num_flag =0; if(agcs_status&0x11) shift_flag = 1;else shift_flag=0; /扫描码键值转换 nts2008 届 毕业设计 (论文 ) 26 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
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。