东海科学技术学院
毕业论文(设计)
题目:3D鼠标在小汽车控制中的应用
系:机电系
学生姓名:
专业:
班级:
指导教师:
起止日期:
3D鼠标在小汽车控制中的应用
摘要
单片机作为最典型的嵌入式系统,已经广泛应用到各个工业领域。随着电子产业的飞速发展和计算机在社会领域的渗透,单片机的应用正在不断地走向深入,同时带动传统控制检测技术不断更新。单片机人机接口技术,是单片机设备与人之间交互实现信息传输的控制电路。鼠标原本是PC机上的人机输入设备,耗电极少、可靠性高、价格低廉,在嵌入式系统中引入光电鼠标来作为小汽车(或其它移动物体)的位置量采集设备,是一种较独特的思路。通过光电鼠标的水平或垂直变量输出,来进行小汽车的位置判定或比较控制,从而实现对小汽车的控制。通过设计嵌入式应用的3D鼠标接口程序,分析了3D鼠标的位置移动信息采集原理,可将3D鼠标技术应用于嵌入式应用系统的各类领域。
关键词:单片机;3D鼠标;LCD显示
Abstract
Singlechipmicrocomputerasthemosttypicalembeddedsystemshavebeenwidelyusedinvariousindustrialfields.Alongwiththerapiddevelopmentofelectronicindustryinthefieldsofcomputerandthesociety,theapplicationofSCMiscontinuouslytofurther,traditionalcontroltesttechnologyconstantlyupdated.SCMhuman-machineinterfacechiptechnologyandequipment,realizetheinteractionbetweeninformationtransmissioncontrolcircuit.Themouseisoriginallypc-residentman-machineinputdevices,powerconsumption,highreliability,lowprice,inembeddedsystemsintoopticalmousetoacar(orothermobileobject)positionvariablesacquisitionequipment,itisakindofrelativelyuniqueideas.Throughthephotoelectricmousehorizontalorverticaloutputvariables,thecarpositionorjudgementonthecar,thecontrol.Throughthedesignoftheembeddedapplicationprograminterface,3Dmouse3Dcursorpositionmobileinformationcollectionprinciple,3Dmousetechnologyappliedtovariousareasoftheembeddedapplicationsystem.
Keyword:SingleChipMicrocomputer;The3Dmouse;LCDdisplay
目录
摘要 I
Abstract II
前言 1
第1章硬件选择及介绍 4
1.1设计相关性能指标及确定 4
1.2主处理器的选择 4
1.2.1STC89C52RC单片机的主要应用特点 4
1.2.2STC89C52RC单片机的几个特殊功能寄存器 5
1.3LCD显示器的选择 6
1.3.112232F点阵LCD显示器概述 6
1.43D鼠标 7
第2章系统硬件接口设计 8
2.112232F液晶显示器与单片机的接口 8
2.23D鼠标的接口协议 10
2.2.1PS/2接口和协议 10
2.2.2PS/2鼠标的协议数据包格式 10
2.3硬件接口设计与实现 11
第3章系统程序设计 12
3.1主程序设计 12
3.23D鼠标程序设计 12
3.2.1PS/2命令表 12
3.2.2主机到鼠标设备的通讯过程 13
3.2.3鼠标到主机的通讯过程 16
3.2.43D鼠标初始化过程 18
3.3LCD显示程序设计 19
3.3.112232F指令说明 19
3.3.212232FLCD液晶显示程序设计 21
第4章设计调试与功能测试 22
小结 23
致谢 24
参考文献 25
附录一、实验板电路图 26
附录二、鼠标应用程序 27
前言
微型计算机的出现是电子数字计算机广泛应用到人们日常生活领域中去的一个重大转折点。它已深入应用到非微型计算机所无法应用的领域,对社会产生了极大地影响。单片微型计算机是微型计算机发展的一个重要分支,它以独特的结构性能,越来越普遍地应用到国民经济建设中的各个领域[1]。
现代计算机技术的产业革命,将世界经济从资本经济带入到知识经济时代。在电子世界领域,从20世纪中的无线电时代也进入到21世纪以计算机技术为中心的智能化现代电子系统时代。现代电子系统的基本核心是嵌入式计算机系统(简称嵌入式系统),而单片机是最典型、最广泛、最普及的嵌入式系统。
通常将满足海量高速数值计算的计算机称为通用计算机系统;而把面向工控领域对象,嵌入工控应用系统中,实现嵌入式应用的计算机称为嵌入式计算机系统,简称嵌入式系统[1]。
嵌入式系统具有以下特点:
1、面对控制对象。
2、嵌入到工控应用系统中的结构形态。
3、能在工业现场环境中可靠运行的品质。
4、突出控制功能,对外部信息的捕捉、对控制对象实时控制和有突出控制功能的指令系统。
嵌入式系统的种类有以下4种:
1)工控机。将通用计算机经机械加固和电气加固改造后构成,其特点是软件丰富、体积大。
2)通用CPU模块。用CPU构成各种形式的主机板系统,体积小。
3)嵌入式微处理器。在通用微处理器(MPU)的基核上,增添一些外围单元和接口构成单芯片形态的计算机系统,
4)单片机(微控制器)。单片机有惟一的专门嵌入式应用系统设计的体系结构与指令系统,最能满足嵌入式应用要求。单片机是完全按铅入式系统要求设计的单芯片形态应用系统,能满足面对控制对象、应用系统的嵌入、现场的可靠运行及非凡的控制品质等要求,是发展最快、品质最多、数量最大的嵌入式系统[2]。
嵌入式系统源于计算机的嵌入式应用,早期嵌入式系统为通用计算机经改装后嵌入到对象体系中的各种电子系统,如舰船的自动驾驶仪,轮机监测系统等。嵌入式系统首先是一个计算机系统,其次它被嵌入到对象体系中、在对象体系中实现对象要求的数据采集、处理、状态显示、输出控制等功能,由于嵌入在对象体系中,嵌入式系统的计算机没有计算机的独立形式及功能[3]。
早期的单片机只是按嵌入式应用技术要求设计的计算机单芯片集成,故名单片机[4]。单片机是大规模集成电路技术发展的产物,属第四代计算机。单片机是把中央处理器(CentralProcessingUnit)、随机存取存储器RAM(RandomAccessMemory)、只读存储器ROM(ReadOnlyMemory)、定时器/计数器以及I/O(Input/Output)接口电路等主要计算机部件集成在一块集成电路上的微型计算机。单片机是指一个集成在一块芯片上的完整计算机系统。尽管它的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备[5]。现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。
单片机诞生于20世纪70年代末,主要经历了SCM、MCU、SoC三大阶段[10]。1.SCM即单片微型计算机(SingleChipMicrocomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。2.MCU即微控制器(MicroControllerUnit)阶段,主要技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关3.单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素,寻求应用系统在芯片上的最大化解决,从单片微型计算机、单片微控制器延伸到单片应用系统。
单片机最早被用在工业控制领域,也被称为微控制器(Microcontroller)。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上,相当于一台微型的计算机,和计算机相比,单片机只缺少了I/O设备[6]。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
早期的单片机都是8位或4位的。随着工业控制领域要求的提高,开始出现了16位单片机,但是因为性价比不理想未得到广泛的应用。90年代后单片机技术得到了巨大的提高,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上[7]。
目前,单片机芯片产量以每年27%的速度递增,现已突破28亿片,而我国的年需求量也将近亿片,这表明单片机应用有着广阔的市场。单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
单片机芯片的集成度很高,它将微型计算机的主要部件都集成在一块芯片上,鉴于单片机芯片的特点,单片机可在以下几个方面得到应用:
1、智能仪器仪表应用
单片机芯片具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便,且价格低廉等优点,广泛应用于仪器仪表中,使得仪器仪表数字化、智能化、微型化,且功能比采用电子或数字电路更加强大[7]。
2、测控系统中应用
单片机根据工控环境要求设计,许多功能部件集成在芯片内部,其信号通道受外界影响小,可靠性高,抗干扰性能优越于其它一般的CPU。单片机控制功能强,运行速度快。其结构组成与指令系统都着重满足工控要求。所以,单片机是最适宜于控制领域的。
3、智能产品的应用
现在的家用电器基本上都采用了单片机控制,无处不在,我们的生活离不开单片机。广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等。
4、在计算机网络和通信领域中的应用
现代的单片机普遍具备通信接口,在接口中采用单片机进行控制和管理后,主机和单片机就能并行工作,大大提高了系统的运算速度,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备也基本上都实现了单片机智能控制[8],
5、单片机在医用设备领域中的应用
单片机在医用设备中的用途亦相当广泛。例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等医疗器械。
6、在各种大型电器中的模块化应用
为了在各种电路中进行模块化应用,某些专用单片机设计用于实现特定功能而要求使用人员了解其内部结构。在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错误率,也方便于更换。
7、单片机在汽车设备领域中的应用
单片机在汽车电子中的应用非常广泛,例如汽车中的发动机控制器,基于CAN总线的汽车发动机智能电子控制器,GPS导航系统,制动系统等等。
鼠标内核本质上是一个二维的角度或位移信号检测装置,耗电极少、可靠性高、价格低廉,可能在许多场合发挥作用。鼠标与主机之间通过RS-232标准串行接口进行通信,信息传送师单方向、无条件、无应答连续进行的。鼠标是一个功能高度集中的小型机电一体化系统。它首先将直线移转换成角度位移,再转变成数字量,然后与按钮状态统一编码,通过RS-232串口发出。工作所需功率从RS-232串行接口的控制线上窃取。当被拖动超过一个最小距离或某一按钮被按下时,它按照规定的协议将移动距离和按钮状态通过一次或几次发送到主机,主机上的鼠标驱动程序将信息转换成鼠标位置和按钮状态供其他程序模块调用。每发生一次移动或按钮状态变化,鼠标向上发送一次信息。一般分辨率为400PI。各种串行接口鼠标在物理层普遍采用标准的串行通信协议,波特率为1200bps。其接口模块主要包括按钮状态和位置识别两个部分。鼠标在市场上,形状、大小和接口,各种各样,最普遍的可能是PS/2接口鼠标,在较大的嵌入式应用系统中使用鼠标接口将会使操作更方便,特别是在一些平时不需要使用人员操作但在产品出厂或使用阶段发生故障时需由技术人员进行调试设置的设备。在嵌入式设备中使用鼠标作为人机接口,既可减少主机的硬件接口设计,又能提高平时设备的安全运行[9]。利用鼠标的位移变量来进行小汽车动态位置的测量,可实现小汽车在平面上的位置标定,从而为汽车运动进行控制提供参数。
第1章硬件选择及介绍
1.1设计相关性能指标及确定
设计任务要求与实验方案确定如下:采用点阵LCD液晶显示屏,可显示14个中文汉字英文(数字)3个LCD液晶显示
1.2.1STC89C52RC单片机的主要应用特点
STC89C52RC单片机的主要特点如下:
增强型6时钟/机器周期,12时钟/机器周期8051CPU
工作频率范围:0-40MHZ,相当于普通8051的0-80MHZ,实际工作频率可达48MHZ。
工作电压:5.5V-3.4V(5V单片机)/3.8V-2.0V(3V单片机)
用户应用程序空间4K/8K/13K/16K/20K/32K/64K字节
片上集成1280字节/512字节RM
通用I/O(32/36个),复位后:P1/P2/P3/P4是准双向口/弱上拉,P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
EEPROM功能
看门狗
ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器,可通过串口(P3.0/P3.1)直接下载用户程序,8K程序3秒即可完成一片
外部中断4路,下降沿中断或低电平触发中断,POWERDOWN模式可由外部中断低电平触发中断方式唤醒
内部集成MAX810专用复位电路,外部晶体20M以下时,可省外部复位电路
共三个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用
通用异步串行口(UART),还可以用定时器软件实现多个UART。
工作温度范围:0-75℃/-40-+85℃
封装:LQFP-44,PDIP-40,PLCC-44,PQFP-44
除以上几个特点外,还有其自身独特的优点:(1)加密性强,无法解密。(2)超强抗干扰,宽电压,不怕电源抖动。(3)三大降低单片机时钟对外部电磁辐射的措施:禁止ALE时钟信号输出;外部时钟频率一半,即6T模式;单片机内部的时钟振荡器增益降低一半。(4)超低功耗:掉电模式:典型功耗<0.1uA,可由外部中断唤醒,中断返回后,继续执行原程序;空闲模式:典型电流损耗为2mA;正常工作模式:典型电流功耗为4mA-7mA;掉电模式可由外部中断唤醒,适用于水表、气表等供电系统及便携设备。
1.2.2STC89C52RC单片机的几个特殊功能寄存器
1、看门狗控制寄存器WDT_CONTR
看门狗(WDT),是一个定时器电路,有一个输入和一个输出端。MCU正常工作时,每隔一段时间输出一个信号到输入端,给WDT清“0”。如果超过规定的时间不输入,WDT定时超过,就回给一个复位信号到MCU并使其复位,以防止MCU坏死。看门狗的作用就是防止程序发生死循环,或者说防止程序跑飞。其工作原理是:在系统运行以后如果启动看门狗计数器,看门狗就开始自动计数,如果到了一定时间还不去清除看门狗,那么看门狗计数器就会溢出从而看门狗中断,造成系统复位。
扩张中断控制寄存器XICON
XICON是用来控制扩展外部中断INT2/INT3的寄存器,其中低4位与INT2相关,高4位与INT3相关。
T2CON各位的含义如下:
TF2定时器T2溢出标志位。定时器T2溢出时置位,必须由软件清除;当RLCK=1或TCLK=1时,TF2将不会置位。
EXF2定时器T2外部标志位。当EXEN2=1且T2EX的负跳变产生捕捉或重装时,EXF2置位。定时器T2中断使能时,EXF2=1将使CPU从中断向量处执行定时器T2中断子程序。
RLCK接收时钟标志位。
TCLK发送时钟标志位。
EXEN2定时器T2使能标志位。
TR2定时器T2启动/停止控制位。
C/T定时器/计数器选择标志位。
CP/RL捕捉/重装标志位。
根据以上的位定义,可以看出定时器/计数器T2的工作方式是由T2CON寄存器的相关位的组合确定的。
中断允许寄存器IE中断允许寄存器IE的D5位ET2置“1”时,允许T2中断。
1.3LCD显示器的选择
本设计中要求显示3D鼠标的X、Y位移检测值(70CM边长正方形以内),由于液晶显示器(LCD)具有功耗低、体积小、质量轻、超薄等其他显示器无法比拟的优点,它广泛用于各种智能型仪器和低功耗电子产品中。点阵式(或图形式)LCD不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕上下左右滚动、动画、闪烁、文本特征显示等功能,12232F点阵LCD显示器概述
12232F点阵LCD显示器是一种图形点阵液晶显示器,主要由行驱动器/列驱动器及128×32全点阵液晶显示器组成[11]。,也可以显示7.5×2个(16×16点阵)汉字.与外部CPU接口采用并行或串行方式控制。
其主要技术性能指标如下:
1、电源:VDD:+3.0∽+5.5V。(电源低于4.0伏LED背光需另外供电)
2、显示内容:122(列)×32(行)点。
3、全屏幕点阵。
4、2MROM(CGROM)总共提供8192个汉字(16×16点阵)。
5、16KROM(HCGROM)总共提供128个字符(16×8点阵)。
6、2MHZ频率。
7、工作温度:0℃∽+60℃,存储温度:-20℃∽+70℃
1.43D鼠标
鼠标原本是PC机上的人机输入设备,在嵌入式设备中如果使用鼠标作为人机接口,既可减少主机的硬件设计,又能提高平时设备的安全运行。鼠标耗电少价格低廉系统硬件接口设计:BF
BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据;BF=0时,模块为准备状态,随时可接受外部指令和数据。所以,BF标志主要是用来提供内部工作情况。
利用STATUSRD指令,可以将BF读到DB7总线,从而检验模块的工作状态。
(4)字型产生ROM(CGROM)
字型产生ROM(CGROM)提供8192个此触发器是用来控制模块屏幕显示开和关的。DFF=1为开显示(DISPLAYON),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAYOFF)。
其中,DFF的状态是由指令DISPLAYON/OFF和RST信号控制。
(5)显示数据RAM(DDRAM)
模块内部显示数据RAM最多可控制4行16字(64个字)的中文字型显示,提供64×2个位元组的空间。此模块可显示三种字型,分别是瘦长的英数字型(168)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在00~0F的编码中将选择CGRAM的字定义字型,10~7F的编码中将选择瘦长英数字的字型,至于A0以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码(A140~D75F)。当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;
(6)字型产生RAM(CGRAM)
字型产生RAM提供图象定义(造字)功能,可以提供四组16×16点自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,然后便可以和CGROM中的定义一般的通过DDRAM显示在荧屏中。
(7)地址计数器AC
地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后当只要读取或是写入DDRAM/CGRAM的值,此时,地址计数器的值就会自动加“1”,当RS为“0”时而R/W为“1”时,则地址计数器的值会被直接读取到DB6~DB0中。
(8)游标/闪烁控制电路
此模块提供硬体游标及闪烁控制电路,由地址计数器的值来指定DDRAM中的游标或闪烁的位置。
2、模块的外部接口
模块外部接口信号如下表2.1、2.2所示:
表2.1模块并行接口的外部接口信号
管脚号 管脚名称 LEVER 管脚功能描述 1 VSS 0V 电源地 2 VCC 3.0+5V 电源正 3 VEE - 对比度调整 4 RS(CS)H/L RS=“H”,表示DB7~DB0为显示数据
RS=“L”,表示DB7~DB0为显示指令数据 5 R/W(SID) H/L R/W=“H”,E=“H”,数据被读到DB7~DB0
R/W=“L”,E=“H→L”,DB7~DB0的数据被写到IR或DR 6 E(CLK) H/L 使能信号 7 DB0 H/L 数据线 8 DB1 H/L 数据线 9 DB2 H/L 数据线 10 DB3 H/L 数据线 11 DB4 H/L 数据线 12 DB5 H/L 数据线 13 DB6 H/L 数据线 14 DB7 H/L 数据线 15 BL+ VDD 背光源电压+4.2V-+5V 16 BL- Vss 背光源公共端
管脚号 名称 LEVER 功能 1 VSS 0V 电源地 2 VDD +5V 电源正(3.0V~5.5V) 3 VEE - 对比度调整 4 CLK H/L 串行同步时钟:上升沿时读取SID数据 5 SID H/L 串行数据输入端 6 CS H/L 模组片选端,高电平有效 7 BL+ VDD 背光源电压+4.2V-+5V 8 BL- VSS 背光源公共端
2.23D鼠标的接口协议
2.2.1PS/2接口和协议
接口的物理特性
PS/2接口用于许多现代的鼠标和键盘,由IBM最初开发和使用?物理上的PS/2接口有两种类型的连接器:5脚的DIN和6脚的mini-DIN?图1就是两种连接器的引脚定义?使用中,主机提供+5V电源给鼠标鼠标的地连接到主机电源地上?
2、接口协议原理
PS/2
2.2.2PS/2鼠标的协议数据包格式
鼠标上是一个二维的角度或位移信号检测装置它将直线移转换成角度位移数字量,当鼠标被拖动超过一个最小距离或某一按钮被按下时,它按照规定的协议将移动距离和按钮状态通过一次或几次信息发送信息PS/2鼠标在工作过程中,会及时把它的状态数据发送给主机?发送的数据包格式如表1所示?Byte1中的Bit0?Bit1?Bit2分别表示左?右?中键的状态,状态值0表示释放,1表示按下?Byte2和Byte3分别表示X轴和Y轴方向的移动计量值,是二进制补码值?Byte4的低四位表示滚轮移动计量值,也是二进制补码值,高四位作为扩展符号位?这种数据包由带滚轮的三键三维鼠标产生?若是不带滚轮的三键鼠标,产生的数据包没有Byte4其余的相同?
接口设计
PS/2鼠标接口采用双向同步串行协议,时钟脉冲信号以下皆称CLOCK总是由鼠标产生?因此,可以考虑这种方案:鼠标的CLOCK接主机的一外中断线,数据线以下皆称DATA接主机的某一I/O口线,如图4所示?
由于鼠标与主机之间以双向同步串行协议传送数据,鼠标的CLOCK接主机的外中断,在初始化过程中,主机利用CLOCK的外中断和RxD脚的I/O口线功能实现数据的传输?初始化完成后,鼠标处于模式的工作状态,这时鼠标能主动发送数据?这样,主机可以在每收到一帧数据时才中断一次?中断次数大大降低,减少了主机资源的耗用?
在此方案中,必须实现另一个功能主机波特率的自适应?因为PS/2接口的鼠标一般工作在10kHz~20kHz时钟频率?不同鼠标工作的时钟频率不同?嵌入设备主机要做到与不同鼠标的波特率同步自适应,才能够正确接收鼠标传送来的数据?波特率的自适应这样实现:鼠标上电自检时会产生一串时钟脉冲,利用鼠标时钟脉冲产生的中断,结合主机的定时器测量时钟脉冲周期,可以得出所用鼠标的时钟频率,进而求出波特率?通过设置相应的波特率寄存器,实现了波特率的自适应
第3章系统程序设计
3.1主程序设计
系统上电后,LCD初始化开机自检,然后调用鼠标初始化子程序对3D鼠标进行初始化设置,判断鼠标是否初始化成功,若成功则调用鼠标功能子程序,单片机则开始不断检测鼠标有无发送数据,若有数据发送到单片机,单片机则开始对接收到的数据进行处理,对鼠标的按键和滚轮等信息进行解释并分别处理后,得到鼠标的输入信息,最后调用液晶显示子程序,显示X、Y的值。主程序程序流程图如3.1所示。
3.23D鼠标程序设计
3.2.1PS/2命令表
0XFF:复回命令。鼠标接收到这个命令时应答“0XFA”,然后进入复回模式。
0XFE:重发命令。每当主机收到无效的鼠标数据时,可发“0XFE”命令,鼠标将重发最后的数据包。
0XF6:设定默认值的命令。
0XF5:在流模式中是禁止数据报告的命令。鼠标发回“0XFA”后,禁止数据报告的发送并将移动计数器复零,这仅在流模式中对数据报告起作用,但不能禁止取样率。
0XF4:允许数据报告命令。这个命令只能在远程模式或流模式中能用,在流模式中仅仅影响数据报告。
0XF3:设定取样率命令。鼠标发回确认命令后从主机接收一个以上的字节,鼠标存储这些字节作为新的取样率,接收完取样率数据后,鼠标再发回确认“0XFA”字节,然后复位移动计数器,有效的取样值为:10,20,40,60,80,100,200。
0XF2:获取设备ID号码命令。鼠标发确认(0XFA)和发设备的ID号后并将计数器值清零。ID号有0X00:表示标准鼠标和数据包由三个字节组成。
0X03:表示3D鼠标和数据包由四个字节组成。
0X04:表示四键和五键的鼠标
0XF0:设定远程模式。鼠标发确认(0XFA)后进入远程模式。
0XEE:设定包模式。鼠标发确认(0XFA)后进入包模式。
0XEC:复回包模式。鼠标发确认(0XFA)后移动计数器复位,然后进入上次的包模式。
0XEB:读数据命令。鼠标发确认(0XFA)后然后发一个移动数据包,在远程模式中这是唯一的读数方法,在数据包成功发送后将计数器复零。
0XEA:设定为流模式。鼠标发确认(0XFA)后进入流模式。
0XE9:状态读出命令。鼠标发确认(0XFA)后发以下三个字节,然后将计数器复0。
字节1 0 模式 允许 计数比例 0 左 中 右 字节2 分辨率 字节3 取样率 模式位:1表示远程模式允许,0表示流模式允许。
允许位:1表示数据报告允许,0表示不允许。
计数比例位:1表示2:1,0表示为1:1。
0XE8:设定分辨率命令。鼠标发确认(0XFA)后从主机读一个字节,然后鼠标再发确认(0XFA),清计数器然后根据主机的字节设定分辨率。
从主机读得的值 设定后的分辨率 0X00 1个计数值/毫米 0X01 2个计数值/毫米 0X02 4个计数值/毫米 0X03 8个计数值/毫米 0XE7:设定(2:1)计数比例。鼠标发确认(0XFA)后进入2:1的计数状态。
0XE6:设定(1:1)计数比例。鼠标发确认(0XFA)后进入1:1的计数状态。
对于这些命令以外的命令,鼠标将发“0XFE”(重发)或“0XFC”(错误)字节。
3.2.2主机到鼠标设备的通讯过程
平时PS/2设备总是产生时钟信号,如果主机要发送数据它必须首先把时钟和数据线设置为请求标志,发送过程为:通过下拉时钟线至少100us来抑制通讯;通过下拉数据线来请求发送,然后释放时钟,再开始发数据。
主机必须按下面的步骤发送数据到PS/2设备:
1)把时钟线拉低至少100us
2)把数据线拉低
3)释放时钟线
4)等待设备把时钟线拉低
5)设置/复位数据线发送第一个数据位
6)等待设备把时钟拉高
7)重复4-6,发送剩下的7个数据位和校验位
8)等待设备把时钟线拉低
9)数据线置1
10)等待设备把时钟线释放
11)等待设备把数据线拉低
12)等待设备把时钟拉低
13)等待设备把时钟拉高
14)等待设备把数据线拉高
图3.2描述了两个重要定时条件a和b,a在主机最初的时候把数据线拉低后设备开始产生时钟脉冲的时间必须不大于15ms,b数据包被发送的时间必须不大于2ms。如果这两个条件都不满足主机将产生一个错误。在数据包收到后主机为了处理数据立刻把时钟线拉低来抑制通讯,如果主机发送的命令中要求有一个回应,这个回应必须在主机释放时钟线后20ms之内被收到,否则主机产生一个错误。
另一方面,在设备到主机的通讯情况中,时钟改变后的5us内不应该发生数据改变的情况,如果要仿真一个鼠标或键盘,可按如下的过程从主机读入数据,但是在主程序中至少每10ms检测数据线是否为低。
设备按如下次序读取每位8个数据位检验位和停止位:
1)延迟20us
2)把时钟拉低
3)延迟40us
4)释放时钟
5)延迟20us
7)读数据线
设备按如下次序发送应答位:
1)延迟15us
2)把数据线拉低
3)延迟5us
4)把时钟线拉低
5)延迟40us
6)释放时钟线
7)延迟5us
8)释放数据线
图3.3为单片机发送命令字到鼠标子程序流程图。
3.2.3鼠标到主机的通讯过程
在PS/2接口中,所有的数据和时钟线都是集电极开路结构,正常状态下保持高电平。当鼠标等待发送数据时它首先检查时钟线以确认它是否为高电平,如果不是那么就是主机抑制了通讯。鼠标设备必须把任何要发送的数据缓冲直到重新获得总线控制权为止。鼠标的缓冲区仅存储最后一个要发送的数据包。如果时钟线是高电平的话,鼠标设备就可以开始传送数据,每个位都在时钟的下降沿被主机读入,当时钟为高时鼠标设备就改变数据线状态,如图3.4所示。
鼠标设备按如下的过程发送1个位:
1)设置/复位数据
2)延迟20us
3)把时钟拉低
4)延迟40us
5)释放时钟
6)延迟20us
主机从鼠标接收一个字节的过程:
1)等待Clock=high
2)在50us内等待Clock是否变低No—放弃退出;YES—执行第3步,
从鼠标读取字节。
3)读入起始位(0),并检查是否为0No—退出;YES—执行下一步
4)等待Clock=high
5)在50us内等待Clock是否变低No—放弃退出;YES—执行下一步。
6)读入1位,等待Clock=high,重复5-6步,共读入8位数
据及1位奇隅校验位
7)进行奇校验。出错退出,正确执行下一步。
8)接收停止位,并验证是否为1,出错退出,正确则执行下一步
9)置正确接收标志(C=1,出错退出时C=0)
单片机从鼠标读取数据程序流程图如图3.5所示:
3.2.43D鼠标初始化过程
加电后系统首先执行自检子程序,然后调用鼠标初始化子程序对3D鼠标进行初始化设置,如果三键鼠标设置不成功则转去执行出错处理子程序;如果鼠标初始化成功,单片机则开始不断检测鼠标有无发送数据,若有数据发送到单片机,单片机则开始对接收到的数据进行处理,3D鼠标发过来的数据为4个字节,过滤掉位移信息(X、Y坐标),对鼠标的按键和滚轮等信息进行解释并分别处理后,得到鼠标的输入信息,最后根据不同的应用进入不同的处理程序。
整个系统工作过程中,因为鼠标是主动发送按键、位移等一系列数据信息,所以鼠标的初始化是一个关键。单片机对鼠标的初始化,是按照PS/2鼠标接口异步串行通讯协议的数据格式和时序进行的。初始化的过程是主机向鼠标发送命令的过程,单片机向鼠标发出的命令有:复位命令、设置鼠标工作方式、读取设备ID号及读取数据等等一系列命令,鼠标每接收一个命令,都回送主机一个应答信号,否则初始化失败。初始化成功后鼠标就可以在检测到有按键、移动等动作后就主动向单片机发送数据了.
图3.6为单片机对鼠标进行初始化的程序流程图。
3.3LCD显示程序设计
3.3.112232F指令说明
模块控制芯片提供两套控制命令,其基本指令和扩充指令表示如下:
表3.112232F基本指令表(RE=0:基本指令)
指
令 指令码 功能 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 清除
显示 0 0 0 0 0 0 0 0 0 1 将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H" 地址
归位 0 0 0 0 0 0 0 0 1 X 设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM的内容 显示状态开/关 0 0 0 0 0 0 1 D C B D=1:整体显示ON
C=1:游标ON
B=1:游标位置反白允许 进入点
设定 0 0 0 0 0 0 0 1 I/D S 指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位 游标或显示移位控制 0 0 0 0 0 1 S/C R/L X X 设定游标的移动与显示移位控制位;这个指令不改变DDRAM的内容 功能
设定 0 0 0 0 1 DL X RE X X DL=0/1:4/8位数据
RE=1:扩充指令操作
RE=0:基本指令操作 设定CGRAM
地址 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 设定CGRAM地址 设定DDRAM
地址 0 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0 设定DDRAM地址(显示位址)
第一行:80H-87H
第二行:90H-97H 读取忙标志和地址 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值 写数据到RAM 1 0 数据 将数据D7~D0写入到内部的RAM(DDRAM/CGRAM/IRAM/GRAM) 读出RAM的值 1 1 数据 从内部RAM读取数据D7~D0
(DDRAM/CGRAM/IRAM/GRAM) 表3.212232F扩充指令表(RE=1:扩充指令)
指
令 指令码 功能 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 待命
模式 0 0 0 0 0 0 0 0 0 1 进入待命模式,执行其他指令都棵终止
待命模式 卷动地址开关开启 0 0 0 0 0 0 0 0 1 SR SR=1:允许输入垂直卷动地址
SR=0:允许输入IRAM和CGRAM地址 反白
选择 0 0 0 0 0 0 0 1 R1 R0 选择2行中的任一行作反白显示,并可决定反白与否。初始值R1R0=00,第一次设定为反白显示,再次设定变回正常 睡眠
模式 0 0 0 0 0 0 1 SL X X SL=0:进入睡眠模式
SL=1:脱离睡眠模式 扩充
功能
设定 0 0 0 0 1 CL X RE G 0 CL=0/1:4/8位数据
RE=1:扩充指令操作
RE=0:基本指令操作
G=1/0:绘图开关 设定绘图RAM
地址 0 0 1 0
AC6 0
AC5 0
AC4 AC3
AC3 AC2
AC2 AC1
AC1 AC0
AC0 设定绘图RAM
先设定垂直(列)地址AC6AC5…AC0
再设定水平(行)地址AC3AC2AC1AC0
将以上16位地址连续写入即可 备注:当IC1在接受指令前,微处理器必须先确认其内部是否处于非忙碌状态,即读取BF标志时,BF为零,才可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即等待前一个指令确实执行完成后。
3.3.212232FLCD液晶显示程序设计
在液晶显示信息之前,必须先要对液晶进行初始化。初始化的流程如图3.7所示:
RSRWD7D6D5D4D3D2D1D0 ……在此指令前,不能检查BF标志 000011××××
000011××××× ……在此指令前,不能检查BF标志 000011×××××
00001111XX ……此指令前,不能检查BF标志
0000111000 ……设置基本指令
0000000001 ……荧屏显示清除
00000001I/DS ……进入点设定
第4章设计调试与功能测试
鼠标通讯程序的测试在实验板上进行,经实验,当鼠标在25CM左右的平面上水平移动或垂直移动时,液晶显示器上X、Y的坐标数据分别能从0-255之间变化。在移动过程中,判断是否成水平垂直方向上有误差,从结果上看,移动距离与数据的增量成正比例变化,符合运动方向及距离变化对数据的精确采集要求。
小结
PS/2鼠标只要占用二根端口线即可实现对嵌入式应用系统的控制,在各种规格的液晶或CRT显示器
致谢
转眼间我的大学四年生活就要结束。在整个毕业设计过程当中,最重要的是要感谢的是我的导师楼然苗老师,你的耐心严谨的态度,帮助我完成设计,并给予理论方向及方法指导,让我了解不只是一次设计而已,而是一份对大学四年学习的总结和测验,使我能换个角度看待思考问题,从而能够找出更好的解决问题方法。在本次设计中,还得到了其它老师和同学的帮助,在此,谨向尊敬的老师们和同学们致以诚挚的谢意。
参考文献
[1]楼然苗,李光飞.51系列单片机设计实例第二版[M].北京:北航出版社,2005.09
[2]余永权.89系列FLASH单片机原理及应用[M].北京:电子工业出版社,2000.09
[3]孙燕,刘爱民.Protel99设计与实例[M].北京:机械工业出版社,2000.11
[4]张洪润、易涛.单片机(第二版)应用技术教程[M].清华大学出版社
[5]张伟等编著.Protel99SE实用教程[M].人民邮电出版社
[6]张旭涛、曾现锋、王爱军.单片机原理与应用[M].北京理工大学出版社
[7]先锋工作室编著.单片机程序设计实例[M].清华大学出版社
[8]吴黎明主编.单片机原理及应用技术[M].科学出版社
[9]蔡美琴,张为民,何金儿,毛敏,陶正苏,毛义梅.MCS-51系列单片机系统及其应用第二版
[M].高等教育出版社,2004.6
[10]求是科技编著.单片机典型模块设计实例导航[M].人民邮电出版社,2005.08
[11]12232F液晶显示模块说明.深圳市科诺亚电子有限公司.www.kna-lcd.com
[12]周向红.51系列单片机应用与实践教程[M].高等教育出版社,2008.05
[13]何立民.跟我学用单片机[M].北京:北京航空航天大学出版社,2002.06
[14]PS/2鼠标接口的设计与实现.电子电路图网.www.4667.cn
[15]杨永华.嵌入式应用系统中PS/2鼠标的应用.浙江海洋学院.
[16]NationalInstruments.LabVIEWAdvancedCourse,2003
[17]M.E.Cannon,R.Nayak,G.Lachapell,0.S.Salychev.LowCostINSIGPSIntegration:ConceptsandTesting.TheJournalOfNavigation,2001(1)
附录一、实验板电路图
附录二、鼠标应用程序
;-----------------------------------------------
;鼠标应用程序示范
;MCUAT89S51XAL12MHz
;-----------------------------------------------
;
;-----------------------------------------------
;变量、常量、端口定义表
;-----------------------------------------------
;
MOUSEFLAGBIT000H;3D鼠标存在标志
MOUSEDATADATA021H;鼠标读出数据寄存单元21H~24H
DATA_XDATA025H;水平方向调整数据
DATA_YDATA026H;竖直方向调整数据
DATA_ZDATA027H;滚轮调整数据
PS2CLKBITP0.1;接ps/2座的5脚,移位时钟
PS2DTLBITP0.0;接ps/2座的1脚,移位数据
LAMP1BITP3.4;小灯1
LAMP2BITP3.3;小灯2
BEEPBITP0.2;蜂鸣器
;
LAMPBLAKEQUP1.4;背光灯控制,=0时开,=1时关.
CS EQU P1.5;液晶使能,=1操作,=0禁止.
SIDEQU P1.6;液晶串行数据输入口
SCLK EQU P1.7;液晶串行操作时钟口
DISDATAEQU40H;LCD显示单元,连续3个单元
;-----------------------------------------------
;中断向量表
;-----------------------------------------------
ORG0000H
START:LJMPMAININI;0000H引向主程序初始化
;
;-----------------------------------------------
;主程序
;-----------------------------------------------
ORG0030H
MAININI:MOVIE,#00H;关中断
MOVPSW,#00H;选用寄存器组0
MOVSP,#80H;设置堆栈指针
CLRCS;液晶操作
LCALLSETUP;LCD初始化
LCALLLOGON;开机显示画面
MOVR0,#40H;40H-43H为显示数据存放单元(40H为最高位)
MOVR7,#0BH
CLEARDISP:MOV@R0,#00H
INCR0
DJNZR7,CLEARDISP
;
MOVR6,#027H
MOVR7,#010H
LCALLDELAY3D
CLRMOUSEFLAG
LCALLPS2_3DMOUSEINI;初始化3D鼠标
MOVA,R7
JNZMAIN01
SETBMOUSEFLAG;3D鼠标初始化成功
CLRLAMP1
;
MAIN01:NOP;其它主程序
NOP
;以下鼠标功能程序
JNBMOUSEFLAG,MAIN01
LCALLMOUSEFUN;鼠标功能子程序
AJMPMAIN01
;
;-----------------鼠标功能程序------------------
MOUSEFUN:MOVR0,#MOUSEDATA
LCALLTHREEDMOUSER
MOVA,R7
JNZRETOUT
JBMOUSEDATA.0,MAIN021;鼠标左键
JBMOUSEDATA.1,MAIN022;鼠标右键
JBMOUSEDATA.2,MAIN023;鼠标中键
FUN1:
JBMOUSEDATA.4,DX;鼠标水平右处理
MOVA,DATA_X
ADDA,MOUSEDATA+1
MOVDATA_X,A
DDY:JBMOUSEDATA.5,DY;鼠标竖直前处理
MOVA,DATA_Y
ADDA,MOUSEDATA+2
MOVDATA_Y,A
DDZ:MOVA,MOUSEDATA+3;鼠标滚轮处理
JBACC.3,DZ
ANLA,#07H;滚轮数据加0-7
ADDA,DATA_Z
MOVDATA_Z,A
RETOUT:LCALLUPLCD
RET
;
DX:MOVA,MOUSEDATA+1;鼠标水平左处理
CPLA
ADDA,#01H
XCHA,DATA_X
SUBBA,DATA_X
MOVDATA_X,A
AJMPDDY
DY:MOVA,MOUSEDATA+2;鼠标竖直后处理
CPLA
ADDA,#01H
XCHA,DATA_Y
SUBBA,DATA_Y
MOVDATA_Y,A
AJMPDDZ
DZ:CPLA
ADDA,#01H
ANLA,#0FH;滚轮数据减1-8
XCHA,DATA_Z
SUBBA,DATA_Z
MOVDATA_Z,A
AJMPRETOUT
;
MAIN021:NOP;鼠标左键功能
CPLLAMP1;小灯亮灭操作
LJMPFUN1
MAIN022:NOP;鼠标右键功能
CPLLAMP2;小灯亮灭操作
LJMPFUN1
MAIN023:NOP;鼠标中键功能
CPLBEEP;蜂鸣器操作
LJMPFUN1
;
;
UPLCD:MOVA,DATA_Z;处理滚轮数据显示
LCALLBCD;十进制数分离
MOVA,#84H;显示在液晶的第一行第5个汉字位置
LCALLDATAUP;送LCD显示
MOVA,DATA_X;处理X坐标数据
LCALLBCD
MOVA,#91H;显示在第二行第2个汉字位置
LCALLDATAUP
MOVA,DATA_Y;处理Y坐标数据
LCALLBCD
MOVA,#94H;显示在第二行第5个汉字位置
LCALLDATAUP
RET
;
BCD:MOVB,#100
DIVAB
MOVDISDATA,A;百位数
MOVA,B
MOVB,#10
DIVAB
MOVDISDATA+1,A;十位数
MOVDISDATA+2,B;个位数
RET
;-----------------------------------------------
;PS/23D鼠标初始化程序
;返回值R7:0成功
;-----------------------------------------------
MSBYTEWAITTIMEAEQU04H
MSBYTEWAITTIMEBEQU0EH
MSBYTEWAITTIMECEQU040H
PS2_3DMOUSEINI:
PUSHPSW
PUSHACC
MOVA,R5
PUSHACC
MOVA,R6
PUSHACC
MOVR7,#0FFH;复位命令
LCALLPS2H2DSEND
MOVA,R7
JNZPS23DMS11O;PS/2通信不成功
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI11:JNBPS2CLK,PS23DMSI12
DJNZR7,PS23DMSI11
DJNZR6,PS23DMSI11
DJNZR5,PS23DMSI11
PS23DMS11O:LJMPMOUSE3DOUT
PS23DMSI12:LCALLPS2D2HRECEIVE
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI14:JNBPS2CLK,PS23DMSI15
DJNZR7,PS23DMSI14
DJNZR6,PS23DMSI14
DJNZR5,PS23DMSI14
LJMPMOUSE3DOUT
PS23DMSI15:LCALLPS2D2HRECEIVE
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI16:JNBPS2CLK,PS23DMSI17
DJNZR7,PS23DMSI16
DJNZR6,PS23DMSI16
DJNZR5,PS23DMSI16
LJMPMOUSE3DOUT
PS23DMSI17:LCALLPS2D2HRECEIVE
MOVA,R7
JNZPS23DMS21O;检查鼠标ID
MOVR7,#0F3H;SetSampleRate命令
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI21:JNBPS2CLK,PS23DMSI22
DJNZR7,PS23DMSI21
DJNZR6,PS23DMSI21
DJNZR5,PS23DMSI21
PS23DMS21O:LJMPMOUSE3DOUT
PS23DMSI22:LCALLPS2D2HRECEIVE
MOVR7,#0C8H;200
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI31:JNBPS2CLK,PS23DMSI32
DJNZR7,PS23DMSI31
DJNZR6,PS23DMSI31
DJNZR5,PS23DMSI31
PS23DMS31O:LJMPMOUSE3DOUT
PS23DMSI32:LCALLPS2D2HRECEIVE
MOVR7,#0F3H;SetSampleRate命令
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI41:JNBPS2CLK,PS23DMSI42
DJNZR7,PS23DMSI41
DJNZR6,PS23DMSI41
DJNZR5,PS23DMSI41
PS23DMS41O:LJMPMOUSE3DOUT
PS23DMSI42:LCALLPS2D2HRECEIVE
MOVR7,#064H;100
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI51:JNBPS2CLK,PS23DMSI52
DJNZR7,PS23DMSI51
DJNZR6,PS23DMSI51
DJNZR5,PS23DMSI51
PS23DMS51O:LJMPMOUSE3DOUT
PS23DMSI52:LCALLPS2D2HRECEIVE
MOVR7,#0F3H;SetSampleRate命令
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI61:JNBPS2CLK,PS23DMSI62
DJNZR7,PS23DMSI61
DJNZR6,PS23DMSI61
DJNZR5,PS23DMSI61
PS23DMS61O:LJMPMOUSE3DOUT
PS23DMSI62:LCALLPS2D2HRECEIVE
MOVR7,#050H;80
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI71:JNBPS2CLK,PS23DMSI72
DJNZR7,PS23DMSI71
DJNZR6,PS23DMSI71
DJNZR5,PS23DMSI71
PS23DMS71O:LJMPMOUSE3DOUT
PS23DMSI72:LCALLPS2D2HRECEIVE
MOVR7,#0F2H;ReadDeviceType命令
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI81:JNBPS2CLK,PS23DMSI82
DJNZR7,PS23DMSI81
DJNZR6,PS23DMSI81
DJNZR5,PS23DMSI81
PS23DMS81O:LJMPMOUSE3DOUT
PS23DMSI82:LCALLPS2D2HRECEIVE
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI83:JNBPS2CLK,PS23DMSI84
DJNZR7,PS23DMSI83
DJNZR6,PS23DMSI83
DJNZR5,PS23DMSI83
LJMPMOUSE3DOUT
PS23DMSI84:LCALLPS2D2HRECEIVE
MOVA,R7
CJNEA,#03H,PS23DMS91O;检测是否3D鼠标
MOVR7,#0E8H;SetResolution命令
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSI91:JNBPS2CLK,PS23DMSI92
DJNZR7,PS23DMSI91
DJNZR6,PS23DMSI91
DJNZR5,PS23DMSI91
PS23DMS91O:LJMPMOUSE3DOUT
PS23DMSI92:LCALLPS2D2HRECEIVE
MOVR7,#00H;1counts/mm
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSIA1:JNBPS2CLK,PS23DMSIA2
DJNZR7,PS23DMSIA1
DJNZR6,PS23DMSIA1
DJNZR5,PS23DMSIA1
PS23DMSA1O:LJMPMOUSE3DOUT
PS23DMSIA2:LCALLPS2D2HRECEIVE
MOVR7,#0E6H;Setscaling1:1
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSIB1:JNBPS2CLK,PS23DMSIB2
DJNZR7,PS23DMSIB1
DJNZR6,PS23DMSIB1
DJNZR5,PS23DMSIB1
PS23DMSB1O:LJMPMOUSE3DOUT
PS23DMSIB2:LCALLPS2D2HRECEIVE
MOVR7,#0F3H;SetSampleRate命令
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSIC1:JNBPS2CLK,PS23DMSIC2
DJNZR7,PS23DMSIC1
DJNZR6,PS23DMSIC1
DJNZR5,PS23DMSIC1
PS23DMSC1O:LJMPMOUSE3DOUT
PS23DMSIC2:LCALLPS2D2HRECEIVE
MOVR7,#028H;40
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSID1:JNBPS2CLK,PS23DMSID2
DJNZR7,PS23DMSID1
DJNZR6,PS23DMSID1
DJNZR5,PS23DMSID1
PS23DMSD1O:LJMPMOUSE3DOUT
PS23DMSID2:LCALLPS2D2HRECEIVE
MOVR7,#0F4H;EnableDevice命令
LCALLPS2H2DSEND
MOVR5,#MSBYTEWAITTIMEA
MOVR6,#MSBYTEWAITTIMEB
MOVR7,#MSBYTEWAITTIMEC
PS23DMSIE1:JNBPS2CLK,PS23DMSIE2
DJNZR7,PS23DMSIE1
DJNZR6,PS23DMSIE1
DJNZR5,PS23DMSIE1
PS23DMSE1O:LJMPMOUSE3DOUT
PS23DMSIE2:LCALLPS2D2HRECEIVE
MOVA,R7
CJNEA,#0FAH,MOUSE3DOUT
MOVR7,#00H
SJMPMOUSE3DOK
MOUSE3DOUT:MOVR7,#01H
MOUSE3DOK:POPACC
MOVR6,A
POPACC
MOVR5,A
POPACC
POPPSW
RET
;
;-----------------------------------------------
;3D鼠标数据接收程序
;参数R0(指针)
;返回值R7:0接受成功
;-----------------------------------------------
MOUSEDAWTIMEEQU200
THREEDMOUSER:
PUSHPSW
PUSHACC
SETBPS2CLK
MOVR7,#MOUSEDAWTIME
TDMR01:JNBPS2CLK,TDMR02
DJNZR7,TDMR01
INCR7
SJMPOUTTDMR
TDMR02:LCALLPS2D2HRECEIVE
MOVA,R7
MOV@R0,A
INCR0
MOVR7,#MOUSEDAWTIME
TDMR11:JNBPS2CLK,TDMR12
DJNZR7,TDMR11
INCR7
SJMPOUTTDMR
TDMR12:LCALLPS2D2HRECEIVE
MOVA,R7
MOV@R0,A
INCR0
MOVR7,#MOUSEDAWTIME
TDMR31:JNBPS2CLK,TDMR32
DJNZR7,TDMR31
INCR7
SJMPOUTTDMR
TDMR32:LCALLPS2D2HRECEIVE
MOVA,R7
MOV@R0,A
INCR0
MOVR7,#MOUSEDAWTIME
TDMR41:JNBPS2CLK,TDMR42
DJNZR7,TDMR41
INCR7
SJMPOUTTDMR
TDMR42:LCALLPS2D2HRECEIVE
MOVA,R7
MOV@R0,A
MOVR7,#00H
OUTTDMR:CLRPS2CLK
POPACC
POPPSW
RET
;
;-----------------------------------------------
;PS/2Host-to-DeviceCommunication(Send)
;参数在R7中
;返回值R7(0正确发送)
;-----------------------------------------------
PS2WATCHTIMEEQU50
PS2H2DSEND:
PUSHPSW
PUSHACC
MOVA,R6
PUSHACC
MOVA,R7;取参数
CLRPS2CLK;PS/2时钟线下拉
MOVR6,#00H;保持100uS以上
MOVR7,#02H
LCALLDELAY3D
CLRPS2DTL;数据线下拉
NOP
SETBPS2CLK;时钟线释放
MOVC,P;暂存奇偶校验位
CPLC;奇校验
MOVR7,#9
PS2SEND1:MOVR6,#PS2WATCHTIME
PS2SEND11:JNBPS2CLK,PS2SEND12;JBPS2CLK,$发送8位数据+奇偶校验位
DJNZR6,PS2SEND11
SJMPPS2SOUT
PS2SEND12:RRCA
MOVPS2DTL,C
MOVR6,#PS2WATCHTIME
PS2SEND14:JBPS2CLK,PS2SEND15;JNBPS2CLK,$
DJNZR6,PS2SEND14
SJMPPS2SOUT
PS2SEND15:DJNZR7,PS2SEND1
DECR7
MOVR6,#PS2WATCHTIME
PS2SEND21:JNBPS2CLK,PS2SEND22;JBPS2CLK,$发送停止位
DJNZR6,PS2SEND21
SJMPPS2SOUT
PS2SEND22:SETBPS2DTL
DECR7
MOVR6,#PS2WATCHTIME
PS2SEND23:JBPS2CLK,PS2SEND24;JNBPS2CLK,$
DJNZR6,PS2SEND23
SJMPPS2SOUT
PS2SEND24:MOVR6,#PS2WATCHTIME
DECR7
PS2SEND25:JNBPS2DTL,PS2SEND26;JBPS2DTL,$等待ACK
DJNZR6,PS2SEND25
SJMPPS2SOUT
PS2SEND26:MOVR6,#PS2WATCHTIME
DECR7
PS2SEND27:JNBPS2CLK,PS2SEND28;JBPS2CLK,$
DJNZR6,PS2SEND27
SJMPPS2SOUT
PS2SEND28:MOVR6,#PS2WATCHTIME
DECR7
PS2SEND29:JBPS2CLK,PS2SEND2A;JNBPS2CLK,$
DJNZR6,PS2SEND29
SJMPPS2SOUT
PS2SEND2A:MOVR6,#PS2WATCHTIME
DECR7
PS2SEND2B:JBPS2DTL,PS2SEND2C;JNBPS2DTL,$
DJNZR6,PS2SEND2B
SJMPPS2SOUT
PS2SEND2C:MOVR7,#00H
PS2SOUT:POPACC
MOVR6,A
POPACC
POPPSW
RET
;
;-----------------------------------------------
;PS/2Device-to-HostCommunication(Receive)
;返回值在R7中
;Cy为数据有效标志1正确,0错误
;-----------------------------------------------
PS2D2HRECEIVE:
PUSHACC
PUSHB
MOVA,R6
PUSHACC
MOVR6,#PS2WATCHTIME
PS2RECEI01:JNBPS2CLK,PS2RECEI02;JBPS2CLK,$PS2CLK为PS/2时钟线
DJNZR6,PS2RECEI01
CLRC
SJMPPS2REXIT
PS2RECEI02:MOVC,PS2DTL;检查起始位是否为0
CPLC
JNCPS2REXIT;起始位错误
MOVR6,#PS2WATCHTIME
PS2RECEI03:JBPS2CLK,PS2RECEI04;JNBPS2CLK,$
DJNZR6,PS2RECEI03
CLRC
SJMPPS2REXIT
PS2RECEI04:MOVR7,#9
PS2REC1:RRCA;接收8位数据+奇偶校验位
MOVR6,#PS2WATCHTIME
PS2RECEI11:JNBPS2CLK,PS2RECEI12;JBPS2CLK,$等待时钟下降沿
DJNZR6,PS2RECEI11
CLRC
SJMPPS2REXIT
PS2RECEI12:MOVC,PS2DTL
MOVR6,#PS2WATCHTIME
PS2RECEI14:JBPS2CLK,PS2RECEI15;JNBPS2CLK,$
DJNZR6,PS2RECEI14
CLRC
SJMPPS2REXIT
PS2RECEI15:DJNZR7,PS2REC1
MOVR7,A
MOVB.0,C;奇校验
MOVC,P
MOVACC.0,C
XRLA,B
MOVC,ACC.0
JNCPS2REXIT;奇偶校验错误
MOVR6,#PS2WATCHTIME
PS2RECEI16:JNBPS2CLK,PS2RECEI17;JBPS2CLK,$检测停止位
DJNZR6,PS2RECEI16
CLRC
SJMPPS2REXIT
PS2RECEI17:MOVC,PS2DTL
JNCPS2REXIT;停止位错误
MOVR6,#PS2WATCHTIME
PS2RECEI18:JBPS2CLK,PS2RECEI19;JNBPS2CLK,$
DJNZR6,PS2RECEI18
CLRC
SJMPPS2REXIT
PS2RECEI19:
PS2REXIT:POPACC
MOVR6,A
POPB
POPACC
RET
;
;
;-----------------------------------------------
;延时100机器周期参数(1~65535)
;参数传递R6R7
;-----------------------------------------------
DELAY3D:PUSHPSW;2
PUSHACC;2
MOVA,R5;1
PUSHACC;2
MOVA,R7;1
JZDELA1;2
INCR6;1
DELA1:MOVR5,#50D;2
DJNZR5,$;2
DJNZR7,DELA1;2
DJNZR6,DELA1;2
POPACC;2
MOVR5,A;1
POPACC;2
POPPSW;2
RET;2
;
;===============================================
;以下液晶开机显示程序
;A中为写入字位置
DATAUP:
LCALLWRITE_COM
MOVR1,#DISDATA;将#DISDATA数据查出字码写入LCD
MOVDPTR,#TABLE1
MOVR2,#03H;查3
MOVA,#00H
MOVCLOP:MOVA,@R1
MOVCA,@A+DPTR
LCALLWRITE_DAT
INCR1
DJNZR2,MOVCLOP;
RET
;
;开机显示画面
LOGON: MOVA,#80H ;第一行左第一个字开始
LCALLWRITE_COM
MOVDPTR,#CHINESE;WORD1616点阵TEST
LCALLWRITE_HZ
MOVA,#90H ;第二行左第一个字开始
LCALLWRITE_COM
MOVDPTR,#CHINESE1;WORD1616点阵TEST
LCALLWRITE_HZ
CLRLAMPBLAK;开背光灯
LCALLDELAY5S;显示5秒
SETBLAMPBLAK;关背光灯
;
MOVA,#80H ;第一行左第一个字开始
LCALLWRITE_COM
MOVDPTR,#CHINESE2;WORD1616点阵TEST
LCALLWRITE_HZ
MOVA,#90H ;第二行左第一个字开始
LCALLWRITE_COM
MOVDPTR,#CHINESE3;WORD1616点阵TEST
LCALLWRITE_HZ
RET
;初始化程序
SETUP:LCALLDELAY
LCALLDELAY
LCALLDELAY
LCALLDELAY
MOVA,#01H ;CLEARDISPLAY
LCALLWRITE_COM
MOVA,#00110000B ;FUNCTIONSETTING
LCALLWRITE_COM
MOVA,#00000010B ;DDRAMSETTO''00H''
LCALLWRITE_COM
MOVA,#00000100B ;
LCALLWRITE_COM
MOVA,#00001100B ;DISPLAYON
LCALLWRITE_COM
MOVA,#00000001B ;CLEARINGSCREEN
LCALLWRITE_COM
MOVA,#10000000B ;SETDDRAMADDRESS
LCALLWRITE_COM
LCALLDELAY
LCALLDELAY
LCALLDELAY
LCALLDELAY
RET
;串行命令写入子程序
;写入命令字在A中
WRITE_COM:
LCALLDELAY1 ;
SETBCS
PUSHACC
MOVR0,#8
MOVA,#11111000B
COMM1:
CLRC
RLCA
MOVSID,C
CLRSCLK
SETBSCLK
DJNZR0,COMM1
POPACC
MOVR5,A
ANLA,#0F0H
MOVR0,#8
COMM2: CLRC
RLCA
MOVSID,C
CLRSCLK
SETBSCLK
DJNZR0,COMM2
MOVA,R5
SWAPA
ANLA,#0F0H
MOVR0,#8
COMM3: CLRC
RLCA
MOVSID,C
CLRSCLK
SETBSCLK
DJNZR0,COMM3
CLRCS
RET
;
;串行数据写入子程序
;写入数据字在A中
WRITE_DAT:
LCALLDELAY1
SETBCS
PUSHACC
MOVR0,#8
MOVA,#11111010B
DATA1: CLRC
RLCA
MOVSID,C
CLRSCLK
SETBSCLK
DJNZR0,DATA1
POPACC
MOVR5,A
ANLA,#0F0H
MOVR0,#8
DATA2: CLRC
RLCA
MOVSID,C
CLRSCLK
SETBSCLK
DJNZR0,DATA2
MOVA,R5
SWAPA
ANLA,#0F0H
MOVR0,#8
DATA3: CLRC
RLCA
MOVSID,C
CLRSCLK
SETBSCLK
DJNZR0,DATA3
CLRCS
RET
;
;延时子程序
;0.544ms
DELAY1:
MOVR7,#010H
D11: MOVR6,#010H
DJNZR6,$
DJNZR7,D11
RET
;0.13s
DELAY:
MOVR1,#00H
D2: MOVR2,#00H
DJNZR2,$
DJNZR1,D2
RET
;5.2s
DELAY5S:MOVR3,#28H
DE5S:LCALLDELAY
DJNZR3,DE5S
RET
DELAY1S:MOVR3,#9
DE1S:LCALLDELAY
DJNZR3,DE1S
RET
;
;168点阵字写入子程序共16个
WRITE_ASCII:
MOVR4,#16
DDDD: CLRA
MOVCA,@A+DPTR
LCALLWRITE_DAT
INCDPTR
DJNZR4,DDDD
RET
;168点阵字写入子程序共7个
WRITE_ASCII7:
MOVR4,#7
DDDD7: MOVA,@R0
LCALLWRITE_DAT
INCR0
DJNZR4,DDDD7
RET
;1616点阵汉字写入子程序共7个
WRITE_HZ: ;WRITE7CHINESETOLCD
MOVR4,#7
DD: CLRA
MOVCA,@A+DPTR
INCDPTR
LCALLWRITE_DAT
CLRA
MOVCA,@A+DPTR
INCDPTR
LCALLWRITE_DAT
DJNZR4,DD
RET
;1616点阵汉字写入子程序共2个
WRITE_HZ2: ;WRITE8CHINESETOLCD
MOVR4,#2
DD4: CLRA
MOVCA,@A+DPTR
INCDPTR
LCALLWRITE_DAT
CLRA
MOVCA,@A+DPTR
INCDPTR
LCALLWRITE_DAT
DJNZR4,DD4
RET
;
;168点阵的字符代码表
TABLE1:DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH,20H
;0123456789:;<=>"不显"
;自造字符地址表
;
;"这里是1616点阵的汉字代码表"
CHINESE:DB"浙江海洋学院—"
CHINESE1:DB"单片机实验室"
CHINESE2:DB"滚轮(Z):"
CHINESE3:DB"X:Y:"
;;;;;;;;;;;;;;;;;;;;;;
END
浙江海洋学院东海科学技术学院本科生毕业论文
I
浙江海洋学院东海科学技术学院本科生毕业论文
25
26
26
39
图1.1STC89C52RC单片机引脚图
表2.2模块串口接口的外部接口信号
图2.1PS/2鼠标接口连接器的引脚定义
表2.1鼠标发送的数据包格式
MCU
LCD
PS/2
鼠标
VCCcc+5V
DATAI/O
GNDGND
数据线
控制线
CLOCK/INT
图2.2硬件原理框图
主程序开始
LCD初始化,显示开机画面
3D鼠标初始化
鼠标功能子程序
液晶显示子程序
主程序结束返回
图3.1主程序流程图
这三步发起始位0
这四步发8位数据
位及1位奇隅位
这三步发停止位1
这四步确认设备回答信号(ACK)
图3.2主机到设备的通讯过程
Y
子程序结束并返回
N
Y
N
子程序开始
拉低鼠标器时钟线至少100us
迫使鼠标进入接收命令状态
发送起始位之后释放失重线
鼠标串行送出时钟信息
鼠标串行发送数据
鼠标是否送出应答位
鼠标是否将时钟、数据线都释放
图3.3单片机发送命令字到鼠标子程序流程图
图3.4鼠标设备到主机的通讯
这三步
发起始
位0
这三步读8位数
据及1位奇隅校
验位
Y
Y
Y
Y
Y
Y
N
N
N
N
N
N
从鼠标读取4个字节的数据经处理后存放到读取缓冲区
是否滚球滚动(X,Y方向位移偏移量)
是否中间滚轮滚动
鼠标中间的滚轮是否按键按下
鼠标右键是否按下
鼠标左键是否按下
鼠标按键弹起等其他信息
XY位移量在LCD
液晶屏幕上显示
根据滚轮滚动的方向增/减数送入LCD显示并送入查表指针
蜂鸣器响
小灯1亮
小灯2亮
解释并进行相应的处理
子程序开始
子程序结束返回
图3.5为单片机从鼠标读取数据程序流程图
Y
N
N
Y
子程序开始
等待鼠标发送自检通过信息(AAH,00H)
向鼠标发送启用三键模式命令字
鼠标启用三键模式成功否
向鼠标发送设置、启用命令字
鼠标启用三键模式成功否
子程序结束并返回
非三键鼠标,转入出错处理子程序
非三键鼠标,转入出错处理子程序
N
图3.6单片机对鼠标初始化流程图
初始化设定结束
延迟时间超过37us
电源开启
延迟时间超过40ms
延迟时间超过100us
图3.712232F液晶显示初始化流程图
|
|