收藏 分享(赏)

5正文(封装).doc

上传人:mcady 文档编号:9293740 上传时间:2019-08-01 格式:DOC 页数:29 大小:331KB
下载 相关 举报
5正文(封装).doc_第1页
第1页 / 共29页
5正文(封装).doc_第2页
第2页 / 共29页
5正文(封装).doc_第3页
第3页 / 共29页
5正文(封装).doc_第4页
第4页 / 共29页
5正文(封装).doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

1、2008 届 毕业设计( 论文)1第一章 绪 论1.1 选题的依据及意义在工业化社会突飞猛进的今天,人力作业逐渐被全自动工业机械所取代,在现代化的工厂中往往一个工作人员坐在布满按键的控制车间里操纵一条生产线。这些发布指令的键盘大多是专为特定机型单独设计制作,虽然这样有较好的针对性,但是此类系统中的专用键盘在使用中暴露出这样那样不少致命的缺陷,例如:单独设计制作、通用性差、成本高、使用硬件连接线多、可靠性不高、替换时费时且麻烦等,这一状况在那些要求键盘按键较多且需自定义键盘按键的应用系统中更为突出。设计一种通用型强、价格低廉、可靠性高的键盘来取代这些专用键盘,是一种非常好的选择。PC 机上使用的

2、 PS/2 标准键盘包含了输入信息的绝大部分,而且部分按键还可以自定义,这样的配置可以满足大部分系统的输入请求。本项目是编辑一个基于单片机的 PS/2 键盘的驱动,主要内容是使得 PS/2键盘能在单片机系统中顺利使用。若能顺利完成,达到预期的目的,将大大改善当前单片机系统中键盘的诸多问题,所以本课题具有很强的实际意义和研究价值。1.2 本课题的可行性分析PS/2 键盘是各个电脑公司为其台式 PC 机设计制造的具有各个特色的信息输入设备,尤其以 IBM 公司的 PS/2 键盘为代表。在键盘内部采用的是Intel8048 单片机微处理器,这是一个 40 引脚的芯片,内部集成了 8 位CPU、102

3、48 位的 ROM、648 位的 RAM 以及 8 位的定时器计数器等。译码器即信号编码转译装置,把键盘的字符信号通过编码翻译转换成相应的二进制码。其支持多种操作系统,同时也支持多种编辑语言编写的驱动程序。再则,单片机系统中提供 Keil C51 语言以及 KeiluVision2 编程环境,通过这个工具可以方便的根据不同的硬件,制定基于单片机要求的 PS/2 键盘驱动。所以,该系统在硬件和开发环境上都得到了满足,它是可行的。1.3 本课题的应用前景随着社会工业化进程的加快,机械自动化生产越来越体现出其精确、快速、不受工作时间地点限制的优越性。在自动生产中发挥核心作用是以单片机为核心的系统,此

4、类单片机系统中主要以键盘按键较多的应用系统为主。然而此类2008 届 毕业设计( 论文)2系统中的专用键盘在使用中暴露出这样那样不少致命的缺陷,例如:单独设计制作、通用性差、成本高、使用硬件连接线多、可靠性不高、替换时费时且麻烦等,这一状况在那些要求键盘按键较多且需自定义键盘按键的应用系统中更为突出。与此寻找价格低、通用可靠、维修替换方便的通用键盘显得尤为重要。在 PC 系统中广泛使用 PS/2 键盘具有价格低、通用可靠,且使用连接线少(仅使用 2 根信号线),并可满足多种系统要求等的特点。因此在单片机系统中用 PS/2键盘代替专用键盘是一种很好的选择。在 PS/2 键盘普及的今天其使用者越来

5、越多,技术越来越成熟,使用 PS/2键盘代替单片机系统的专用键盘有着非常明显的优势:(1) 无需为每个单片机系统,单独设计键盘(2) 成本低,使用简单(3) 通用性强、替换方便1.4 本课题研究目标与内容本系统的开发使用 Keil C51 语言以及 KeiluVision2 编程环境,对基于单片机的 PS/2 键盘的驱动进行编写。研究目标:掌握 PS/2 键盘协议、掌握单片机的引脚使用方法、掌握 Keil C51 语言以及 KeiluVision2 编程环境、编写适用于单片机系统的 PS/2 键盘驱动程序,调试驱动程序实现 PS/2 键盘在单片机系统中的使用。本课题的主要内容是编写驱动程序、设

