宁夏大学本科毕业设计基于单片机的简易计算器的设计_第1页
宁夏大学本科毕业设计基于单片机的简易计算器的设计_第2页
宁夏大学本科毕业设计基于单片机的简易计算器的设计_第3页
宁夏大学本科毕业设计基于单片机的简易计算器的设计_第4页
宁夏大学本科毕业设计基于单片机的简易计算器的设计_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 2017届本科毕业设计题 目:基于单片机的简易计算器的设计 类 型:设计 论文学 院: 机械工程学院 专 业: 机械工程及自动化 年 级: 2013级 学生学号: 12013243606 学生姓名: 邱智信 指导教师: 梁云峰 2017 年 5 月 14 日摘 要单片机是采用超大规模集成电路技术,把一台计算机的主要部件集成在一个芯片上所构成的一种集成电路芯片,因此单片机被称为单片微型计算机。因为单片机体积小,价格经济,可靠性高,适用领域宽广以及其本身的指令系统等优势,在各个行业,各个领域方面得到了广泛应用。本设计就是依据单片机的原理来进行简单的计算器设计的。本设计采用STC89C52RC单片

2、机为核心,输入采用4*4矩阵键盘,采用LCD1602液晶显示屏显示操作过程及结果。实现简单的四则运算。采用C语言编程,keil uVision4和STC_ISP_V4.80软件向单片机开发板内部烧写程序,进行硬件调试。关键字:单片机;矩阵键盘;LCD1602;计算器AbstractMicrocontroller is the use of ultra-large-scale integrated circuit technology, a computer's main components integrated in a chip formed by an integrated ci

3、rcuit chip, so the microcontroller is called single-chip microcomputer. Because of the small size of the microcontroller, the price economy, high reliability, wide field of application and its own command system and other advantages, in various industries, various fields have been widely used.The de

4、sign is based on the principle of the microcontroller to carry out a simple calculator design. The design uses STC89C52RC microcontroller as the core, the input using 4 * 4 matrix keyboard, LCD1602 LCD display operation process and results. To achieve a simple four operations. Using C language progr

5、amming, keil uVision4 and STC_ISP_V4.80 software to the microcontroller development board internal programming procedures for hardware debugging.Key words: Microcontroller; matrix keyboard; LCD1602; calculator目 录第一章 绪论11.1单片机的工作原理11.2 本论文研究的目的和意义11.3 计算器的发展简史2第二章 设计原理及要求32.1 设计方案的确定32.2 系统的设计方案32.3

6、系统的设计要求32.3.1 优化硬件电路42.3.2 可靠性及抗干扰设计42.3.3 灵活的功能扩展4第三章 硬件模块的设计53.1 单片机STC89C52RC53.1.1 STC89C52RC单片机的特点53.1.2 管脚说明63.1.3 振荡器特性73.2 矩阵键盘模块83.3 LCD1602显示模块83.3.1 显示电路93.3.2 LCD1602主要技术参数103.3.3 引脚功能说明103.4 硬件接线图11第四章 软件设计及调试134.1 程序设计134.1.1 功能介绍134.1.2 主模块功能的设计134.1.3 键盘扫描模块程序的设计144.1.4 运算模块程序的设计174.

7、1.5 显示模块程序的设计184.2 编写程序194.2.1 keil软件介绍194.2.2 编写程序224.3 程序调试354.3.1 生成HEX文件354.3.2 下载HEX至开发板进行调试36第五章 结论38参考文献39致谢40机械工程学院 宁夏大学本科毕业设计第一章 绪论1.1单片机的工作原理单片机由运算器、控制器、存储器、输入输出设备构成。 单片机自动完成赋予它的任务的过程,也就是单片机执行程序的过程,即一条条执行的指令的过程,所谓指令就是把要求单片机执行的各种操作用的命令的形式写下来,这是在设计人员赋予它的指令系统所决定的,一条指令对应着一种基本操作;单片机所能执行的全部指令,就是

8、该单片机的指令系统,不同种类的单片机,其指令系统亦不同。为使单片机能自动完成某一特定任务,必须把要解决的问题编成一系列指令(这些指令必须是选定单片机能识别和执行的指令),这一系列指令的集合就成为程序,程序需要预先存放在具有存储功能的部件存储器中。存储器由许多存储单元(最小的存储单位)组成,就像大楼房有许多房间组成一样,指令就存放在这些单元里,单元里的指令取出并执行就像大楼房的每个房间的被分配到了唯一一个房间号一样,每一个存储单元也必须被分配到唯一的地址号,该地址号称为存储单元的地址,这样只要知道了存储单元的地址,就可以找到这个存储单元,其中存储的指令就可以被取出,然后再被执行。程序通常是顺序执

