科技制作
基于51单片机的计算器设计
姓 名 李 伟
专 业 电 子 信 息 工 程
导 师 张 旭
完 成 时 间 2015 年 5 月 27日
2
摘要 ........................................................... 2 1 绪论 ......................................................... 3
1.1 课题背景 ............................................... 3 1.2 设计目的 ............................................... 4 2 总体方案设计 ................................................. 4
2.1 简易计算器设计基本原理 ................................. 4 2.2 MCS-51系列单片机简介 ................................... 4 2.3 单片机发展现状 .......................................... 7 2.4 计算器系统现状 ......................................... 8 2.5 简易计算器系统简介 ...................................... 8 3 硬件设计 ..................................................... 8
3.1 电源模块 ............................................... 8 3.2 主控制器模块 ........................................... 9 4 硬件实现及单元电路设计 ....................................... 9
4.1 主控制模块 ............................................. 9 4.2 单片机的时钟电路与复位电路设计 ....................... 10 4.3 单片机管脚说明 ....................................... 10 4.4 键盘电路设计 ......................................... 12 3.5 液晶显示电路设计 ..................................... 12 4 系统软件设计方案 ........................................... 13
4.1 主程序流图 ........................................... 13 4.2 运算程序设计 ......................................... 14 5 系统的安装与调试 ........................................... 16
5.1 安装步骤 .............................................. 16 结论 ........................................... 错误!未定义书签。 参考文献 ...................................................... 17 附录1 整机电路原理图 ......................................... 18 .............................................................. 18 附录2 部分源程序 ............................................ 19
2
3
摘要:近几年单片机技术的发展很快,其中,电子产品的更新速度迅猛。计算器是日常生活中比较常见的电子产品之一。如何才能使计算器技术更加的成熟,充分利用已有的硬件和软件条件,设计出更出色的计算器。 关键词: 单片机; 液晶显示屏; 计算器; 矩阵键盘
1 绪论
本设计是以STC89C52单片机为核心的计算器模拟系统设计,输入采用4*4矩阵键盘,可以进行加、减、乘、除带符号数字运算(七位整数、六位小数),并在液晶显示屏LCD1602上静态显示操作过程及结果。
1.1 课题背景
随着社会的发展,科学的进步,人们的生活水平在逐步地提高,尤其是微电子技术的发展犹如雨后春笋般的变化。电子产品的更新速度快就不足惊奇了。计算器在人们的日常中是比较常见的电子产品之一,如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好地为各个行业服务,成了如今电子领域重要的研究课题。
现如今,人们的日常生活中已经离不开计算器了,社会的各个角落都有它的身影,比如商店、办公室、学校……因此设计一款简单实用的计算器会有很大的实际意义。
本设计旨在进一步掌握单片机理论知识,理解嵌入式单片机系统的硬软件设计,加强对实际应用系统设计的能力。通过本设计的学习,使我掌握单片机程序设计和微机接口应用的基本方法,并能综合运用本科阶段所学软、硬件知识分析实际问题,提高解决毕业设计实际问题的能力,为单片机应用和开发打下良好的基础。
1、 对字符液晶显示模块的工作原理,如初始化、清屏、显示、调用及外特性有较清楚的认识,并会使用LCD(液晶显示模块)实现计算结果的显示;掌握液晶显示模块的驱动和编程,设计LCD和单片机的接口电路,以及利用单片机对液晶显示模块的驱动和操作;
2、 在充分分析内部逻辑的概念,进行软件和调试,学会使用,并能够以
3
4
其为平台设计出具有四则运算能力简易计算器的硬件电路和软件程序。
1.2 设计目的
通过本次工程实践,运用《MCS-51系列单片微型计算机及其应用》所学知识及查阅相关资料,完成简易计算器的设计,达到理论知识与实践更好结合、提高综合运用所学知识和设计能力的目的。
通过本次设计训练,可以使我们在基本思路和基本方法上对基于MCS-51单片机的嵌入式系统设计有一个比较感性的认识,并具备一定程度的设计能力。
2 总体方案设计
2.1 简易计算器设计基本原理
根据功能和指示要求,本系统选用以MCS-51单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。
2.2 MCS-51系列单片机简介
stc89c52是MCS-51系列单片机的典型产品,以这一代表性的机型进行系统的讲解。stc89c52单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,其内部结构如图1所示,现在分别加以说明:
4
5
图1 stc89c52内部结构图
中央处理器:
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。 数据存储器(RAM):
stc89c52内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
程序存储器(ROM):
stc89c52共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。 定时/计数器:
stc89c52有两个16位的可编程定时/计数器,以实现定时或计数产生中断,用于控制程序转向。
并行输入输出(I/O)口:
stc89c52共有4组8位I/O口(P0、 P1、P2和P3),用于对外部数据的传输。 全双工串行口:
5
6
stc89c52内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
中断系统:
stc89c52具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。
时钟电路:
stc89c52内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但stc89c52单片机需外置振荡电容。
下图是MCS-51系列单片机的内部结构示意图2。
6
7
图2 MCS-51内部结构图
2.3 单片机发展现状
单片机的发展趋势:低功耗CMOS化;微型单片化;主流与多品种共存;单片机从8位、16位到32位,数不胜数,应有尽有,有与主流C51系列兼容的,也有不兼容的,但它们各具特色,互成互补,为单片机的应用提供广阔的天地。 纵观单片机的发展过程,可以预示单片机的发展趋势,大致有:
(1) 低功耗CMOS化
MCS-51系列的stc89c52推出时的功耗达630mW,而现在的单片机普遍都在100mW左右,随着对单片机功耗要求越来越低,现在的各个单片机制造商基本都采用了CMOS(互补金属氧化物半导体工艺)。象80C51就采用了HMOS(即高密度金属氧化物半导体工艺)和CHMOS(互补高密度金属氧化物半导体工艺)。CMOS虽然功耗较低,但由于其物理特征决定其工作速度不够高,而CHMOS则具备了高速和低功耗的特点,这些特征,更适合于在要求低功耗象电池供电的应用场合。所以这种工艺将是今后一段时期单片机发展的主要途径。
(2)微型单片化
现在常规的单片机普遍都是将中央处理器(CPU)、随机存取数据存储(RAM)、只读程序存储器(ROM)、并行和串行通信接口,中断系统、定时电路、时钟电路集成在一块单一的芯片上,增强型的单片机集成了如A/D转换器、PMW(脉宽调制电路)、WDT(看门狗)、有些单片机将LCD(液晶)驱动电路都集成在单一的芯片上,这样单片机包含的单元电路就更多,功能就越强大。甚至单片机厂商还可以根据用户的要求量身定做,制造出具有自己特色的单片机芯片。
此外,现在的产品普遍要求体积小、重量轻,这就要求单片机除了功能强和功耗低外,还要求其体积要小。现在的许多单片机都具有多种封装形式,其中SMD(表面封装)越来越受欢迎,使得由单片机构成的系统正朝微型化方向发展。
(3) 主流与多品种共存
现在虽然单片机的品种繁多,各具特色,但仍以80C51为核心的单片机占主流,兼容其结构和指令系统的有PHILIPS公司的产品,ATMEL公司的产品和中国台
7
8
湾的Winbond系列单片机。所以Cstc89c52为核心的单片机占据了半壁江山。而Microchip公司的PIC精简指令集(RISC)也有着强劲的发展势头,中国台湾的HOLTEK公司近年的单片机产量与日俱增,与其低价质优的优势,占据一定的市场分额。此外还有MOTOROLA公司的产品,日本几大公司的专用单片机。在一定的时 期内,这种情形将得以延续,将不存在某个单片机一统天下的垄断局面,走的是依存互补,相辅相成、共同发展的道路。
2.4 计算器系统现状
计算器一般由运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备及电子配件通过人工或机器设备组成。低档计算器的运算器、控制器由数字逻辑电路实现简单的串行运算,其随机存储器只有一、二个单元,供累加存储用。高档计算器由微处理器和只读存储器实现各种复杂的运算程序,有较多的随机存储单元以存放输入程序和数据。键盘是计算器的输入部件,一般采用接触式或传感式。为减小计算器的尺寸,一键常常有多种功能。显示器是计算器的输出部件,有发光二极管显示器或液晶显示器等。除显示计算结果外,还常有溢出指示、错误指示等。计算器电源采用交流转换器或电池,电池可用交流转换器或太阳能转换器再充电。为节省电能,计算器都采用CMOS工艺制作的大规模集成电路(见互补金属-氧化物-半导体集成电路),并在内部装有定时不操作自动断电电路。计算器可选用的外围设备有微型打印机、盒式磁带机和磁卡机等。
2.5 简易计算器系统简介
本计算器是以MCS-51系列stc89c52单片机为核心构成的简易计算器系统。该系统通过单片机控制,实现对4*4键盘扫描进行实时的按键检测。整个系统可分为2个主要功能模块:功能模块一,实时键盘扫描;功能模块二,数据1602液晶显示。
3 硬件设计
3.1 电源模块
采用3节1.5 V干电池共4.5V做电源,经过7805的电压变换后为单片机,传感器供电。经过实验验证系统工作时,单片机、传感器的工作电压稳定能够满足系统的要求,而且电池更换方便。
8
3.2 主控制器模块
9
采用STC89C52单片机作为整个系统的核心,用其控制密码锁控制,以实现其既定的性能指标。充分分析我们的系统,其关键在于密码锁的控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。STC89C52单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是STC89C52单片机价格非常低廉。
4 硬件实现及单元电路设计
4.1 主控制模块
主控制最小系统电路如图3所示。
图3 单片主控电路
9
10
4.2 单片机的时钟电路与复位电路设计
本系统采用STC系统列单片机,相比其他系列单片机具有很多优点。一般STC单片机资源比其他单片机要多,而且执行速度快;STC系列单片机使用串口对单片机进行烧写,下载程序较为方便;STC51单片机内部集成了看门狗电路;且具有很强抗干扰能力。
本系统采用内部方式的时钟电路和加电自复位的复位电路,如下图 3图4所示:
图3 时钟电路
图4 复位电路
由于单片机P0口内部不含上拉电阻,为高阻态,不能正常地输出高/低电平,因而该组I/O口在使用时必须外接上拉电阻。
4.3 单片机管脚说明
VCC(40):供电电压,其工作电压为5V。 GND(20):接地。
P0端口(P0.0-P0.7):P0口为一个8位漏极开路双向I/O口,每个引脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1端口(P1.0-P1.7):P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高电平,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
10
11
在FLASH编程和校验时,P1口作为第八位地址接收。
P2端口(P2.0-P2.7):P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口,用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3端口(P3.0-P3.7):P3口管脚是一个带有内部上拉电阻的8位的双向I/O端口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入端时,由于外部下拉为低电平,P3口将输出电流(ILL)。
P3口同时为闪烁编程和编程校验接收一些控制信号。
复位RST(9):复位输入。在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个引脚保持高电平,51芯片便循环复位。复位后P3.0-P3.7口均置1,引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。复位操作不会对内部RAM有所影响。
ALE/PROG(30):当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如果想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,则置位无效。
PSEN(29):外部程序存储器的选通信号。在由外部程序存储器取指令期间,每个机器周期两次PSEN有效。但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。 __EAEA/VPP(31):当EA保持低电平时,则在此期间外部程序__存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,EA将内部
锁定为
RESET;当EA____端保持高电平时,此间内部程序存储器。在FLASH编程期间,
此引脚也用于施加12V的编程电源(VPP)。
XTAL1(19):来自反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2(18):来自反向振荡器的输出。
11
12
4.4 键盘电路设计
在单片机应用系统中,一般都会设置键盘,主要为了控制运行状态,输入一些命令或数据,以完成特定的人机交互。键盘是与单片机进行人机交互的最基本的途径,其以按键的形式来设置控制功能或输入数据,按键的输入状态本质上是一个开关量。对于简单的开关量的输入可以采用独立式按键,这种方法接口简单,但占用单片机I/O端口资源较多。对于输入参数较多、功能复杂的系统,需要采用矩阵式键盘进行输入控制。本系统采用4*4矩阵式键盘,键盘连接方式如图5所示:
图5 键盘电路
3.5 液晶显示电路设计
液晶显示器(LCD)是一种功耗很低的显示器,它的使用非常广泛,比如电子表、计算器、数码相机、计算机的显示器和液晶电视等。电子密码锁中需要显示的信息比较多,为了能直观的看到结果,并且为了设计显的美观,使用总线和排阻进行简化连接方式,本设计采用液晶显示屏LCD进行显示,具体连接方式如图6所示。
12
13
图6 液晶显示电路
4 系统软件设计方案
4.1 主程序流图
如图10为主程序流程图
13
14
图10 主程序流程图
4.2 运算程序设计
STC89C52单片机是一块芯片中集成了CPU、RAM、ROM、定时器、计数器、和多功能I/O等一台计算器所需要的基本功能部分。如果按功能划分,它由如下功
14
15
能部分组成,即微处理器(CPU)、数据处理器(RAM)、程序处理器(ROM/CPROM)、并行I/O口、串行口、定时器、计数器、中断系统及特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊一些功能,通过使用单片机编写的程序可以凸显高智能、高效率以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快实现运算功能。
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用到很多的I/O资源,因此在很多情况下都不采用这种方式(如图11)。但因为实体资源有限不得已而为之,但不会影响其功能。
图11 运算程序
15
16
5 系统的安装与调试
5.1 安装步骤
1.检查元件的好坏
按电路图买好元件后首先检查买回元件的好坏,按各元件的检测方法分别进行检测。认真核对原理图是否一致,在检查好后才可上件、焊件,防止出现错误焊件后不便改正。
2.放置、焊接各元件
按原理图的位置放置各元件,在放置过程中要先放置、焊接较低的元件,后焊较高的和要求较高的元件。特别是容易损坏的元件要后焊,在焊集成芯片时连续焊接时间不要超过10s,注意芯片的安装方向。
结语
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,可以说得是苦多于甜,但是可以学到很多很多的的东西。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。通过这次课程设计使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。使我们在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧(特别是汇编语言)的掌握方面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。
16
17
不足与展望
通过此次毕业设计我想学到了很多在课堂中无法学到的应用类知识,使我深刻的认识到自己知识范围的狭窄和匮乏也真正让我认识到实际操作的重要性。
本次毕业设计在完成过程中我请教了很多在单片机方面优秀的同学,我领会了我们之间存在的差距以及我在单片机方面的欠缺。同时,在翻阅辅导资料的过程中我惊叹于作者思维的严密性和知识的广泛性,令我在感慨过程中也让我坚定了学好这门学科的决心,校正了正确的方向。在以后的工作学习中定要向前辈和同事多学习、多发问,我相信经过长期的努力和学习我也定能成为电气方面的佼佼者。
参考文献
[1] 王千. 实用电子电路大全[M]. 电子工业出版社, 2004, 28-36
[2] 彭为. 单片机典型系统设计实例精讲[M]. 电子工业出版社,2 006, 69-88 [3] 张荣. 基于单片机的智能系统设计与实现[M]. 电子工业出版社, 2005, 35-38
[4] 朱勇. 单片机原理与应用技术[M]. 清华大学出版社, 2006, 14-16 [5] 潘永雄. 新编单片机原理与应用[M]. 西安电子科技大学出版社, 2003, 78-86
17
附录1 原理图
18
18
19
附录2 部分源程序
#include float num1; float num2; uchar jjcc; // 保存第一个数 // 保存第二个数 // 加减乘除标志变量 // 记录显示第一行字符 // 记录num1 是几位数 // 记录num2 是几位数 uchar Lcd_Str[17]; // 显示区缓存 uchar Num_str[17]; uchar Lcd_dis1_i = 0; uchar Lcd_num1_i = 0; uchar Lcd_num2_i = 0; uchar Dian_i = 0; 函数名称:delayms; 函数功能:延时z毫秒; 形 参:z (延时时间参数) *******************************************/ void delayms(uchar z) { uint x,y; for(x=z;x>0;x--) // 小数点位数 /********************** ******************** uchar Lcd_num2_add = 0; // 第二个数据开始位的增量 19 } uchar Key_io; uchar Key_jl; uchar Key_D_bit; uchar saom(void) { Key_value=18; P3=0xf0; Key_io=P3; for(y=110;y>0;y--); 20 // 暂存IO值 // 松手检测自锁变量 uchar Key_value; // 返回键值 // 拉低低四位 if(Key_io!=0xf0) // 查看搞四位是否有低电平 { case 0x77: Key_value=15; case 0x7b: Key_value=11; break ; case 0x7d: Key_value=0; break ; Key_io|=0x0f; // 保持高四位出现低电平的管脚,拉高第四位 P3=Key_io; // 重新复制IO口 Key_io=P3; // 读取IO信息,确定键值 if(Key_jl==0) // 自锁变量,松手检测 switch(Key_io) { case 0x7e: Key_value=10; break ; Key_jl=1; 20 break ; 21 case 0xbe: Key_value=7; break ; case 0xbd: Key_value=8; break ; case 0xbb: Key_value=9; break ; case 0xb7: Key_value=14; break ; case 0xde: Key_value=4; break ; case 0xdd: Key_value=5; break ; case 0xdb: Key_value=6; break ; case 0xd7: Key_value=13; break ; case 0xee: Key_value=1; break ; case 0xed: Key_value=2; 21 } break ; 22 case 0xeb: Key_value=3; break ; case 0xe7: Key_value=12; break ; } } else { } uchar XS_JG(uchar add,float n) //显示函数 { uchar len,p=0; memset(Lcd_Str,0,16) ; sprintf(Lcd_Str,\"%e\ while(Lcd_Str[p]!='e') { p++; } if(Lcd_Str[p+2]==0x30&&Lcd_Str[p+3]<0x37) { sprintf(Lcd_Str,\"%f\ len = strlen(Lcd_Str) ; while(len) { if(Lcd_Str[len-1]=='.') //内存空间初始化 Key_jl=0; } return Key_value; 22 { 23 Lcd_Str[len-1] = 0; break; } { Lcd_Str[len-1] = 0; } else { break; } if(Lcd_Str[len-1]=='0') // 去除数据中多余的0与小数点 len--; } } else { while(p) { if(Lcd_Str[p-1]=='.') { Lcd_Str[p-1] =' '; break; } { Lcd_Str[p-1] = ' '; } else { break; } if(Lcd_Str[p-1]=='0') // 去除数据中多余的0与小数点 23 p--; } 24 } Dis_str(add,\" \"); Dis_str(add,Lcd_Str); return len; } /*************显示特殊字符函数***************/ void fuhao(uchar s) { if(jjcc<5) { if(Num_str[0]!='A') { if(Num_str[0]<=0x39&&Num_str[0]>=0x30&&jjcc != 2) { // 从数组中取第二个数字 num1=atof(Num_str); // XS_JG(0x8a,num1); } } if(jjcc==0) { Num_str[Lcd_dis1_i] = s ; Lcd_num2_add = Lcd_dis1_i ; Lcd_dis1_i++; } else { if(Num_str[Lcd_num2_add]==0) Num_str[Lcd_dis1_i-1] = s ; } 24 } 25 Dis_str(0x80,Num_str); if(jjcc==5) { } void main(void) { uchar num_key1; init_1602(); write_1602dat('0'); memset(Num_str,0,16); while(1) { 按下 { batt = 0; delayms(30);batt = 1; num_key1=saom(); delayms(10); if(num_key1<18) //是否有按键按下,小于16时有按键 //读按键值 Lcd_dis1_i = 4 ; Lcd_num2_i = 0 ; Lcd_num2_add = 4; memset(Num_str,0,16); Num_str[0] = 'A'; Num_str[1] = 'n'; Num_str[2] = 's'; Num_str[3] = s; Dis_str(0x80,\" \"); Dis_str(0x80,Num_str); } //内存空间初始化 25 switch(num_key1) { case 26 11: // 从数 if(Num_str[Lcd_num2_add]<=0x39&&Num_str[Lcd_num2_add]>=0x30) num2=atof(Num_str+Lcd_num2_add); 组中取第二个数字 号标志 else break; Lcd_num2_i=0 ; // XS_JG(0x8a,num2); switch(jjcc) { case 1: num1+=num2; // break; case 2: num1-=num2; // break; case 3: num1*=num2; // break; case 4: num1/=num2; // break; } XS_JG(0xc0,num1); Dis_str(0x80+Lcd_dis1_i,\"=\"); jjcc=5; // break; case 12: if(Num_str[0]==0||Lcd_num2_i>0) break; 26 加 减 乘 除 等 27 fuhao('+'); jjcc=1;Dian_i=0 ; break; // 按下加号键 case 13: if(Num_str[0]==0||Lcd_num2_i>0) break; fuhao('-'); jjcc=2;Dian_i=0 ; break; // 按下减号键 case 14: if(Num_str[0]==0||Lcd_num2_i>0) break; fuhao('*'); jjcc=3;Dian_i=0 ; break; // 按下乘号键 case 15: if(Num_str[0]==0||Lcd_num2_i>0) break; fuhao('/'); jjcc=4;Dian_i=0 ; break; // 按下除号键 case 10: if(Dian_i==0&&(Lcd_num1_i != 0||Lcd_num2_i 0))// 输入小数点时前面必须有数字 { Dian_i++; // 小数点 Num_str[Lcd_dis1_i] = '.' ; Lcd_dis1_i++; Dis_str(0x80,Num_str); } break; case 16: jjcc = 0; Dian_i = 0; Lcd_dis1_i = 0 ; Lcd_num1_i = 0 ; Lcd_num2_i = 0 ; Lcd_num2_add = 0; 27 != 示 28 memset(Num_str,0,16); Dis_str(0x80,\"0 \"); // 清除显 Dis_str(0xc0,\" \"); /********************* 删除一个数字*******************/ case 17: if(Lcd_dis1_i==0) break; /********************* 删除一个数字 删除小数点 按等号后不再撤销 *******************/ if(((Num_str[Lcd_dis1_i-1]<=0x39&&Num_str[Lcd_dis1_i-1]>=0x30)||Num_str[Lcd_dis1_i-1]=='.')&&jjcc!=5) { if(Num_str[Lcd_dis1_i-1]=='.') { Dian_i = 0; } else { if(jjcc==0) { Lcd_num1_i--; } else { Lcd_num2_i--; } } Lcd_num2_add = Lcd_dis1_i; Num_str[Lcd_dis1_i] = 0 ; Dis_str(0x80,\" \"); Lcd_dis1_i--; 28 29 Dis_str(0x80,Num_str); if(Lcd_dis1_i==0) // 显示对应 } write_1602dat('0'); break; default: if(num_key1<10&&Dian_i<7) { if(jjcc ==5) { jjcc = 0; Lcd_dis1_i = 0 ; Lcd_num1_i = 0 ; 的数字键,输入的小数点后位数小于7位 Lcd_num2_i = 0 ; Lcd_num2_add = 0; Dian_i = 0; Dis_str(0x80,\" \"); // Dis_str(0xc0,\" \"); } { if(Lcd_num1_i<7) { Num_str[Lcd_dis1_i] = num_key1+0x30; memset(Num_str,0,16); 清除显示 if(jjcc==0) Dis_str(0x80,Num_str); Lcd_dis1_i++; Lcd_num2_add = Lcd_dis1_i; Lcd_num1_i++; 29 } 30 } else if(jjcc<5) } } } } { if(Lcd_num2_i<7&&Lcd_dis1_i<17) { Num_str[Lcd_dis1_i] = num_key1+0x30; Dis_str(0x80,Num_str); Lcd_dis1_i++; Lcd_num2_i++; } } } break; 30 因篇幅问题不能全部显示,请点此查看更多更全内容