6、计键盘与单片机的引脚连接方式,使 PS/2 键盘在单片机系统中顺利的使用。1.5 本课题研究方案本课题的研究开发过程大致分为以下几个步骤:(1) 查阅资料,掌握 PS/2 键盘协议,PS/2 键盘的物理结构及工作原理,掌握单片机引脚的使用方法。 (2) 建立并熟悉开发环境,进行概要设计。 (3) 编写程序,调试并完善驱动。 (4) 撰写文档,整理资料,完成设计工作。2008 届 毕业设计( 论文)3第二章 系统分析2.1 系统的设计目标及实现方案2.1.1 系统的设计目标在 KeiluVision2 编程环境中使用 Keil C51 语言编辑 PS/2 键盘驱动,通过Flash 下载到单片机系

7、统中,使之支持 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 芯片2008 届 毕业设计( 论文)4AT89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器

8、的低电压,高性能 CMOS8 位微处理器,俗称单片机。AT89C2051 是一种带 2K 字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦 100 次。该器件采用 ATMEL 高密度非易失存储器制造技术制造,与工业标准的 MCS 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中,ATMEL 的 AT89C51 是一种高效微控制器,AT89C2051 是它的一种精简版本。AT89C 单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。主要特性:1 与 MCS-51 兼容 2 4K 字节可编程闪烁存储器 3 寿命:1000 写/擦循

9、环4 数据保留时间:10 年5 全静态工作:0Hz-24Hz6 三级程序存储器锁定7 1288 位内部 RAM8 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

10、输出原码,此时 P0 外部必须被拉高。P1 口:P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口,P1 口缓冲器2008 届 毕业设计( 论文)5能接收输出 4TTL 门电流。P1 口管脚写入 1 后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1 口作为第八位地址接收。 P2 口:P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 口缓冲器可接收,输出 4 个 TTL 门电流,当 P2 口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这

11、是由于内部上拉的缘故。P2 口当用于外部程序存储器或 16 位地址外部数据存储器进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的内容,P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。P3 口:P3 口管脚是 8 个带内部上拉电阻的双向 I/O 口,可接收输出 4 个TTL 门电流。当 P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘故。P3 口也可作为 AT89C51 的一些特殊功能口:口管脚

12、备选功能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 口来连接键盘的接口线。 62008 届 毕业设计( 论文)62.2.2 键盘构造及工作原理PS/2 键盘接口简介:PS/2 键盘的接口是一个非常成熟的串行数据传出接口,此键盘接口

13、为从设备属于 mini-DIN 6pin 的连接器,共有六根连接线,其中 1 号线为数据线、2号线空余没有任何功能、3 号线是接地线、4 号线为电源线、5 号线为时钟线、6 号线空余没有任何功能。PS/2 键盘接口及功能如图 2 所示:图 2 PS/2 键盘接口PS/2 接口功能介绍如表 1 所示:表 1 PS/2 接口功能介绍1 DATA Key Date2 n/c Not connected3 GND Gnd4 VCC Power, +5VDC5 CLK Clock6 n/c Not connected其中主要承担数据传输和键盘响应控制的是数据线和时钟线。PS/2 键盘工作原理如图 3 所

14、示:图 3 PS/2 键盘硬件连接图2008 届 毕业设计( 论文)7PS/2 设备履行一种双向同步串行协议。换句话说,每次数据线上发送一位数据并且每在时钟线上发一个脉冲就被读入。设备可以发送数据到主机,而主机也可以发送数据到设备,但主机总是在总线上有优先权,它可以在任何时候抑制来自设备的通信,只需把时钟线电平拉低即可。键盘的内部结构主要包括控制电路板、按键、底板和面板等。电路板是整个键盘的控制核心,位于键盘的内部,主要担任按键扫描识别、编码和传输接口工作。它将各个按键所表示的数字或字母转换成计算机可以识别的信号,是用户和计算机之间主要的沟通者之一。键盘主要由键开关矩阵、单片机和译码器三大部分