9、行的,所以程序中的指令也是一条条顺序存放的,单片机在执行程序时要能把这些指令一条条取出并加以执行,必须有一个部件能追踪指令所在的地址,这一部件就是程序计数器PC(包含在CPU中),在开始执行程序时,给PC赋以程序中第一条指令所在的地址,然后取得每一条要执行的命令,PC在中的内容就会自动增加,增加量由本条指令长度决定,可能是1、2或3,以指向下一条指令的起始地址,保证指令顺序执行。1.2 本论文研究的目的和意义计算器为人们的学习、生活提供了很大的便利,市场大,应用范围广,是办公应用不可缺少的器件。常见的计算其类型有:算数型计算器,能够进行加减乘除等简单的四则运算。科学型计算器,能够进行指数、对数

10、、平方、开方等的运算。程序计算器,可进行编程将较复杂的运算步骤存储起来,再进行多次运算。一般的计算器包括显示部分(显示器)、键盘、存储、控制等。分利用硬件和软件设计的计算器更为实用,同时也是电子领域的一个重要课题。1.3 计算器的发展简史算筹、算盘是人类最早使用的手动计算工具,最早的计算工具诞生于中国。中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。这种算筹多使用竹子制成,也有用木头,兽骨来充当材料的约二百七十枚一束,放在布袋里可随身携带。直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项重要发明,明代时使用的珠算盘已经与现代的珠算盘几乎完全一样。17 世纪初,西方国家的计算工具有

11、了比较大的发展,英国数学家纳皮尔发明了"纳皮尔算筹",英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方等运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。第二章 设计原理及要求2.1 设计方案的确定本设计是以STC89C52RC单片机为核心进行简易计算器的设计,通过芯片STC89C52RC编程实现计算器的加减乘除(整除)但不能连加连减等连续计算的的简单计算功能。本次设计的运算模块由STC89C52RC单片机实现,数据输入模块由4*4矩阵键盘实现,

12、输出数据模块由LCD1602液晶显示屏显示电路实现,再外加一个晶振电路和一个复位电路即可完成整个简易计算器的设计。2.2 系统的设计方案本设计由以下几部分组成: STC89C52RC单片机系统(运算模块) 、键盘电路、显示电路、晶振电路和复位电路构成,计算器系统框图如图2.1所示。图2.1 计算器系统框图2.3 系统的设计要求为了更好的实现系统的功能,硬件电路的设计应该遵循以下原则:2.3.1 优化硬件电路采用软件与硬件设计相互结合的方法。虽然采用软件来实现一些硬件功能,可能会比单纯使用硬件的相应时间要长,而且还需要占用微处理器的时间,但是使用软件来实现硬件功能可简化硬件结构,提高电路的可靠性

13、。因此,在设计过程中,在满足可靠性和时效性的前提下,应尽量采用软件来实现硬件功能。2.3.2 可靠性及抗干扰设计根据可靠性设计理论,系统所使用的芯片数量越少,则系统的无故障时间越长。并且,芯片数量越少,地址和数据总线在电路板上受干扰的几率就越小。因此,应该在满足功能的前提下,尽量使用少的芯片。2.3.3 灵活的功能扩展功能扩展是否灵活是衡量一个系统优劣的重要指标之一。一次设计往往不能完全考虑到系统的各个方面,系统需要不断完善以及进行功能升级。进行功能扩展时,应该在原有设计的基础上,通过修改软件程序和少量硬件完成。对于本系统而言,就是要求在系统硬件不变的情况下,能够通过修改软件程序,完成功能的升

14、级和扩展。根据提出的系统设计方案,结合以上三条原则,确定了系统硬件的设计。计算器主要由以下一些功能模块组成: 矩阵键盘模块、运算模块(单片机内部)和LCD液晶显示模块等。本系统的硬件设计采用模块设计的方法。LCD1602液晶显示屏,4*4矩阵键盘以及STC89C52RC单片机为整个系统的核心,来实现简易计算器的功能。简易计算器主要包括:矩阵键盘电路,运算电路以及输出显示电路。第三章 硬件模块的设计在简易计算机的系统设计中主要用到的硬件:STC89C52RC单片机,LCD1602液晶显示屏以及4*4矩阵键盘。3.1 单片机STC89C52RC本次设计采用STC89C52RC单片机,它兼容于MCS

