简易计算器实验报告

目录

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简易计算器背面

相关推荐