15、组成。键开关矩阵即键盘按键由一组排列成矩阵方式的按键开关组成,所输入的信号由按键所在的位置决定。单片机即键盘内部采用的 Intel 8048 单片机微处理器,这是一个 40引脚的芯片,内部集成了 8 位 CPU、10248 位的 ROM、648 位的 RAM 以 及 8位的定时器/计数器等。译码器即信号编码转译装置,把键盘的字符信号通过编码翻译转换成相应的二进制码。由于键盘排列成矩阵格式,被按键的识别和行列位置扫描码的产生,是由键盘内部的单片机通过译码器来实现的。根据键盘向主机送入的二进制代码类型,可把键盘分为编码键盘和非编码键盘两种。IBM PC 机的键盘属于非编码键盘,其特点是不直接提供所

16、按键的编码信息,而是用较为简单的硬件和一套专用程序来识别所按键的位置,并提供与所按键相对应的中间 代码,然后再把中间代码转换成要对应的编码。这样,非编码键盘就为系统软件在定义键盘的某些操作功能上提供了更大的灵活性。计算机键盘通常采用行列扫描法来确定按下键所在的行列位置。所谓行列扫描法是指,把键盘按键排列成 n 行m 列的 n*m 行列点阵,把行、列线分别连接到两个 并行接口双向传送的连接线上,点阵上的键一旦被按动,该键所在的行列点阵信号就被认为已接通。按键所排列成的矩阵,需要用硬件或软件的方法轮转顺序地对其行、列分别进行扫描,以查询和确认是否有键按动。如有键按动,键盘就会向主机发送被按键所在的

17、行列点阵的位置编码,称为键扫描码。单片机通过周期性扫描行、列线,读回扫描信号结果,判断是否有键按下,2008 届 毕业设计( 论文)8并计算按键的位置以获得扫描码。键被按下时,单片机分两次将位置扫描码发送到键盘接口:按下一次,叫接通扫描码;按完释放一次,叫断开扫描码。这样通过硬件或软件的方法对键盘分别进行行、列扫视,就可以确定按下键所在位置,获得并输出扫描位置码,然后转换为 ASCII 码,经过键盘 I/O 电路送入主机,并由显示器显示出来。键盘要增加键数是很容易的,任何矩阵键盘通过增加键盘的行或列便可实现增加按键数。如 64 键的键盘排列成 8 行8 列的行列点阵,128 键的键盘排列成 8

18、 行16 列的行列点阵,256 键的键盘排列成 16 行16 列的行列点阵。 32.2.3 系统的硬件连接硬件连接中主要连接的是 PS/2 键盘上的数据线(DATA) 、时钟线(CLK) 、电源线(+5V)及接地线( GND) ,其中电源线与接地线直接连接到单片的的电源线和接地线上。在数据线和时钟线的连接中要注意选好引脚,因为键盘数据线使用双向串行传输方式,所以应选择单片机上的串行输入口:P1 口(如:P1.0)如果不注意使用了错误的引脚就会导致键盘输入功能的不正常运行。硬件连接如图 4 所示:PS/2 键盘+5VCLKDATAGNDAT89C51+5VP3.2P1.0GND图 4 键盘与单片

19、机连线图2.3 驱动模块结构分析该驱动程序主要由以下 10 个函数组成:(1) main 函数此函数为主函数,在运行基于 PS/2 键盘驱动后,首先运行此函数,2008 届 毕业设计( 论文)9其作用为对变量进行初始化,为波特率发生器设置 19200 波特率、对键盘发送自检命令、在有信息传送时调用发送数据函数、接收数据函数和中断函数等,由于驱动的各项操作指令都在此函数中进行调用和操作,所以此函数非常重要。(2) uart 函数此函数的作用是编写两种中断:接受中断和发送中断,其目的是为接收主机命令或发送键码提出申请。(3) keytransmit 函数定义串口,把缓冲区的键值键值通过串口发送出去

20、。(4) order 函数主机向键盘发送命令,由于主机发送命令优先级最高,所以可以打断键盘发送数据,直接拉低时钟线,等待键盘响应,发送数据时数据位与“0x01”取与再进行发送,期间发送函数循环八次,即可发送完一个数据位。再进行发送校验位的操作,确认发送数据无误时,发送终止位,等待ACK 握手信号,等待时钟线信号拉高,进行下一数据位的发送。(5) Readps2 函数此函数的作用为向主机发送数据,首先向主机发送传输数据请求,同时拉迪时钟线,等待时钟线拉高,确定时钟线拉高,从缓冲区中读取一个键值,发送键值,发送校验位,确定键值发送无误,进行下一位键盘发送。(6) Keyscan 函数通过调用 Re