15、51系列单片机,STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C52的引脚图如3.1所示图3.1 STC89C52RC引脚图3.1.1 STC89C52RC单片机的特点STC89系列单片机是MCS-51系列单片机的派生产品,它们在指令系统、硬件结构和片内资源上与标准的8051单片机完全兼

16、容。它的特点如下:1.80C51核心处理单元2.64/32/16/8KB片内Flash ROM,具有在应用可编程(IAP)、在系统可编程(ISP)的功能,可实现远程软件升级,无需编程器。3.1K字节RAM4.双DPTR数据指针5.支持12时钟或6时钟模式6.4个8位I/O口,P1口、P2口、P3口可直接驱动LED7.SPI(串行外接接口)和增强型UART8.有PCA(可编程计数器阵列),具有PWM的捕获/比较功能9.3个16位定时器/计数器10.可编程看门狗定时器11.低EMI方式(ALE禁止)12.兼容TTL和COMS逻辑电平13.掉电模式和低功耗模式14.全静态操作0Hz-24Hz3.1.

17、2 管脚说明Vss(20脚):接地电源。P0口(39脚-32脚):P0.0-P0.7。当不接外部存储器,也不扩展I/O接口时,它可作为准双向8位输入/输出接口。当接有外部存储器或扩展I/O接口时,P0口为地址/数据分时复用端口。它分时VCC(40脚):接+5V电源正端。提供8位地址信息和8位双向数据信息。 P1口(1脚-8脚):P1.0-P1.7,P1口是一个带内部提供上拉电阻的8位准双向I/O口,在FLASH编程和校验时,P1口作为第八位地址接收。P2口(21脚-28脚):P2.0-P2.7,可作为普通准双向I/O接口。当构成系统总线时,P2口作为高8位地址总线,传送高8位地址信息。 P3口

18、(10脚-17脚):P3.0-P3.7,P3位双功能端口,可以作为一般的准双向I/O接口使用,而每一位都具有第2功能,并且P3口的每一条引脚均可独立定义第1功能的输入/输出或第2功能。第2功能: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口同时为

19、闪烁编程和编程校验接收一些控制信号。RST(9脚):复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG(30脚):地址锁存允许信号,当访问外部存储器时,在每个机器周期内ALE信号会出现两个正脉冲,用于锁存出现在P0口的低8位地址信息,在不访问外部存储器时,ALE端仍以上述频率(振荡器频率的1/6)周期性的输出正脉冲信号,此信号可作为外部其他部件的时钟脉冲或用于定时目的。 /PSEN(29脚):片外程序存储器读选通信号输出端,低电平有效。当从外部存储器读取指令或读取常数期间,每个机器周期PSEN两次有效。访问外部数据存储器期间,PSEN信号将不出现。/EA(3

20、1脚):EA为访问外部程序存储器控制信号,低电平有效。当EA为高电平时,单片机访问片内程序存储器4KB(52系列为8KB),若超出此范围,自动转去执行外部程序存储器的程序。当EA端为低电平时,无论片内有无程序存储器,均只访问外部程序存储器。 XTAL1(19脚):外接石英晶体振荡器的一端。XTAL2(18脚):外接石英晶体振荡器的另一端。3.1.3 振荡器特性XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但

21、必须保证脉冲的高低电平要求的宽度。3.2 矩阵键盘模块在计算器使用过程中,输入数字和其他功能是要用到很多次按键,如果用独立按键,虽然变成会简单很多,但是要占用大量I/O口资源,所以一般都不采用这种方式,而是采用矩阵键盘。矩阵键盘采用四条I/O口作为行线,四条I/O口作为列线,在行线与列线的每个交叉点上设置一个按键。这样使用8个I/O口便可实现4*4的矩阵键盘,可以有效地提高I/O口的利用率。键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键( 20个以上)和专用驱动芯片的组合;当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。通用计算机使用的键盘就是

