目录
1.概述................................................ 1
2.系统软件设计..................................... 1
2.1设计目标和实现方法........................................ 1
2.2整体方案论证.............................................. 1
3.系统硬件的设计.................................. 2
3.1复位电路的设计............................................ 2
3.2时钟振荡器电路的设计...................................... 3
3.3输入电路的设计............................................ 4
3.4输出电路的设计............................................ 7
4.系统程序的设计与介绍.......................... 9
4.1读键输入程序流程图设计.................................... 9
4.2 LED显示程序流程图设计................................... 11
4.3主程序流程图设计......................................... 12
5.程序设计体会......................................
....................................................... 12
附 1 源程序代码......................................... 14
附 2 计算器电路图....................................... 24
1.概述
随着社会的发展,科学的进步,人们的生活水平在逐步地提高,尤其是微电子技术的发展犹如雨后春笋般的变化。电子产品的更新速度快就不足惊奇了。计算器在人们的日常中是比较常见的电子产品之一,如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好地为各个行业服务,成了如今电子领域重要的研究课题。
现如今,人们的日常生活中已经离不开计算器了,社会的各个角落都有它的身影,比如商店、办公室、学校……因此设计一款简单实用的计算器会有很大的实际意义。
本设计旨在进一步掌握单片机理论知识,理解嵌入式单片机系统的硬软件设计,加强对实际应用系统设计的能力。通过本设计的学习,使我掌握单片机程序设计和微机接口应用的基本方法,并能综合运用本科阶段所学软、硬件知识分析实际问题,提高解决毕业设计实际问题的能力,为单片机应用和开发打下良好的基础。
1、 对字符液晶显示模块的工作原理,如初始化、清屏、显示、调用及外特性有较清楚的认识,并会使用LCD(液晶显示模块)实现计算结果的显示;掌握液晶显示模块的驱动和编程,设计LCD和单片机的接口电路,以及利用单片机对液晶显示模块的驱动和操作;
2、 在充分分析内部逻辑的概念,进行软件和调试,学会使用,并能够以其为平台设计出具有四则运算能力简易计算器的硬件电路和软件程序。
2.系统软件设计
2.1 设计目标和实现方法
为了满足简易计算器的基本要求,可以进行基本的加、减、乘、除运算以及数据归零操作,我们采用基于51单片机设计计算器,并用七段共阴极LED 数码管显示数据,4*4的矩阵键盘实现数据的输入。
2.2 整体方案论述
根据简单计算器的功能和本方案中的设计指标要求,本系统选用了MCS 51 单片机为主控机。通过扩展必要的外围接口电路,实现对简单计算器的设计。具体设计考虑如下:
①由于要设计的是简单的计算器,可以进行基本的四则运算,对数字的大小范围要求不高,故我们采用可以进行四位数字的运算,选用8 个LED 数码管显示数据和运算结果。
②另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可。
系统模块图:
图2-1 系统模块图
3.系统硬件的设计
3.1 复位电路的设计
上电复位的原理:VCC上电时,C充电,在10K电阻上出现了电压,使单片机复位;几个毫秒后,C充满,10K电阻上电流降为0,电压也为0,使得单片机进入工作状态。
手动复位的原理:工作期间,按下S,C放电。S松手,C又充电,在10K电阻上出现电压,使得单片机复位。几个毫秒后,单片机进入工作状态。
如SW复位键按下时:RST经1k电阻接VCC,获得10k电阻上所分得电压,形成高电平,进入“复位状态”
。
当SW复位键断开时:RST经10k电阻接地,电流降为0,电阻上的电压也将为0,RST降为低电平,开始正常工作 。
对于成熟产品,从降低成本角度,可以使用上电复位。另外,作为产品,最好使用上电复位。因为使用者通常没有专业知识,就知道断电通电,对他们来说,按键复位成了摆设。按键复位比较适合样品制作或者实验室调试场合,上电复位电路成本也低一些。
综上所述我们在本方案中选用了上电自动复位电路。
上位自动复位电路图和手动复位电路图如下图
如图3—1两种复位方式
3.2 时钟振荡电路的设计
能够产生振荡电流的电路叫做振荡电路。一般由电阻、电感、电容等元件和电子器件所组成。由电感线圈l和电容器c相连而成的lc电路是最简单的一种振荡电路,其固有频率为f=[sx(]1[]2πlc。 § 一种不用外加激励就能自行产生交流信号输出的电路。它在电子科学技术领域中得到广泛地应用,如通信系统中发射机的载波振荡器、接收机中的本机振荡器、医疗仪器以及测量仪器中的信号源等。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用此振动器。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
使用片内振荡器,可以节省IO引脚,减少成本,但是内部振荡器使用阻容震荡,导致它的精度不高,如果使用了串口、或者PWM等对时钟比较敏感的功能,最好还是使用外部晶体振荡。
在本方案中我们选择了内部时钟方式,如下图:
如图3—2两种时钟方式
3.3 输入电路的设计
每一个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
当无按键闭合时,P10~P13 与P14~P17 之间开路;当有键闭合时,与闭合键相连的两条I/O 口线之间短路。判断有无按键按下的方法是:第一步,置列线P14~P17 为输入状态,从行线P10~P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P14~P17 读入数据,若有某一列为低电平,则对应行线上表示有键按下。综合一二两步的结果,可以确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。
键盘是单片机系统中常用的人机对话输入设备,用户通过键盘向单片机输入数据或者指令。键盘控制程序需要完成的任务有:监测是否有键按下,有键按下时,在无硬件去抖的动电路时,应用软件延时方法消除按键抖动影响;当有多个键同时按下时,只处理一个按键,不管一次按键持续多长时间,仅执行一次按键功能程序。
矩阵按键扫描程序是一种节省IO口的方法,按键数目越多节省IO口就越可观,思路:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。但是,在程序的写法上,采用了最简单的方法,使得程序的效率最高。本程序中,如果检测到了某个键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU时间。
本键盘扫描程序的优点在于:不使用专门的按键延时程序,提高了CPU效率,也不用中断来扫描键盘,节省了硬件资源。另外,本键盘扫描程序,每次扫描占用CPU时最短,不论有键按下或者无键按下都可以在很短的时间完成一次扫描。
本键盘扫描子程序名叫key,每次要扫描时用lcall key调用即可。
键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。通用PC机使用的标准键盘就是编码键盘。在智能仪器中,使用并行接口芯片8279或串行接口芯片HD7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可以在相关资料中得到。当系统功能比较复杂,案件数量很多时,采用编码键盘可以简化软件设计。但大多数智能仪器和电子产品的按键数目都不很多(20个以内),为了降低成本和简化电路通常采用非编码键盘。非编码键盘的电路由设计者根据需要自己决定,按键信息通过接口软件来获取。
本课题需要16个按键,由P3口采用4*4矩阵式键盘。
如图3-3 键盘
图3-4 键盘扫描流程图
3.4 输出电路设计
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳级数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳级数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,对应的字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,对应的字段就不亮。
LED显示器由七段发光二极管组成,排列成8字形状,因此也成为七段LED显示器,器排列形状如下图所示:
图3-5 LED段码
为了显示数字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字0~9的共阴极字形代码如下表3-1所示:
表3-1 0~9七段数码管共阴级字形代码
由于数值单元存放的是二进制数,而我们大家熟悉的是十进制数,所以应将数值单元中的二进制数字转换为十进制数字,即BCD码。要通过数码管显示出当前的数值,还必须将BCD码进一步转换为七段码,转换的最终结果数据存放于显示缓冲区30H-33H单元中,其中30H单元存放数值的个位七段码,31H单元存放数值的十位七段码,32H单元存放数值的百位七段码,33H单元存放数值的千位七段码。
本方案设计中由P1口输出字形码,P0口输出字位码。先将存放于30H单元的数值个位七段码由P1口输出,同时P0口输出使数值个位显示数码管点亮的字位码。由于采用的是共阴数码管,所以只有该位数码管对应的P0.0为1,其他位P0.1-P0.3位0,点亮延时10MS。然后P1口输出数值十位七段码,P0.1位1,数值十位数码管点亮,延时10MS。接着P1口输出数值百位七段码,P0.2为1,数值百位数码管点亮,延时10MS。最后P1口输出数值千位七段码,P0.3为1,数值千位数码管点亮,延时10MS。
发光二极管LED 是单片机应用系统中的一种简单而最常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。因而作为典型的外围器件,LED 显示单元是反映系统输出和操作输入的有效元器件。LED 具备数字接口可以方便的和单片机引脚连接;它的优点是价格低,寿命长,对电压电流的要求低以及容易实现多路等,因而在单片机应用系统中获得了广泛的应用,所以在此设计中我首先选用了LED作为显示器件。
图3-7 数码显示管
4.系统的程序设计
本方案中的程序设计采用了模块化设计,各部分程序都分别进行独立的设计,最后主程序通过调用各模块程序来运行,编程中所使用的语言全部都是C语言,可以利用keil软件进行灵活的编译,编译完成后也可生成HEX文件,利用ISP编程软件通过串口写到单片机中。本方案程序设计中部分包括主程序模块、液晶显示模块、功能按键和控制输出等部分。
4.1 读键输入程序流程图
为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。为了得到被按键的键码,现使用行扫描法识别按键。列扫描信号进行读入行的信号判断该列是否有列的输出——是则进行按照行列计算键盘的值,查表取得键码并返回——若否则进行再次扫描。
图4-1 读键输入程序
4.2 LED显示程序流程图设计
LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们需要的数位,
数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp "的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就会显示出字形,没有选通的数码管就不会亮。 透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O埠,而且功耗更低。
图4-2 数码管显示流程图
4.3主程序设计
主程序进行程序中用到的一些存储单元的初始化,数值显示和4*4键盘扫描。首先,进行存储单元初始化,给数码管显示单元30H-33H赋予“0000”字形数据,将数值计数单元,存储单元,23H-25H,34H-37H,38H,39H,3AH,3BH,3CH,赋予初值零。之后,调用键盘扫描子程序,和数码管显示数据转换程序,数码管动态显示子程序。主程序不断进行键盘扫描,数码管显示数据转换子程序和动态显示子程序。
首先初始化参数,送LED低位显示“0”,功能键(“+” 、“-” 、“*” 、“/” 、 “+” )位不显示。然后扫描键盘看是否有键输入,若有,读取键码。判断键码是数字键、清零键还是“+” 、“—” 、“*” “/” ,是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。
5.课程设计体会
本次课程设计,我们小组在实验前的一个星期里,已经查好了资料,并且提前在自己的电脑上安装了keil和proteus两个软件。经过努力的编程和不断的查资料及调试,在寝室的时候已经将所需连接的电路图仿真出来了。所以,周五去到实验室的时候就直接连接了电路图,可是我们在仿真的时候出现了问题,一直没有得到预期的结果。后来经过反复的检查程序和电路图后,才发现是数码管的共阴共阳弄反了,程序里面是共阴的,连电路图的时候不小了连成了共阳的,换了共阳数码管后,马上就得到了想要的实验结果。
在后来连接面包板的过程中,我们的实验过程一直不顺利。因为这个计算器的设计用到了键盘和8个数码管,所以线路连接比较复杂,我们花了一下午的时间连接了线路,可是通电后并没有出现实验结果,仔细检查后,还是一直进入不了调试状态。刚开始的时候怀疑自己的电路连接可能有问题,所以问了老师,后来我们又参考了单片机实验书后面的连接图,在没有弄清楚的情况下,我太仓促地拆掉了已连接好的电路图,然后又加入了锁存器和138译码器。连接完后,还是进入不了调试。这时我们就开始好好仔细检查错误了,其实我们程序里并没有关于138译码器的编程,所以现在电路和程序是对不上的。要不改程序或者再改电路,最后我们还是回到了最初的电路,其实最初的电路一直都是正确的,只是我们真的太粗心和太着急了。经过反复检查后,线路和程序都已经没有问题了,可就是进入不了调试,后来我们有用C语言编写了一个测试程序,可结果却是一样的,进入不了调试。就这样一直找错,一直调试,花了近一天的时间,仍得不到想要的结果,询问老师后,老师让我们先焊接电路板。最后,我们就开始焊板了。焊完板后,仍然进入不了调试,换了四台电脑不断的尝试、检查和排错。花了很长的时间后,终于在第五台电脑上进入调试了。当时都特别激动,后来发现在焊接过程中,虽然已经注意了,还是把高低位接反了。
整个课程设计过程中,团队合作是非常重要的,我们的队员都有不同的分工。互相之间都配合的很好。通过同学之间的讨论,不仅加深了我们对计算器工作的原理的了解还增进了我们同学之间的友谊。并且通过这次课设,能将书本上的理论知识和实际有机地结合起来,从理论中得出结论。锻炼了我们实际分析问题和解决问题的能力,提高了适应实际的能力,为我们今后的学习和实践打下了良好的基础。此次课设还巩固了所学过的原理知识,从而提高自己的实际动手能力和独立思考的能力。为我们以后要参加的各种比赛打下了坚实的基础!
附1源程序代码
ORG 0000H
LJMP START
ORG 0030H
START:MOV 30H,#00H ;;;;;;;;;;;;;;;初始化定义;;;;;;;;;;;
MOV 38H,#00H
MOV 39H,#00H
MOV 3AH,#00H
MOV 3BH,#00H
MOV 3CH,#00H
MOV 3DH,#00H
MOV 3EH,#00H
MOV 3FH,#00H
MOV 40H,#00H
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
MOV 44H,#00H
MOV 50H,#0E0H ;;;;;;;;行定义;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV 51H,#0D0H
MOV 52H,#0B0H
MOV 53H,#70H
LOOP3: ACALL DISPLAY
MOV R0,#50H ;;R01表示启用R0;;;;;;;;寻键值;;;;;;;;;;;;
MOV R7,#04H ;;R71;;;;;循环4次;;;;;;;;;;;;;;;;;;;;;;;
LOOP1:MOV A,@R0 ;;A1;;;;;;;;;;;;R0行号;;;;;;;;;;;;;;;;;;;;
MOV P3,A ;;A2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,#0FFH ;; A1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV P1,A ;;;A2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,P1 ;A1;;;;;;;;;;;读P1口;;;;;;;;;;;;;;;;;;
ANL A,#0FH
MOV R5,A ;A2;;;;;;;;;;;;;;;;;;;;;;;;
CJNE A,#0FH,LOOP2 ;;;;;;;;;;;;;;;;;;;;;判断有无按键;;;;;;;;;;;;;
INC R0
DJNZ R7,LOOP1 ;;;R72;;;;;;;;;;;;;;;;;;;
JMP LOOP3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOP2:MOV R4,#0A0H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TFF:ACALL DELAY1mS ;;;;;;;;;;;延迟10MS;;;;;;;;
DJNZ R4,TFF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SS: MOV A,#0FFH
MOV P1,A
MOV A,P1 ;;;;;;;;;;;;;判键是否松开;;;;;;;;;;;;;;
ANL A,#0FH
CJNE A,#0FH,SS
MOV A,42H ;;;;;;;;;;;;;判断是否按+-×/号;;;;;;;;;
MOV R1,#30H ;;;;;;;;显示区低字节地址指针;;;;;;;;;;;;;;;;;;;;;;;
CJNE A,#01H,NEXT1
MOV 40H,#00H
MOV 42H,#00H
NEXT1: CJNE @R0,#0E0H,ROW2KEY ;;;;;;;;;111111;;;;;;;;;;R0行号;;;;;;;;;;;;;;
MOV A,R5 ;;;;A1;; R5列号;;;;;;;
ORL A,@R0 ;;;R02表示停用R0;;;;;;;;;;;;;;;;;;;;
CJNE A,#0EEH,KEY2 ;;;;A2;;;;;;;;;;;;;;;;
MOV A,40H
CJNE A,#08H,TW1
ACALL WARNNING
JMP LOOP3
TW1:INC 40H
MOV A,#07H
MOV 43H,A
ACALL MOVE
ACALL CHANGE11
JMP LOOP3
KEY2:CJNE A,#0EDH,KEY3
MOV A,40H
CJNE A,#08H,TW2
ACALL WARNNING
JMP LOOP3
TW2: INC 40H
MOV A,#08H
MOV 43H,A
ACALL MOVE
ACALL CHANGE11
JMP LOOP3
KEY3:CJNE A,#0EBH,KEY4
MOV A,40H
CJNE A,#08H,TW3
ACALL WARNNING
JMP LOOP3
TW3:MOV A,#09H
INC 40H
MOV 43H,A
ACALL MOVE
ACALL CHANGE11
JMP LOOP3
KEY4:ACALL JUDEG ;;计算结果放入3CH起始的单元;;;;;;;;;;;;;;;;;;;;;;;
ACALL CHANGE ;;;;;将结果放入显示缓冲区;;;;;;;;;;;;;;;;;;;;;;;;;
MOV 42H,#01H
MOV 41H,#04H ;;;;;;;;;;;;04 表示除法;;;;;;;;;;
JMP LOOP3
ROW2KEY:CJNE @R0,#0D0H,ROW3KEY ;;;;;;;;;;;;;;2222222222;;;;;;;;;;;;;;;;;;;;;;;
MOV A,R5
ORL A,@R0
CJNE A,#0DEH,KEY5
MOV A,40H
CJNE A,#08H,TW4
ACALL WARNNING
JMP LOOP3
TW4:INC 40H
MOV A,#04H
MOV 43H,A
ACALL MOVE
ACALL CHANGE11
JMP LOOP3
KEY5:CJNE A,#0DDH,KEY6
MOV A,40H
CJNE A,#08H,TW5
ACALL WARNNING
JMP LOOP3
TW5:MOV A,#05H
INC 40H
MOV 43H,A
ACALL MOVE
ACALL CHANGE11
JMP LOOP3
KEY6:CJNE A,#0DBH,KEY7
MOV A,40H
CJNE A,#08H,TW6
ACALL WARNNING
JMP LOOP3
TW6:MOV A,#06H
INC 40H
MOV 43H,A
ACALL MOVE
ACALL CHANGE11
JMP LOOP3
KEY7:ACALL JUDEG ;;;;计算结果放入3CH起始的单元;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ACALL CHANGE ;;;将结果放入显示缓冲区;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV 42H,#01H
MOV 41H,#03H ;;;;;;;;;;;;03表示乘法;;;;;;;;;;
JMP LOOP3
ROW3KEY:CJNE @R0,#0B0H,ROW4KEY ;;;;;;;;;;;;3333333333333;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,R5
ORL A,@R0
CJNE A,#0BEH,KEY8
MOV A,40H
CJNE A,#08H,TW7
ACALL WARNNING
JMP LOOP3
TW7:MOV A,#01H
INC 40H
MOV 43H,A
ACALL MOVE
ACALL CHANGE11
JMP LOOP3
KEY8:CJNE A,#0BDH,KEY9
MOV A,40H
CJNE A,#08H,TW8
ACALL WARNNING
JMP LOOP3
TW8:MOV A,#02H
INC 40H
MOV 43H,A
ACALL MOVE
ACALL CHANGE11
JMP LOOP3
KEY9:CJNE A,#0BBH,KEY10
MOV A,40H
CJNE A,#08H,TW9
ACALL WARNNING
JMP LOOP3
TW9: MOV A,#03H
INC 40H
MOV 43H,A
ACALL MOVE
ACALL CHANGE11
JMP LOOP3
KEY10:ACALL JUDEG ;;;;;;放入3CH起始的单元;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ACALL CHANGE ;;;;将结果放入显示缓冲区;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV 42H,#01H
MOV 41H,#02H ;;;;;;;;;;;;02 表示减法;;;;;;;;;;
JMP LOOP3
ROW4KEY:MOV A,R5
ORL A,@R0 ;;;;;;;;;;;;444444444444;;;;;;;;;;;;;;;;;;;;;;;;
CJNE A,#7EH,KEY11
JMP START ;;;;;;;;;;;;;;;;CLEAR;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY11:CJNE A,#7DH,KEY12
MOV A,40H
JZ QQ
CJNE A,#08H,TW10
ACALL WARNNING
JMP LOOP3
TW10:MOV A,#00H
INC 40H
MOV 43H,A
ACALL MOVE
ACALL CHANGE11
QQ: JMP LOOP3
KEY12:CJNE A,#0BBH,KEY13 ;;;;;;;;;;;;;;;;;;;;;EQUEL;;;;;;;;;;;;;;;;;;;;;;;;
ACALL JUDEG ;;计算结果放入3CH起始的单元;;;;;;;;;;;;;;;
ACALL CHANGE ;;;;将结果放入显示缓冲区;;;;;;;;;;;;;;;;;;;;;;;;;;
JMP LOOP3
KEY13:ACALL JUDEG ;计算结果放入3CH起始的单元;;;;;;;;;;;;;;;;;;;;;;;;;
ACALL CHANGE ;;;;;将结果放入显示缓冲区;;;;;;;;;;;;;;;;;;;;;;;
MOV 42H,#01H
MOV 41H,#01H ;;;;;;;;;;;;01表示加法;;;;;;;;;;
JMP LOOP3
MOVE:MOV R1,#30H
MOV R6,40H
DDD: XCH A,@R1 ;;;;;;;;;;;;;交换指令;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NOP
NOP
NOP
NOP
INC R1 ;;;R1=30H
DJNZ R6,DDD
RET
MAKEADD:MOV A,R0 ;;;;;;;保存地址;;;;;;;;;;;;;;;;;;;;
MOV R2,A
MOV A,R3
MOV R7,A
CLR C
LOP:MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,LOP
JNC NEXT
INC R3
MOV @R0,#01H
NEXT:MOV A,R2 ;;;;;;;;回复地址;;;;;;;;;;;;;;;;;;;;;
MOV R0,A
RET
MAKESUB:CLR 07H
MOV A,R0
MOV R2,A
MOV A,R3
MOV R7,A
CLR C
LOP1:MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,LOP1
JNC LOP2
SETB 07H
LOP2:MOV A,R2
MOV R0,A
RET
MAKEMUL:MOV A,R3
MOV B,R7
MUL AB
XCH A,R7
MOV R5,B
MOV B,R2
MUL AB
ADD A,R5
MOV R4,A
CLR A
ADDC A,B
MOV R5,A
MOV A,R6
MOV B,R3
MUL AB
ADD A,R4
XCH A,R6
XCH A,B
ADDC A,R5
MOV R5,A
MOV F0,C
MOV A,R2
MUL AB
ADD A,R5
MOV R5,A
CLR A
MOV ACC.0,C
MOV C,F0
ADDC A,B
MOV R4,A
RET
MAKEDIV:MOV A,R5
CLR C
SUBB A,R3
MOV A,R4
SUBB A,R2
JNC DIV11
MOV B,#16
DIV22:CLR C
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
XCH A,R4
RLC A
XCH A,R4
MOV F0,C
CLR C
SUBB A,R3
MOV R1,A
MOV A,R4
SUBB A,R2
JB F0,DIV33
JC DIV44
DIV33:MOV R4,A
MOV A,R1
MOV R5,A
INC R7
DIV44:DJNZ B,DIV22
CLR F0
RET
DIV11:SETB F0
RET
CHANGE11:
MOV R0,#40H
CJNE @R0,#01H,TA1 ;;;;;;;;;;;;;;;;;;CHANGE;;;;;;;;;;;;;;;;;;;;;;
MOV 38H,43H
JMP TA2
TA1:MOV R3,38H
MOV R2,39H
MOV R6,#00H
MOV R7,#0AH
ACALL MAKEMUL
MOV 39H,R6
MOV 38H,R7
MOV 3AH,R5
MOV 3BH,R4
MOV R0,#38H
MOV R1,#43H
MOV R3,#02H
ACALL MAKEADD
TA2: RET
CHANGE:MOV 40H,#00H
MOV R0,#30H
MOV R7,3CH ;;;;;;;;;;;;;;3BH单元值;;;;;;;;;;;;;;
MOV R6,3DH
TD1: MOV R5,#00H
MOV R4,#00H
MOV R2,#00H
MOV R3,#0AH
INC 40H
ACALL MAKEDIV
MOV A,R5
MOV @R0,A
INC R0
MOV A,R6
CJNE A,#00H,TD1
MOV A,R7
CJNE A,#00H,TD1
RET
JUDEG:MOV A,3AH
JZ JUD1
ACALL ERROR
LJMP LOOP3
JUD1:MOV R1,#38H ;;;;;;;;计算中间结果;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,41H ;;;;R01;;;;;;;
CJNE A,#00H,TB
MOV 3CH,@R1
INC R1
MOV 3DH,@R1
JMP TBB
TB: CJNE A,#01H,TB1
MOV R0,#3CH ;;;41标志位1表示加法,2表示减法3表示乘法4表示除法;;;;;;;;;;;
MOV R3,#02H
ACALL MAKEADD
MOV A,R3
CJNE A,#03H,JUD2
ACALL ERROR
LJMP LOOP3
JUD2:JMP TBB
TB1:CJNE A,#02H,TB2
MOV R0,#3CH
MOV R3,#02H
ACALL MAKESUB ;;;将3B单元数加,减,乘,除38H单元放入3BH单元;;;;;;;
JNB 07H,JUD4
ACALL ERROR
LJMP LOOP3
JUD4:JMP TBB
TB2:CJNE A,#03H,TB3
MOV R3,3CH
MOV R2,3DH
MOV R6,39H
MOV R7,38H
ACALL MAKEMUL
MOV 3DH,R6
MOV 3CH,R7
MOV 3EH,R5
MOV 3FH,R4
MOV A,R5
JZ JUD3
ACALL ERROR
LJMP LOOP3
JUD3: JMP TBB
TB3:MOV R7,3CH
MOV R6,3DH
MOV R5,#00H
MOV R4,#00H
MOV R2,39H
MOV R3,38H
ACALL MAKEDIV
MOV 3CH,R7
MOV 3DH,R6
TBB:MOV 38H,#00H
MOV 39H,#00H
MOV 3AH,#00H
MOV 3BH,#00H
RET
WARNNING: CLR P3.0
SETB P3.0
ACALL DELAY1mS
RET
ERROR:MOV R0,#30H
MOV A,#0AH
MOV R5,#05H
MOV 40H,#05H
ET: MOV @R0,A
INC R0
INC A
DJNZ R5,ET
RET
DISPLAY:MOV DPTR,#TABLE1 ;;;;;;;;;;;;;;;;;;;;;;DISPLAY;;;;;;;;;;;;;;
MOV R0,#30H
MOV R1,#80H
MOV R5,40H
NEXTF:MOV A,R1
CPL A
MOV P2,A
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY1mS
MOV A,P2
CPL A
RR A
MOV R1,A
INC R0
MOV A,R5
JZ AA
DJNZ R5,NEXTF
AA: RET
DELAY1mS:MOV R7,#02H ;;;DELAY1S;;;;;;;;;;;;;;;;;;
DL: MOV R6,#0FFH
DL6:DJNZ R6,DL6
DJNZ R7,DL
RET
TABLE1: DB 0BFH, 086H, 0DBH, 0CFH, 0E6H
DB 0EDH, 0FDH, 87H, 0FFH, 0EFH
DB 0CEH,0C0H,0CEH,0CEH,86H
END
附2计算器电路图
图1电路仿真图
图2 简易计算器正面
图3简易计算器背面
实验4计数器及其应用一实验目的1学习用集成触发器构成计数器的方法2掌握中规模集成计数器的使用及功能测试方法二实验原理计数器是一个用…
HUNANUNIVERSITY程序设计训练简单的计算器报告学生姓名田博鑫学生学号专业班级指导老师20xx年6月16日至20xx年7…
HTML网页实验报告院系计算机控制与工程学院班级计1241学号姓名完成日期1一实验名称设计一个网页计算器二需求分析计算器是日常生活…
目录一系统开发的背景1二系统分析与设计1一二计算器的主要功能1系统模块结构设计1三系统的设计与实现2一二计算器的初始界面2一般计算…
C计算器实验报告班级学号20xx13432姓名蔡启林一实验目的和要求设计一个简单计算器具有一般计算功能能进行基本的加减乘除运算还具…
山东科技大学班级:姓名:实习单位:实习时间:计算机10-1班北京电信分公司20xx.3.1-20xx.4.1一、实习目的通过理论联…
广东轻工职业技术学院实训报告课程名称计算机基础实训项目计算机在办公自动化中的综合应用班级营销091姓名陈俊学号20xx040300…
实训地点:陕西国防学院信息楼一、实训主要内容Word排版,表格制作与编辑。Powerpoint的制作,初步认识计算机办公应用OFF…
中南大学本科生课程设计(实践)任务书、设计报告(C++程序设计)题目科学计算器应用程序系统学生姓名指导教师学院专业班级学生学号严晖…
HEFEIUNIVERSITY计算机实训综合报告系别电子信息与电气工程系专业通信工程班级通信工程2班学号姓名指导老师完成时间20x…
实验一图灵机模型与计算机硬件系统虚拟拆装五实验报告实验名称学号姓名实验报告表11图灵机模型中的主要组成部分及作用班级实验时间年月日…