21、adps2 函数,得到一键值,把键值放入缓冲区中等待发送。2008 届 毕业设计( 论文)10(7) Ex0 函数获取键值并判断键值类型(通码或断码) 。(8) KeyTransmit 函数扫描键盘获取按键的通码与断码,存储到缓冲区中。(9) LedLock 函数此函数为控制键盘灯的状态,调用 order 函数进行控制命令发送。(10) Delay 函数软件延时,赋予不同的参数,提供不同的延时,作用是为键盘发送及接受数据时,等待时钟线拉高,提供延时。2008 届 毕业设计( 论文)11第三章 驱动总体设计3.1 键盘编程资料简介3.1.1 数据格式键盘数据格式见表 2:表 2 数据格式1 个起

22、始位 总是逻辑 08 个数据位 (LSB)低位前1 个奇偶校验位 奇校验位1 个停止位 总是逻辑 11 个应答位 仅用在主机对从设备的通讯中表中,如果数据位中 1 的个数为偶数,校验位就为 1;如果数据位中 1 的个数为奇数,校验位就为 0;总之,数据位中 1 的个数加上校验位中 1 的个数总为奇数,因此总进行奇校验。3.1.2 单片机接受数据时序图如图 5 所示:图 5 单片机接受数据时序图PS/2 向单片机发送一个字节可按照下面的步骤进行:2008 届 毕业设计( 论文)121 检测时钟线电平,如果时钟线为低,则延时 50s。2 检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1