22、编码键盘。在智能仪器中,使用并行接口芯片8279或串行接口HD7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可在芯片资料中得到。当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。而非编码键盘成本低廉。从简易和成本角度出发,本设计选用的是非编码键盘。如图3.2 所示。一般由16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。图3.2 矩阵键盘内部电路3.3 LCD1602显示模块本设计采用LCD液晶显示器来显示输入输出数据。通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相

23、应数据。LCD引脚图如图3.4所示。图3.4 LCD1602引脚图LCD分为带背光和不带背光两种,带背光比不带背光的厚,在实际使用中是否带背光差别不大,在本设计中采用带背光LCD,量和尺寸差别如图3.5所示。图3.5 LCD带背光与不带背光尺寸对比图3.3.1 显示电路当系统需要显示少量数据时,采用LCD液晶显示屏是一种经济实用的方法。P0口作为液晶显示的数据端口,P1.0、P1.1以及P1.5三个口作为其控制端,控制LCD液晶显示屏显示输出数据。显示电路图如图3.6所示。图3.6 LCD显示电路图3.3.2 LCD1602主要技术参数显示容量:16×2个字符芯片工作电压:4.5-5

24、.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm3.3.3 引脚功能说明LCD采用标准的14脚(无背光)或16脚(有背光)接口,各引脚接口说明如表3.1所示。表3.1 LCD1602引脚接口说明表编号符号引脚说明1VSS电源接地2VDD电源正极3VEE液晶显示偏压4RS数据/命令选择5R/W读/写选择表3.1续表编号符号引脚说明6E使能信号78D0D1数据数据9D2数据10D3数据11D4数据12D5数据13D6数据14D7数据15BLA背光源正极16BLK背光源负极第1脚:VSS为地电源。第2脚:VDD接+5V电源

25、。第3脚:VEE为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:数据/命令选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。第5脚:R/W为读/写选择端,高电平进行读操作,低电平进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平、R/W为高电平时可以读忙信号,当RS为高电平、R/W为低电平时可以写入数据。第6脚:E端为使能端,当E为高电平时,读取液晶模块信息,当E端由高电平跳变成低电平时,液晶模块执行写操作。第714脚:D0D7为8位双向数据线。第15脚:背光源

26、正极。第16脚:背光源负极。3.4 硬件接线图本设计的硬件接线图如图3.7所示。图3.7 硬件接线图第四章 软件设计及调试本设计需要单片机硬件电路及软件编程相结合,在单片机的应用系统程序设计时,常用的是汇编语言和C语言。本设计采用C语言进行程序的编写。C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备了汇编语言的功能。C语言是为了能够胜任系统程序设计的要求而开发的,因此具有很强的表达能力,能够用于描述系统软件各方面的特性。它具有较高的可移植性,提供了种类丰富的运算符和数据类型,极大地方便了程序设计。同时它具有丰富的库函数、运算速度快、编译效率高,且可以直接实现对系统硬件的控制。

27、它具有完善的模块程序结构,因此在软件开发中可以采用模块化程序设计方法。目前,使用C语言进行程序设计以成为软件开发的主流。在软件程序编写完成后用硬件调试法调试。4.1 程序设计第一步先进行简易计算器的程序设计。4.1.1 功能介绍本次设计的简易计算器,其功能主要如下:1.键盘输入;2.显示数值;3.加、减、乘、除(整除)四则运算;4.不能进行连续运算。4.1.2 主模块功能的设计主模块是系统软件的主框架。结构化程序设计一般有“自上而下”和“自下而上”两种方式,“自上而下”法的核心救世主框架的构建。它的合理与否关系到程序最终功能实现的多少与好坏。本设计的主要功能是计算器。在软件设计中程序分别要完成

28、键盘输入检测、LCD初始化及显示、算术运算和错误处理及输出等功能。对主程序进行初始化,其他的程序选择模块式的方式。首先对每个模块进行调试,当模块调试成功后,逐一地加入主程序中,最后完成整个软件部分的设计。本设计的主模块的程序流程图如图4.1所示。图4.1 系统流程图4.1.3 键盘扫描模块程序的设计我们在使用按键的时候有这样一种使用经验,当需要多个按键的时候,如果做成独立按键会大量占用IO 口,因此我们引入了矩阵按键,使用了8个IO 口来实现16个按键。键盘扫描子程序应具有以下功能:1.判断有无键按下,若有则计算键值。其方法为:行输出口输出全为0,读列输出口信息,若列值为全1,则说明无键按下;

