5正文(封装).doc

基于单片机的PS2键盘的驱动设计

收藏

压缩包内文档预览:(预览前20页/共29页)
预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图
编号:512607    类型:共享资源    大小:146.16KB    格式:RAR    上传时间:2015-11-11 上传人:QQ28****1120 IP属地:辽宁
6
积分
关 键 词:
毕业设计
资源描述:
基于单片机的PS2键盘的驱动设计,毕业设计
内容简介:
2008届 毕业设计(论文)第一章 绪 论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本课题的应用前景随着社会工业化进程的加快,机械自动化生产越来越体现出其精确、快速、不受工作时间地点限制的优越性。在自动生产中发挥核心作用是以单片机为核心的系统,此类单片机系统中主要以键盘按键较多的应用系统为主。然而此类系统中的专用键盘在使用中暴露出这样那样不少致命的缺陷,例如:单独设计制作、通用性差、成本高、使用硬件连接线多、可靠性不高、替换时费时且麻烦等,这一状况在那些要求键盘按键较多且需自定义键盘按键的应用系统中更为突出。与此寻找价格低、通用可靠、维修替换方便的通用键盘显得尤为重要。在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) 撰写文档,整理资料,完成设计工作。第二章 系统分析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芯片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-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输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出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口来连接键盘的接口线。62.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接口功能介绍1DATAKey Date2n/cNot connected3GNDGnd4VCCPower, +5VDC5CLKClock6n/cNot connected其中主要承担数据传输和键盘响应控制的是数据线和时钟线。PS/2键盘工作原理如图3所示:图3 PS/2键盘硬件连接图 PS/2设备履行一种双向同步串行协议。换句话说,每次数据线上发送一位数据并且每在时钟线上发一个脉冲就被读入。设备可以发送数据到主机,而主机也可以发送数据到设备,但主机总是在总线上有优先权,它可以在任何时候抑制来自设备的通信,只需把时钟线电平拉低即可。键盘的内部结构主要包括控制电路板、按键、底板和面板等。电路板是整个键盘的控制核心,位于键盘的内部,主要担任按键扫描识别、编码和传输接口工作。它将各个按键所表示的数字或字母转换成计算机可以识别的信号,是用户和计算机之间主要的沟通者之一。 键盘主要由键开关矩阵、单片机和译码器三大部分组成。键开关矩阵即键盘按键由一组排列成矩阵方式的按键开关组成,所输入的信号由按键所在的位置决定。单片机即键盘内部采用的Intel8048单片机微处理器,这是一个40引脚的芯片,内部集成了8位CPU、10248位的ROM、648位的RAM以 及8位的定时器/计数器等。译码器即信号编码转译装置,把键盘的字符信号通过编码翻译转换成相应的二进制码。由于键盘排列成矩阵格式,被按键的识别和行列位置扫描码的产生,是由键盘内部的单片机通过译码器来实现的。根据键盘向主机送入的二进制代码类型,可把键盘分为编码键盘和非编码键盘两种。IBM PC机的键盘属于非编码键盘,其特点是不直接提供所按键的编码信息,而是用较为简单的硬件和一套专用程序来识别所按键的位置,并提供与所按键相对应的中间 代码,然后再把中间代码转换成要对应的编码。这样,非编码键盘就为系统软件在定义键盘的某些操作功能上提供了更大的灵活性。 计算机键盘通常采用行列扫描法来确定按下键所在的行列位置。所谓行列扫描法是指,把键盘按键排列成n行m列的n*m行列点阵,把行、列线分别连接到两个 并行接口双向传送的连接线上,点阵上的键一旦被按动,该键所在的行列点阵信号就被认为已接通。按键所排列成的矩阵,需要用硬件或软件的方法轮转顺序地对其行、列分别进行扫描,以查询和确认是否有键按动。如有键按动,键盘就会向主机发送被按键所在的行列点阵的位置编码,称为键扫描码。单片机通过周期性扫描行、列线,读回扫描信号结果,判断是否有键按下,并计算按键的位置以获得扫描码。键被按下时,单片机分两次将位置扫描码发送到键盘接口:按下一次,叫接通扫描码;按完释放一次,叫断开扫描码。这样通过硬件或软件的方法对键盘分别进行行、列扫视,就可以确定按下键所在位置,获得并输出扫描位置码,然后转换为ASCII码,经过键盘I/O电路送入主机,并由显示器显示出来。 键盘要增加键数是很容易的,任何矩阵键盘通过增加键盘的行或列便可实现增加按键数。如64 键的键盘排列成8行8列的行列点阵,128键的键盘排列成8行16列的行列点阵,256键的键盘排列成16行16列的行列点阵。32.2.3 系统的硬件连接硬件连接中主要连接的是PS/2键盘上的数据线(DATA)、时钟线(CLK)、电源线(+5V)及接地线(GND),其中电源线与接地线直接连接到单片的的电源线和接地线上。在数据线和时钟线的连接中要注意选好引脚,因为键盘数据线使用双向串行传输方式,所以应选择单片机上的串行输入口:P1口(如:P1.0)如果不注意使用了错误的引脚就会导致键盘输入功能的不正常运行。硬件连接如图4所示:PS/2键盘 +5V CLKDATAGNDAT89C51+5VP3.2P1.0GND图4 键盘与单片机连线图2.3驱动模块结构分析该驱动程序主要由以下10个函数组成:(1) main 函数此函数为主函数,在运行基于PS/2键盘驱动后,首先运行此函数,其作用为对变量进行初始化,为波特率发生器设置19200波特率、对键盘发送自检命令、在有信息传送时调用发送数据函数、接收数据函数和中断函数等,由于驱动的各项操作指令都在此函数中进行调用和操作,所以此函数非常重要。(2) uart 函数此函数的作用是编写两种中断:接受中断和发送中断,其目的是为接收主机命令或发送键码提出申请。(3) keytransmit 函数定义串口,把缓冲区的键值键值通过串口发送出去。(4) order 函数主机向键盘发送命令,由于主机发送命令优先级最高,所以可以打断键盘发送数据,直接拉低时钟线,等待键盘响应,发送数据时数据位与“0x01”取与再进行发送,期间发送函数循环八次,即可发送完一个数据位。再进行发送校验位的操作,确认发送数据无误时,发送终止位,等待ACK握手信号,等待时钟线信号拉高,进行下一数据位的发送。(5) Readps2 函数此函数的作用为向主机发送数据,首先向主机发送传输数据请求,同时拉迪时钟线,等待时钟线拉高,确定时钟线拉高,从缓冲区中读取一个键值,发送键值,发送校验位,确定键值发送无误,进行下一位键盘发送。(6) Keyscan 函数通过调用Readps2函数,得到一键值,把键值放入缓冲区中等待发送。(7) Ex0 函数获取键值并判断键值类型(通码或断码)。(8) KeyTransmit 函数 扫描键盘获取按键的通码与断码,存储到缓冲区中。(9) LedLock 函数此函数为控制键盘灯的状态,调用order 函数进行控制命令发送。(10) Delay 函数软件延时,赋予不同的参数,提供不同的延时,作用是为键盘发送及接受数据时,等待时钟线拉高,提供延时。第三章 驱动总体设计3.1 键盘编程资料简介3.1.1数据格式键盘数据格式见表2:表2 数据格式1个起始位总是逻辑08个数据位(LSB)低位前1个奇偶校验位奇校验位1个停止位总是逻辑11个应答位仅用在主机对从设备的通讯中表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。3.1.2 单片机接受数据时序图如图5所示: 图5 单片机接受数据时序图PS/2向单片机发送一个字节可按照下面的步骤进行:1 检测时钟线电平,如果时钟线为低,则延时50s。2 检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1)。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 延时20s3.1.3 单片机发送数据时序图如图6所示: 图6 单片机发送数据时序图单片机发送数据步骤:由于PS/2设备能提供串行同步时钟,因此,如果PC机发送数据,则PC机要先把时钟线和数据线置为请求发送的状态。PC机通过下拉时钟线大于100来抑制通讯,并且通过下拉数据线发出请求发送数据的信号,然后释放时钟。当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 检测奇偶校验位,如果校验失败,则产生错误信号以表明此次传输出现错误延时45s,以便PC机进行下一次传输。读数据线的步骤:1 延时20s2 把时钟线拉低3 延时40s4 释放时钟线5 延时20s6 读数据线通过一下步骤可用于发出应答位:1 延时15s2 把数据线拉低3 延时5s4 把时钟线拉低5 延时40s6 释放时钟线7 延时5s8 释放数据线3.1.4键盘返回值介绍键盘的处理器如果发现有键被按下释放或按住键盘将发送扫描码的信息包到计算机扫描码有两种不同的类型通码和断码当一个键被按下或按住就发送通码当一个键被释放就发送断码每个按键被分配了唯一的通码和断码这样主机通过查找唯一的扫描码就可以测定是哪个按键每个键一整套的通断码组成了扫描码集有三套标准的扫描码集分别是第一套第二套和第三套所有现代的键盘默认使用第二套扫描码。 虽然多数第二套通码都只有一个字节宽但也有少数扩展按键的通码是两字节或四字节宽这类的通码第一个字节总是为E0h。 正如键按下通码就被发往计算机一样只要键一释放断码就会被发送每个键都有它自己唯一的通码它们也都有唯一的断码幸运的是你不用总是通过查表来找出按键的断码在通码和断码之间存在着必然的联系多数第二套断码有两字节长它们的第一个字节是F0h 第二个字节是这个键的通码扩展按键的断码通常有三个字节它们前两个字节是E0h,F0h 最后一个字节是这个按键通码的最后一个字节作为一个例子我在下面列出了几个按键的第二套通码和断码。8表3 部分第二套通码断码实例No.KEY通码(第二套)断码(第二套)1A1CF0 1C252EF0 2E3F1009F0 094Right ArrowE074E0 F0 745Right CtrlE0 14E0 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通码断码A1CF0 1C946F0 4654F0 54B32F0 320EF0 0EINSERTE0 70E0F0 70C21F0 21-4EF0 4EHOMEE0 6CE0F06CD23F0 23=55F0 55PG UPE0 7DE0F07DE24F0 245DF0 5DDELETEE0 71E0F071F2BF0 2BBKSP66F066ENDE0 69E0F069G34F034SPACE29F029PG DNE0 7AE0F07AH33F033TAB0DF00DU ARROWE0 75E0F075I43F043CAPS58F058L ARROWE0 6BE0F06BJ3BF03BL SHFT12F012D ARROWE0 72E0F072K42F042L CTRL14F014R ARROWE0 74E0F074L4BF04BL GUIE0 1FE0 F0 1FNUM77F077M3AF03AL ALT11F011KP /E0 4AE0F04AN31F031R SHFT59F059KP *7CF07CO44F044R CTRLE0 14E0F0 14KP -7BF07BP4DF0 4DR GUIE0 27E0 F027KP +79F079Q15F015R ALTE0 11E0 F011KP ENE0 5AE0F05AR2DF02DAPPSE0 2FE0 F0 2FKP71F071S1BF01BENTER5AF05AKP 070F070T2CF02CESC76F076KP169F069U3CF03CF105F005KP272F072V2AF02AF206F006KP37AF07AW1DF01DF304F004KP46BF06BX22F022F40CF00CKP573F073Y35F035F503F003KP674F074Z1AF01AF60BF00BKP76CF06C045F045F783F083KP875F075116F016F80AF00AKP97DF07D21EF01EF901F00158F058326F026F1009F009;4CF04C425F025F1178F07852F05252EF02EF1207F007,41F041636F036PRNTSCRNE0 12E0 7CE0 F07C E0F0 12.49F04973DF03DSCROLL7EF0,7E/4AF04A83EF03EPAUSEE1 14 77E1 F0 14F0 77-NONE-ACPI 扫描码:表5 ACPI扫描码KEY通码断码PowerE0, 37E0, F0, 37SleepE0, 3FE0, F0, 3FWakeE0, 5EE0, F0, 5E3.2 Readps2()函数3.2.1 Readps2()函数流程如图7所示:开始时钟线是否拉高?YN计数i=i+1时钟线是否拉高?NNYY结束发送数据判断,i是否为8图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;if(DATA = 1)KeyCode |= 0x80; / 得到有效的数据位WAITFORKEYBOARDPULSE; / 等待按键发送效验位WAITFORKEYBOARDPULSE; / 等待按键发送终止位while(!clock); / 等待键盘把时钟线拉高if(KeyCode = CODE_POST)KeyBoardConnectFlag = 1;return(KeyCode); / 返回按键扫描3.3 Order()函数3.3.1 Order()函数流程如图8所示:开始下拉时钟至少100us下拉数据线释放数据线记数 i=i+1;i=0等待数据线拉高发送数据位与0x01取与发送数据值1并check+发送数据值0等待数据线拉高判断check奇偶N值为1值为0校验位置0校验位置1为奇为偶等待ACK握手信号结束NYY判断i=8?图8 Order() 函数流程图3.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 -); / 拉低时钟与数据并延时DATA = 0;clock = 1;for(cnt = 8; cnt != 0; cnt -) / 发送八位数据,循环八次while(clock);if(orderByte & 0x01)DATA = 1; / 根据低位设定输出数据check +; / 如果输出一个1,效验记录数据加一elseDATA = 0;orderByte = 1; / 命令字调整while(!clock); / 输出脉冲while(clock);if(check % 2) / 如果输出过偶数个脉冲DATA = 0; / 效验数据位置1elseDATA = 1; / 否则数据位置0while(!clock);while(clock);DATA = 1;while(!clock); / 发送终止位DATA = 1;clock = 1;while(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+);/延时稳定/* 初始化变量 */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 = 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;Delay(1);while(!KeyBoardConnectFlag)ReadPS2();/等待键盘自检成功Order(COMMAND_RESET); /复位键盘ReadPS2(); /等待键盘应答Delay(5);Order(COMMAND_SETSTATUS);/设置状态灯CapsLock,NumLock,ScrollLockReadPS2(); /等待键盘应答LedStatus = DISALL;Order(LedStatus); /关闭所有灯ReadPS2(); /等待键盘应答/*Order(COMMAND_READID); /读键盘IDReadPS2(); /等待键盘应答KeyIDLo = ReadPS2(); /获得键盘ID低字节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_SETRATE); /设置速率延时ReadPS2();/等待应答Order(0x20); /ReadPS2();/等待应答Delay(200); /延时EINT; /开总中断for(;)/KeyScan();/扫描键盘if(KeyFlag = 1)KeyFlag = 0;KeyTransmit();/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?NPause按键扫描码键值转换处理程序YYEO_FLAG=1?=1第二类案件扫描码键值转换处理程序muc_revchar =E0?muc_revchar =E1?muc_revchar =F0?E0_FLAG=1E1_FLAG=1F0_FLAG=1扫描码键值转换处理程序结束第一类案件扫描码键值转换处理程序扫描码键值转换处理程序开始NNYYY图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 lockelse led_status |=0x04;ps2_ledchange();break;case 0x59: agcs_status &= 0xEF;break;/右shift释放case 0x77: if(led_status&0x02)led_status&=0x05;/num lockelse led_status |=0x02;ps2_ledchange();break;case 0x7E:if(led_status&0x01) led_status&=0x06;/scroll lockelse 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;elseshift_flag=0;/扫描码键值转换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 0x12:agcs_status|= 0x01;/
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:基于单片机的PS2键盘的驱动设计
链接地址:https://www.renrendoc.com/p-512607.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!