23、)。3 检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时 PC 机在向 PS/2 设备发送数据,所以 PS/2 设备要转移到接收程序处接收数据) 。4 延时 20(如果此时正在发送起始位,则应延时 40s) 。5 输出起始位(0)到数据线上。这里要注意的是:在送出每一位后都要检测时钟线,以确保 PC 机没有抑制 PS/2 设备,如果有则中止发送。6 输出 8 个数据位到数据线上。7 输出校验位。8 输出停止位(1) 。9 延时 30s(如果在发送停止位时释放时钟信号则应延时 50s。读数据线的步骤:1 准备数据位2 延时 20s3 把时钟线拉低4 延时 40s5 释放时钟线6

24、 延时 20s3.1.3 单片机发送数据时序图如图 6 所示:图 6 单片机发送数据时序图2008 届 毕业设计( 论文)13单片机发送数据步骤:由于 PS/2 设备能提供串行同步时钟,因此,如果 PC 机发送数据,则 PC 机要先把时钟线和数据线置为请求发送的状态。PC 机通过下拉时钟线大于100来抑制通讯,并且通过下拉数据线发出请求发送数据的信号,然后释放时钟。当 PS/2 设备检测到需要接收的数据时,它会产生时钟信号并记录下面 8个数据位和一个停止位。主机此时在时钟线变为低时准备数据到数据线,并在时钟上升沿锁存数据。而 PS/2 设备则要配合机才能读到准确的数据。具体连接步骤如下:1 等

25、待时钟线为高电平。2 判断数据线是否为低,为高则错误退出,否则继续执行。3 读地址线上的数据内容,共 8 个 bit,每读完一个位,都应检测时钟线是否被 PC 机拉低,如果被拉低则要中止接收。4 读地址线上的校验位内容,1 个 bit。5 读停止位。6 如果数据线上为 0(即还是低电平) ,PS/2 设备继续产生时钟,直到接收到1 且产生出错信号为止(因为停止位是 1,如果 PS/2 设备没有读到停止位,则表明此次传输出错) 。 7 输出应答位。8 检测奇偶校验位,如果校验失败,则产生错误信号以表明此次传输出现错误延时 45s,以便 PC 机进行下一次传输。读数据线的步骤:1 延时 20s2

26、把时钟线拉低3 延时 40s4 释放时钟线2008 届 毕业设计( 论文)145 延时 20s6 读数据线通过一下步骤可用于发出应答位:1 延时 15s2 把数据线拉低3 延时 5s4 把时钟线拉低5 延时 40s6 释放时钟线7 延时 5s8 释放数据线3.1.4 键盘返回值介绍键盘的处理器如果发现有键被按下释放或按住键盘将发送扫描码的信息包到计算机扫描码有两种不同的类型通码和断码当一个键被按下或按住就发送通码当一个键被释放就发送断码每个按键被分配了唯一的通码和断码这样主机通过查找唯一的扫描码就可以测定是哪个按键每个键一整套的通断码组成了扫描码集有三套标准的扫描码集分别是第一套第二套和第三套

27、所有现代的键盘默认使用第二套扫描码。虽然多数第二套通码都只有一个字节宽但也有少数扩展按键的通码是两字节或四字节宽这类的通码第一个字节总是为 E0h。正如键按下通码就被发往计算机一样只要键一释放断码就会被发送每个键都有它自己唯一的通码它们也都有唯一的断码幸运的是你不用总是通过查表来找出按键的断码在通码和断码之间存在着必然的联系多数第二套断码有两字节长它们的第一个字节是 F0h 第二个字节是这个键的通码扩展按键的断码通常有三个字节它们前两个字节是 E0h,F0h 最后一个字节是这个按键通码的最后一个字节作为一个例子我在下面列出了几个按键的第二套通码和断码。 8表 3 部分第二套通码断码实例2008

28、 届 毕业设计( 论文)15No. KEY 通码(第二套) 断码(第二套)1 “A“ 1C F0 1C2 “5“ 2E F0 2E3 “F10“ 09 F0 094 Right Arrow E0 74 E0 F0 745 Right “Ctrl“ E0 14 E0 F0 14一个键盘发送值的例子:通码和断码是以什么样的序列发送到你的计算机从而使得字符 G 出现在你的字处理软件里的呢因为这是一个大写字母需要发生这样的事件次序按下Shift 键按下 G 键释放 G 键释放 Shift 键与这些时间相关的扫描码如下 Shift 键的通码 12hG 键的通码 34hG 键的断码 F0h 34h Shi

29、ft 键的断码 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 54B 32 F0 32 0E F0 0E INSERT E0 70 E0 F0 70C 21 F0 21 - 4E F0 4E HOME E0 6C E0 F0 6CD 23 F0 23 = 55 F0 55 PG UP E0 7D E0 F0 7DE 24 F0 24 5D F0

30、5D DELETE E0 71 E0 F0 71F 2B F0 2B BKSP 66 F0 66 END E0 69 E0 F0 69G 34 F0 34 SPACE 29 F0 29 PG DN E0 7A E0 F0 7AH 33 F0 33 TAB 0D F0 0D U ARROW E0 75 E0 F0 75I 43 F0 43 CAPS 58 F0 58 L ARROW E0 6B E0 F0 6BJ 3B F0 3B L SHFT 12 F0 12 D ARROW E0 72 E0 F0 72K 42 F0 42 L CTRL 14 F0 14 R ARROW E0 74 E0 F

31、0 74L 4B F0 4B L GUI E0 1F E0 F0 1F NUM 77 F0 77M 3A F0 3A L ALT 11 F0 11 KP / E0 4A E0 F0 4A2008 届 毕业设计( 论文)16N 31 F0 31 R SHFT 59 F0 59 KP * 7C F0 7CO 44 F0 44 R CTRL E0 14 E0 F0 14 KP - 7B F0 7BP 4D F0 4D R GUI E0 27 E0 F0 27 KP + 79 F0 79Q 15 F0 15 R ALT E0 11 E0 F0 11 KP EN E0 5A E0 F0 5AR 2D F

32、0 2D APPS E0 2F E0 F0 2F KP 71 F0 71S 1B F0 1B ENTER 5A F0 5A KP 0 70 F0 70T 2C F0 2C ESC 76 F0 76 KP 1 69 F0 69U 3C F0 3C F1 05 F0 05 KP 2 72 F0 72V 2A F0 2A F2 06 F0 06 KP 3 7A F0 7AW 1D F0 1D F3 04 F0 04 KP 4 6B F0 6BX 22 F0 22 F4 0C F0 0C KP 5 73 F0 73Y 35 F0 35 F5 03 F0 03 KP 6 74 F0 74Z 1A F0

33、1A F6 0B F0 0B KP 7 6C F0 6C0 45 F0 45 F7 83 F0 83 KP 8 75 F0 751 16 F0 16 F8 0A F0 0A KP 9 7D F0 7D2 1E F0 1E F9 01 F0 01 58 F0 583 26 F0 26 F10 09 F0 09 ; 4C F0 4C4 25 F0 25 F11 78 F0 78 52 F0 525 2E F0 2E F12 07 F0 07 , 41 F0 416 36 F0 36 PRNTSCRN E0 12E0 7CE0 F07C E0F0 12. 49 F0 497 3D F0 3D SCR

34、OLL 7E F0,7E / 4A F0 4A8 3E F0 3E PAUSEE1 14 77E1 F0 14F0 77-NONE-ACPI 扫描码:表 5 ACPI 扫描码KEY 通码 断码Power E0, 37 E0, F0, 37Sleep E0, 3F E0, F0, 3FWake E0, 5E E0, F0, 5E2008 届 毕业设计( 论文)173.2 Readps2()函数3.2.1 Readps2()函数流程如图 7 所示:开始时钟线是否拉高?Y N计数 i=i+1时钟线是否拉高?NNYY结束发送数据判断,i 是否为 8图 7 Read ps2()函数流程图3.2.2 Re

35、adps2()函数程序设计:unsigned char ReadPS2()unsigned char KeyCode; /键盘键值unsigned char bitCount; /位数while(clock); / 等待键盘把时钟第一次拉低for(bitCount = 8; bitCount != 0; bitCount -) / 把起始位算入WAITFORKEYBOARDPULSE; / 等待一个有效的下跳沿2008 届 毕业设计( 论文)18KeyCode = 1; / 按照 PS2 格式,数据低位在前clock = 1;DATA = 1;if(DATA = 1)KeyCode |= 0x

36、80; / 得到有效的数据位WAITFORKEYBOARDPULSE; / 等待按键发送效验位WAITFORKEYBOARDPULSE; / 等待按键发送终止位while(!clock); / 等待键盘把时钟线拉高if(KeyCode = CODE_POST)KeyBoardConnectFlag = 1;return(KeyCode); / 返回按键扫描2008 届 毕业设计( 论文)193.3 Order()函数3.3.1 Order()函数流程如 图 8 所示:开始下拉时钟至少 100us下拉数据线释放数据线记数 i=i+1;i=0等待数据线拉高发送数据位与 0x01 取与发送数据值 1

37、 并 check+ 发送数据值 0等待数据线拉高判断 check 奇偶N值为 1 值为 0校验位置 0 校验位置 1为奇 为偶等待 ACK 握手信号结束NYY判断i=8?图 8 Order() 函数流程图2008 届 毕业设计( 论文)203.3.2 Order()函数程序 设计:void Order(unsigned char orderByte)unsigned char cnt;unsigned char check;/DINT; /关闭总中断,发送命令到键盘clock = 0;DATA = 1;for(cnt = 0xff; cnt != 0; cnt -); / 拉低时钟与数据并延时

38、DATA = 0;clock = 1;for(cnt = 8; cnt != 0; cnt -) / 发送八位数据,循环八次while(clock);if(orderByte / 根据低位设定输出数据check +; / 如果输出一个 1,效验记录数据加一elseDATA = 0;orderByte = 1; / 命令字调整while(!clock); / 输出脉冲while(clock);if(check % 2) / 如果输出过偶数个脉冲DATA = 0; / 效验数据位置 1elseDATA = 1; / 否则数据位置 0while(!clock);while(clock);DATA =

39、 1;while(!clock); / 发送终止位DATA = 1;clock = 1;2008 届 毕业设计( 论文)21while(clock) | (DATA); / 等待 ACK 握手信号while(!clock); /等待 clock 变高/EINT; /开总中断3.4 main()函数3.4.1 主程序流程如图 9 所示:开始系统初始化主机发送命令?键盘发送数据?扫描键盘调用 Order()发送缓冲区中数据YNY数据存入缓冲区N图 9 main()函数流程图3.4.2 主程序代码:void main()DINT; /关中断for(i=0;i1000;i+);/延时稳定2008 届

40、毕业设计( 论文)22/* 初始化变量 */DATA = 0;clock = 0; /端口设置为高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 =

41、0;TMOD = 0x22; /T1 为波特率发生器设置 19200 波特率/T0 为采样键盘时钟发生器TL1 = 0xFD;TH1 = 0xFD;/ TL0 =/ TH0 =PCON |= 0x80; /SMOD 设置为 1SCON = 0x50; /串口控制寄存器/工作方式/非多机通讯方式/允许接收/TR1 = 1; /定时器 1 开始IT0 = 0; /低电平引起中断ES = 1; /开串口中断EX0 = 1; /开外部 0 中断key_sw = 0; /开键盘电源clock = 1;DATA = 1;2008 届 毕业设计( 论文)23Delay(1);while(!KeyBoardC

42、onnectFlag)ReadPS2();/等待键盘自检成功Order(COMMAND_RESET); /复位键盘ReadPS2(); /等待键盘应答Delay(5);Order(COMMAND_SETSTATUS);/设置状态灯 CapsLock,NumLock,ScrollLockReadPS2(); /等待键盘应答LedStatus = DISALL;Order(LedStatus); /关闭所有灯ReadPS2(); /等待键盘应答/*Order(COMMAND_READID); /读键盘 IDReadPS2(); /等待键盘应答KeyIDLo = ReadPS2(); /获得键盘 I

43、D 低字节KeyIDHi = ReadPS2(); /获得键盘 ID 高字节*/LedStatus = NUMLOCK_EN; /开 NumLock 灯Order(COMMAND_SETSTATUS); ReadPS2(); /等待应答Order(LedStatus); /ReadPS2(); /等待应答Order(COMMAND_SETRATE); /设置速率延时ReadPS2(); /等待应答Order(0x20); /500ms/30ReadPS2();/等待应答Order(COMMAND_ENABLE); /使能键盘ReadPS2();/等待应答Order(COMMAND_SETRAT

44、E); /设置速率延时ReadPS2();/等待应答Order(0x20); /ReadPS2();/等待应答Delay(200); /延时EINT; /开总中断for(;)/KeyScan();/扫描键盘if(KeyFlag = 1)KeyFlag = 0;2008 届 毕业设计( 论文)24KeyTransmit();/3.5 键盘扫描码转换程序设计由于键盘扫描码无规律可循,因此由键盘扫描码获得相应按键的键值(字符键为 ASCII 值,控制键如 F1,Ctrl 等为自定义值),只能通过查表的方式获得。由于按键的 3 种类型及部分按键对应着两个键值(如 A 键的键值根据 Caps 和 Shi

45、ft键状态有 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),则定

46、义相应键值为 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 接到

47、0xE0 置 1;E1_FLAG 接收到 0xE1 置 1。F0_FLAG 接收到 0xF0 置 1,按键键值通过 KeyVal 提供上层程序使用。3.5.1 扫描码键值转换流程如图 10 所示:2008 届 毕业设计( 论文)25revchar_flag=1?revchar_flag=1?NPause 按键扫描码键值转换处理程序YYEO_FLAG=1?=1第二类案件扫描码键值转换处理程序muc_revchar =E0?muc_revchar =E1?muc_revchar =F0?E0_FLAG=1E1_FLAG=1F0_FLAG=1扫描码键值转换处理程序结束第一类案件扫描码键值转换处理程序

48、扫描码键值转换处理程序开始N NYYY图 10 扫描码键值转换流程图3.5.2 第 1 类按键键值转换:if(F0_FLAG)/接收扫描码为断码switch(mcu_revchar)/处理控制键case 0x11:ages_statusbreak;/左 alt 释放case 0x12:ages_statusbreak;/左 shift 释放case 0x14:agcs_statusbreak;/左 ctrl 释放case 0x58;if(led_status /caps lockelse led_status |=0x04;ps2_ledchange();break;case 0x59: agcs_status break;/右 shift 释放case 0x77: if(led_status/num lockelse led_status |=0x02;ps2_ledchange();break;case 0x7E:if(led_status/scroll lockelse led_status |=0x01;ps2_ledchange();break;default;break;2008 届 毕业设计( 论文)26

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报