29、若不全为1,则说明有键按下,并计算键值。2.消除按键的抖动。在按键的使用过程中,通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动,如图4.2 所示。图4.2 按键抖动状态图按键稳定闭合时间长短是由操作人员决定的,通常都会在100ms 以上,刻意快速按的话能达到40-50ms 左右,很难再低了。抖动时间是由按键的机械特性决定的,一般是都会在10ms 以下,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理。当检测到按键状态变化

30、时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理。按键消抖可分为硬件消抖和软件消抖。硬件消抖就是在按键上并联一个电容,如图4.3所示,利用电容的充放电特性来对动过程中产生的电压毛刺进行平滑处理,从而实现消抖。但实际应用中,这种方式的效果往往不是很好,而且还增加了成本和电路复杂度。所以实际中使用的并不多。图4.3 电容消抖3.判断按键是否释放。计算出闭合键的键值后,在判断按键是否释放。若按键未释放则等待;若键已释放,则再延时消抖。4.命令处理。根据闭合键的键值,程序应该完成该键所设定的功能。键盘扫描模块程序的流程图如图4.4所示。图4.4 键盘扫描模块程序流程图4.1.4 运算模块程

31、序的设计在此模块中要实现“加”、“减”、“乘”、“除”四种整数的运算,我们需要定义三个数:a,b,c,类型为长整形(-2147483648+2147483648);其中a为第一个数,b为第二个数,c为两数运算的结果。在本次设计中不考虑溢出。运算模块流程图如图4.5所示。图4.5 运算模块流程图4.1.5 显示模块程序的设计在本设计中,LCD1602液晶只显示字符,不需要显示汉字或图形,且需要显示的字符在LCD1602液晶模块内置的字符发生存储器里都有,在编写程序时,只需要查表就可得到相应字符的代码。显示程序的流程图如图4.6所示。 图4.6 显示模块流程图4.2 编写程序4.2.1 keil软

32、件介绍编写程序我们会用到Keil软件。对于单片机程序来说,每个功能程序,都必须要有一个配套的工程文件(Project),因此我们首先要新建一个工程,打开我们的Keil 软件后,点击:Project->New uVision Project.然后会出现一个新建工程的界面,如图4.7 所示。图4.7 新建工程界面然后保存到我们已经建好的文件夹内,系统会自动保存成计算器.uvproj文件。下一步选择单片机型号,选择Intel公司名下的80/87C52来代替STC89C52RC单片机。确定之后建立编写代码的文件,点击,点击File->New,新建一个文件,也就是我们编写程序的平台。然后点F

33、ile->Save 或者直接点击那个Save 的快捷键,可以保存文件并且命名为计算器.C,这个地方必须加上.C 了,因为如果写汇编语言,这个地方的扩展名是.ASM,头文件就是.H 等等,我们编写的是C语言程序,这个地方必须自己添加文件的扩展名.C,如图4.8 所示。图4.8 保存文件然后把文件添加到所建立的工程中去,鼠标右键点Source Group 1,点Add Files to GroupSource Group 1,如图4.9所示。图4.9 添加文件接下来就可以编写多.C程序文件了,分别保存三个.C文件,分别是LCD1602.C;Keyboard.C;main.c。4.2.2 编写

34、程序/*LCD1602.c 文件程序代码*/#include <reg52.h>#define LCD1602_DB P0sbit LCD1602_RS = P10;sbit LCD1602_RW = P11;sbit LCD1602_E = P15;void LcdWaitReady() /等待液晶准备好unsigned char sta;LCD1602_DB = 0xFF;LCD1602_RS = 0;LCD1602_RW = 1;doLCD1602_E = 1;sta = LCD1602_DB; /读取状态字LCD1602_E = 0; while (sta & 0x

35、80); /bit7 等于1 表示液晶正忙,重复检测直到其等于0 为止void LcdWriteCmd(unsigned char cmd) /写入命令函数LcdWaitReady();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD1602_E = 1;LCD1602_E = 0;void LcdWriteDat(unsigned char dat) /写入数据函数LcdWaitReady();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_E = 1;LCD1602_E = 0

36、;void LcdShowStr(unsigned char x, unsigned char y, const unsigned char *str) /显示字符串,屏幕起始坐标(x,y),字符串指针strunsigned char addr;/由输入的显示坐标计算显示RAM 的地址if (y = 0)addr = 0x00 + x; /第一行字符地址从0x00 起始elseaddr = 0x40 + x; /第二行字符地址从0x40 起始/由起始显示RAM 地址连续写入字符串LcdWriteCmd(addr | 0x80); /写入起始地址while (*str != '0'

37、;) /连续写入字符串数据,直到检测到结束符LcdWriteDat(*str);str+;void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len) /区域清除,清除从(x,y)坐标起始的len 个字符位unsigned char addr;/由输入的显示坐标计算显示RAM 的地址if (y = 0)addr = 0x00 + x; /第一行字符地址从0x00 起始elseaddr = 0x40 + x; /第二行字符地址从0x40 起始/由起始显示RAM 地址连续写入字符串LcdWriteCmd(addr |

38、0x80); /写入起始地址while (len-) /连续写入空格LcdWriteDat(' ');void LcdFullClear()LcdWriteCmd(0x01); /清屏void LcdInit() /液晶初始化函数LcdWriteCmd(0x38); /16*2 显示,5*7 点阵,8 位数据接口LcdWriteCmd(0x0C); /显示器开,光标关闭LcdWriteCmd(0x06); /文字不动,地址自动+1LcdWriteCmd(0x01); /清屏LcdShowStr(15, 1, "0");/在右下角显示0/*keyboard.c

39、 文件程序代码*/#include <reg52.h>sbit KEY_IN_1 = P24; /矩阵按键的扫描输入引脚1sbit KEY_IN_2 = P25; /矩阵按键的扫描输入引脚2sbit KEY_IN_3 = P26; /矩阵按键的扫描输入引脚3sbit KEY_IN_4 = P27; /矩阵按键的扫描输入引脚4sbit KEY_OUT_1 = P23; /矩阵按键的扫描输出引脚1sbit KEY_OUT_2 = P22; /矩阵按键的扫描输出引脚2sbit KEY_OUT_3 = P21; /矩阵按键的扫描输出引脚3sbit KEY_OUT_4 = P20; /矩阵按

40、键的扫描输出引脚4const unsigned char code KeyCodeMap44 = /矩阵按键编号到PC 标准键盘键码的映射表 '1', '2', '3', 0x26 , /数字键1、数字键2、数字键3、+ '4', '5', '6', 0x25 , /数字键4、数字键5、数字键6、- '7', '8', '9', 0x28 , /数字键7、数字键8、数字键9、* 0x1B, '0', 0x0D, 0x27 / 归零键、数

41、字键0、回车键、/;unsigned char pdata KeySta44 = /全部矩阵按键的当前状态1, 1, 1, 1,1, 1, 1, 1,1, 1, 1, 1,1, 1, 1, 1;unsigned char step = 0; /操作步骤unsigned char oprt = 0; /运算类型signed long num1 = 0; /操作数1signed long num2 = 0; /操作数2signed long result = 0; /运算结果extern void LcdFullClear();extern void LcdShowStr(unsigned cha

42、r x, unsigned char y, const unsigned char *str);extern void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len);unsigned char NumToString(unsigned char *str, signed long num) /整型数转换为字符串,字符串指针str,待转换数num,返回值为字符串长度unsigned char i, len;unsigned char buf12;if (num < 0) /如果为负数,则首先输出符号到指针

43、上,并取其绝对值*str = '-'str+;num = -num;i = 0; /先转换为低位在前的十进制数组do bufi = num % 10;num /= 10;i+; while (num > 0);len = i; /i 最后的值就是有效字符的个数while (i > 0) /然后将数组值转换为ASCII 码反向拷贝到接收指针上i-;*str = bufi + '0'str+;return len; /返回转换后的字符串长度void ShowOprt(unsigned char y, unsigned char type) /显示运算符,

44、显示位置y,运算符类型typeswitch (type)case 0: LcdShowStr(0, y, "+"); break;case 1: LcdShowStr(0, y, "-"); break;case 2: LcdShowStr(0, y, "*"); break;case 3: LcdShowStr(0, y, "/"); break;default: break;void Reset() /计算器复位函数num1 = 0;num2 = 0;step = 0;LcdFullClear();void N

45、umKeyAction(unsigned char n) /数字键动作函数,按键输入的数值nunsigned char len;unsigned char str12;if (step > 1) /如计算已完成,则重新开始新的计算Reset();if (step = 0) /输入第一操作数num1 = num1*10 + n; /输入数值累加到原操作数上len = NumToString(str, num1); /新数值转换为字符串LcdShowStr(16-len, 1, str); /显示到液晶第二行上else /输入第二操作数num2 = num2*10 + n;len = Num

46、ToString(str, num2);LcdShowStr(16-len, 1, str);void OprtKeyAction(unsigned char type) /运算符按键动作函数,运算符类型typeunsigned char len;unsigned char str12;if (step = 0) /第二操作数尚未输入时响应,即不支持连续操作len = NumToString(str, num1); /第一操作数转换为字符串LcdAreaClear(0, 0, 16-len); /清除第一行左边的字符位LcdShowStr(16-len, 0, str); /字符串靠右显示在第

47、一行ShowOprt(1, type); /在第二行显示操作符LcdAreaClear(1, 1, 14); /清除第二行中间的字符位LcdShowStr(15, 1, "0"); /在第二行最右端显示0oprt = type; /记录操作类型step = 1;void GetResult() /计算结果unsigned char len;unsigned char str12;if (step = 1) /第二操作数已输入时才执行计算step = 2;switch (oprt) /根据运算符类型计算结果,未考虑溢出问题case 0: result = num1 + num

48、2; break;case 1: result = num1 - num2; break;case 2: result = num1 * num2; break;case 3: result = num1 / num2; break;default: break;len = NumToString(str, num2); /原第二操作数和运算符显示在第一行ShowOprt(0, oprt);LcdAreaClear(1, 0, 16-1-len);LcdShowStr(16-len, 0, str);len = NumToString(str, result); /计算结果和等号显示在第二行L

49、cdShowStr(0, 1, "=");LcdAreaClear(1, 1, 16-1-len);LcdShowStr(16-len, 1, str);void KeyAction(unsigned char keycode) /按键动作函数,根据键码执行相应动作if (keycode>='0') && (keycode<='9') /显示输入的字符NumKeyAction(keycode - '0');else if (keycode = 0x26) /向上键,+OprtKeyAction(0)

50、;else if (keycode = 0x28) /向下键,-OprtKeyAction(1);else if (keycode = 0x25) /向左键,*OprtKeyAction(2);else if (keycode = 0x27) /向右键,÷OprtKeyAction(3);else if (keycode = 0x0D) /回车键,计算结果GetResult();else if (keycode = 0x1B) /Esc 键,清除Reset();LcdShowStr(15, 1, "0");void KeyDrive() /按键动作驱动函数unsi

51、gned char i, j;static unsigned char pdata backup44 = /按键值备份,保存前一次的值1, 1, 1, 1,1, 1, 1, 1,1, 1, 1, 1,1, 1, 1, 1;for (i=0; i<4; i+) /循环扫描4*4 的矩阵按键for (j=0; j<4; j+)if (backupij != KeyStaij) /检测按键动作if (backupij != 0) /按键按下时执行动作KeyAction(KeyCodeMapij); /调用按键动作函数backupij = KeyStaij;void KeyScan() /

52、按键扫描函数unsigned char i;static unsigned char keyout = 0; /矩阵按键扫描输出计数器static unsigned char keybuf44 = /按键扫描缓冲区,保存一段时间内的扫描值0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF;/将一行的4 个按键值移入缓冲区keybufkeyout0 = (keybufkeyout0 << 1) | KEY_IN_1;keybufkeyout1 = (ke

53、ybufkeyout1 << 1) | KEY_IN_2;keybufkeyout2 = (keybufkeyout2 << 1) | KEY_IN_3;keybufkeyout3 = (keybufkeyout3 << 1) | KEY_IN_4;/消抖后更新按键状态for (i=0; i<4; i+) /每行4 个按键,所以循环4 次if (keybufkeyouti & 0x0F) = 0x00) /连续4 次扫描值为0,即16ms(4*4ms)内都只检测到按下状态时,可认为按键已按下KeyStakeyouti = 0;else if (

54、keybufkeyouti & 0x0F) = 0x0F) /连续4 次扫描值为1,即16ms(4*4ms)内都只检测到弹起状态时,可认为按键已弹起KeyStakeyouti = 1;/执行下一次的扫描输出keyout+;keyout &= 0x03;switch (keyout)case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;default: break;/*main.c 文件程序代码*/#include <reg52.h>void ConfigTimer0(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论