PICFA简单计算器设计报告汇编语言四位无符号整数加减乘除
- 格式:doc
- 大小:2.04 MB
- 文档页数:32
课程设计报告课程名称:单片机原理与接口技术课程设计设计题目:简单计算器院系:机电工程学院班级:2010级电气工程及其自动化专业姓名:学号:指导教师:史丽萍,闫广明,张波,张扬,王冠然设计时间:2013年12月一、设计方案描述与论证我们所设计的是一个简单计算器,它具有四位数以内的整数加减乘除运算。
可以在输入错误的时候退格,也可以初始化。
在初始化的状态下可以进行关机以减少耗能。
显示使用的数码管扫描显示的方法来显示数字,所以我们每一次运算前我们都需要将个位、十位、百位和千位相结合。
我们使用的是4×4的键盘,检测的时候是进行键盘扫描来完成确定哪一个键被摁下,然后是否释放。
键盘被摁下后,先判断是什么键。
如果是数字键,则进行数的输入,首先先把百位的数值赋给千位,十位赋给百位,个位赋给十位,然后把摁下键的对应数赋给个位。
如果是算法键,则将对应的算法寄存地址赋上相应算法的值,并且在下一次输入数字时把十位、百位和千位清零以完成下一次的赋值,而这一次的值将转换为一个数储存在相应的地址中。
当按下的是退格键,则将十位赋值给个位,百位赋值给十位,千位赋值给百位然后千位清零。
当按下的是等号键的时候,将前一次储存的数取出与这一次的数进行相应的运算然后将得到的二进制数拆分为个位、十位、百位和千位然后扫描显示就可以。
复位键是使用的中断,当个位、十位、百位和千位都不为零的时候按下将会初始化计算器的所有数据,如果个位、十位、百位和千位均为零这进入休眠状态等待下一次中断的唤醒。
二、硬件设计部分我们使用的是PIC16F877A单片机,使用四位的八段数码管,4×4的键盘和一个独立的中断键。
八段数码管我们使用的是共基极的接法,所以当给出低电平的时候导通,给出高电平的时候关断。
我们以RD端口来控制段选,分别以RB0控制a、RB1控制b、RB2控制c、RB3控制d、RB4控制e、RB5控制f、RB6控制g和RB7控制dp。
以RD1、RD2、RD3和RD4端口分别控制位选的千位、百位、十位和个位。
数电实验2设计报告实验名称:简易计算器 实验目的:1.熟练掌握综合逻辑电路的设计方法及调试方法2.掌握Verilog HDL 数字系统设计方法3.熟悉PLD 实验箱的结构和使用及QuartusII 软件的基本操作4.掌握采用Quartus II 软件和实验箱设计实现逻辑电路的基本过程设计任务及要求:利用LPM 例化元件和适当的中小规模时序、组合逻辑电路设计一个4位简易计算器,实现2个4位二进制数的加、减、乘、除运算,完成主要模块的波形仿真,并将设计下载到实验箱进行功能测试。
要求:1、 用8个开关分别作为2个4位输入数据2、 运算结果用数码管显示电路设计过程:1、 设定加、减、乘、除四个LPM 例化元件加法器:2个四位二进制输入(加数、被加数),1个4位二进制输出(和)减法器:2个四位二进制输入(减数、被减数),1个4位二进制输出(差)乘法器:2个四位二进制输入(乘数、被乘数),1个8位二进制输出(积)除法器:24位二进制输出(分别代表商和余数)2、加入组合逻辑电路和4选一数据选择器,控制进行运算的种类(1)组合逻辑电路输入:功能:为了利用矩阵键盘对计算器对输入数字的加减乘除进行控制,我们画了这个组合逻辑电路,将矩阵键盘的行管脚和列管脚分别为输入后,当(1,1)位置的按键按下,则输出端输出2位2进制数11(控制减法操作),当(2,2)位置的按键按下,则输出端输出2位2进制数10(控制加法操作),当(3,3)位置的按键按下,则输出端输出2位2进制数01(控制乘法操作),当所有按键都没有按下时,输出默认为00,即控制除法操作。
(2)4选一数据选择器功能X1,y1为想要计算的两个4位2进制数,当S0,S1为11的时候,将X1,y1送入减法器输入端,当S0,S1为10的时候,将X1,y1送入加法器输入端,当S0,S1为01的时候,将X1,y1送入乘法器输入端,当S0,S1为00的时候,将X1,y1送入除法器输入端。
目录1 设计目的 (1)2 概要设计 (1)2.1 系统总体分析 (1)2.2 主模块框图及说明 (2)3 详细设计 (3)3.1 主模块及子模块说明 (3)3.2 各模块详细设计 (3)3.2.1 判定运算符模块设计 (3)3.2.2取运算数模块 (3)3.2.3计算模块 (4)3.2.4结果处理模块 (5)3.2.5输出模块 (5)3.2.6错误处理模块 (6)4 程序调试 (7)4.1 运行界面分析 (7)4.2 调试过程及分析 (7)5 心得体会 (8)5.1 设计体会 (8)5.2 系统改进 (8)参考文献 (10)附录 (11)实现加减乘除四则运算的计算器1 设计目的汇编语言是继机器语言后出现的计算机程序设计语言,是计算机所能提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特征并能够直接控制硬件的惟一语言。
因而了解之一语言的特性,并熟练掌握这一语言并应用于开发中便是计算机专业学生所必需掌握的技能之一。
本课程设计通过加减乘除四则运算计算器的设计,增强对于汇编语言寄存器、指令、伪指令、中断等的理解。
可通过编写的汇编程序完成基本的加减乘除四则运算。
主要功能:能实现加减乘除的计算;该程序接受的是16进制数;执行时,需在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:C:\tasm>js 3+252 概要设计2.1 系统总体分析四则运算计算器应当实现对用户输入表达式的处理。
根据用户输入的表达式,完成加减乘除四则运算。
程序自动判定表达式输入,并完成对于输入的16进制数的转换,同时计算结果并以10进制数输出。
对于异常情况程序应当进行处理,保证程序的正确运行。
设计一个计算器,在DOS界面下输入<程序名> <表达式>可直接输出运算结果。
例如在DOS界面中输入JS 3+6,可直接输出9。
程序接受16进制数输入,以十进制数输出运算结果。
对于输出错误情况,程序自动给出错误提示,若输入的格式有误,程序给出“JS <Expression> [10]”(即输入样例)提示,若输入的表达式有误,程序给出“Error in expression !”(即表达式错误)提示。
微机原理实验报告汇编语言课程设计报告( 2012 —- 2013 年度第1 学期)实验名称:实现加减乘除四则运算的计算器专业生物医学工程学生姓名周炳威班级B100904学号B10090406指导教师乐洋实现加减乘除四则运算的计算器1 实验目的深化学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。
通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用2 实验内容课题名称:实现加减乘除四则运算的计算器主要功能:实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。
3 实现方法本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。
此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
第一步,用INT 21H的1号功能调用来进行输入.利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。
我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了.在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错.第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+'号、‘—'号、‘*’号、‘/’号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。
PLC简易计算器设计设计任务书可编程控制器》课程设计设计题目:电子计算器设计XXX:学号:专业(方向)年级:11级电气工程及其自动化学生姓名:word文档可自由复制编辑可编程控制器课程设计任务书一)设计题目电子计算器设计二)情况简介在人们日常生活中,买东西、记账、研究等等,凡是与数有关的,我们都可以用到计算器,可见计算器真的很重要。
本文中基于PLC设计的电子计算器比传统计算器更可靠,更方便,性能更好,更容易适应当今高速发展的社会,方便了人们的生活。
这次设计中,将选用西门子S7-200系列PLC,通过梯形图和编程指令两种手段来实现简易计算器的加减乘除功能。
基于PLC设计的电子计算器能够完成简单的加减乘除功能,并能够用七段数码管显示相应的数字及结果,同时也能指示相应的运算类型。
该计算器将采用梯形图编写来实现4位数范围内的加减乘除基本的四则运算。
PLC是一个可进行数模、模数转换,可进行定位控制等一个功能强大的工业控制器,具有高可靠性,以它为基础制作的计算器将具有很高的可靠性。
(三)设计要求1.由按键输入的数值显示在7段数码管上,但只限4位数。
2.按加、减、乘、除键时,第一次输入的值被存放在缓冲区中,当做被加、减、乘、除数,且加、减、乘、除相对的运算指示灯会亮。
3.接着输入一个数,之后若是按下“=”键,则此加、减、乘、除数被存放于另一个缓冲区中,与刚才输入的数做运算,且相对应的运算指示灯熄灭。
4.将运算结果显示在7段数码管上。
四)设计步骤1.查找资料,了解和分析题目所要求具体工程项目控制的过程。
2.确定I/O点数,选择PLC的型号,并根据需要进行硬件系统配置。
3.绘制外部I/O接线图及相干的电气原理图。
4.编程。
word文档可自由复制编辑5.调试。
6.编写设想说明书。
五)设想说明书请求①.完整的设想义务书。
②.确定I/O点数,选择PLC的型号,完成系统组态或硬件配置。
③.正确合理地进行编程元件的地址分配。
汇编语言课程设计报告实现加减乘除四则运算的计算器实现加减乘除四则运算的计算器目录1 概述 (1)1.1 课程设计目的 (1)1.2 课程设计内容 (1)2 系统需求分析 (1)2.1 系统目标 (1)2.2 主体功能 (2)3 系统概要设计 (2)3.1 系统的功能模块划分 (2)3.2 系统流程图 (3)4系统详细设计 (4)5 测试 (5)5.1 正确输出 (5)5.2 实际输出 (6)6 小结 (7)参考文献 (8)附录 (9)附录1 源程序清单 (9)汇编语言课程设计报告(2011)实现加减乘除四则运算计算器的设计1 概述1.1 课程设计目的运用汇编语言,实现简单计算器的一般功能.通过该程序设计,让我们熟悉并掌握DOS系统功能调方法用及BIOS系统功能调用方法,同时在程序设计过程中熟悉并掌握各种指令的应用,知道编程的具体流程,以及掌握DEBUG的一系列的功能执行命令,及用它进行调试,运行功能。
汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。
由于汇编语言如此的接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。
由此可见汇编语言的重要性,学好这门课程,同样可为相关的专业打下基础。
汇编语言程序设计课程设计是在教学实践基础上进行的一次试验,也是对该课程所学理论知识的深化和提高。
因此,要求学生能综合应用所学知识,设计和制造出具有具有一定功能的应用系统,并且在实验的基本技能方面进行了一次全面的训练。
此外,它还可以培养学生综合运用所学知识独立完成汇编程序课题的能力,使学生能够较全面的巩固和应用课堂上所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。
它同样可以提高学生运用理论去处理实际问题的能力和独立思考的能力,使学生的编程思想和编程能力有所提高,最终达到熟练地掌握编写汇编源程序的基本方法的目的。
1.2 课程设计内容设计一个能实现加减乘除取余计算的程序。
汇编语言课程设计报告( 2010 -- 2011 年度第 2 学期)课题名称: 实现加减乘除四则运算的计算器专业 计算机科学与技术学生姓名 汤浩军班级 B 计算机091学号 0910704117指导教师 王 志 宏完成日期2011年6月24日目录1设计目的 (1)2概要设计 (2)2.1 系统总体分析 (2)2.2 主模块框图及说明 (2)3 详细设计 (4)3.1 主模块及子模块说明 (4)3.2 各模块详细设计 (4)4.程序调试 (6)4.1 运行界面分析 (6)4.2 算法的分析 (6)4.3 调试过程及分析 (6)5小结 (7)5.1 设计总结 (7)参考文献 (8)源程序清单 (9)1设计目的通过本次的课程设计,加深对汇编语言的了解,应用《汇编语言程序设计教程》等所学相关知识及查阅资料,完成加减乘除计算器的设计,以达到理论与实践更好的结合,进一步提高自身的水平和对汇编语言的认识。
2概要设计2.1 系统总体分析本次设计的加减乘除四则运算的计算器,主要是为了解决数学中的加、减、乘、除四则运算的问题。
由于在设计过程中考虑到了可能会多次计算数据,为此本次课程设计的这个计算器可以一次运行,多次使用。
2.2 主模块框图及说明本程序的功能结构图如图2-1:图 2-1功能结构图程序流程图如图2-2:图2-2流程图3 详细设计3.1 主模块及子模块说明主模块:主要完成程序的主体框架结构,提供人-程序的交互。
子模块:主要完成对数据的加工,处理。
3.2 各模块详细设计主模块:首先提供一个主界面,提示用户按要求输入具体的数据和所要进行的操作,输入完毕后给出结果。
如果输入过程中发现非法输入,则立即给与提示,程序自动刷新界面,提示继续输入。
整个过程按“ESC”结束。
流程图如下图3-1:图3-1 主模块流程图子模块:完成对数据的进一步加工处理,转换格式并得出结果。
首先根据输入调用对应的“+”、“-”、“*”、“/”四大函数模块,这是本程序的核心模块,其他部分的一些小模块都是为这几大模块服务的,大致的流程图如下图3-2:Y图3-2 子模块流程图4.程序调试4.1 运行界面分析运行界面如图4-1图4-1 运行界面在NUM1这一行会提示输入第一个数据,NUM2这一行提示输入第二个数据,输入完成两个数据后程序会提示允许输入运算符,输入无误后在RESULT行显示结果。
汇编语言课程设计实验报告一、课程设计目的《汇编语言程序设计》是计算机专业一门重要的核心课程,也是一门实践性很强的课程,而课程设计则是其中一个重要的应用实践环节。
本次课程设计的目的是提高分析问题、解决问题的能力以及实际动手能力,进一步加深对汇编语言程序设计基本理论的理解,熟练掌握汇编语言程序上机调试的方法技巧、结构化程序设计技术及高级汇编语言技术,能编写较复杂的应用程序,为学习后继课程打下扎实的基础二、实验环境编译机器:IBM兼容PC操作系统:Windows XP -SP2 中文版编译工具:MASM 5.0三、课程设计内容1、编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示:-278+32=-132――12=11*-32=-1234/-18=要求程序能接收键入的算式,在接收到‘=’号时,计算并以有符号十进制数的形式显示结果,然后允许用户继续键入算式。
如果键入算式后再键入‘.’,则显示结果并结束整个程序。
(‘/’为整除)程序设计框图:程序源代码:2、已知一个由英语单词组成的字符串已按字典序排好,每个单词以空格符为结束,该串的首二字节为16位无符号二进制数,用以说明串的长度。
试编程能从键盘上输入单词(以空格字符为结束),若字符串中没有该单词,则将该单词插入该串适当的位置,使其仍保持字典序,并修改串长度,显示单词在串中位置及串长度;若字符串中有该单词,则显示字符串中所有包含该单词的单词,及其在字符串中的位置。
程序设计框图:程序代码:DATA SEGMENT; DICTIONARY 字典字符串,首两个字节为 16 位无符号二进制数,说明字符串长度。
DICTIONARY DB 00,16H,"add an book dad egg "DB 100H DUP(20H) ; 空的缓冲区。
MSG_INTRO DB "Input the Word to Search : ","$"MSG_NOTFOUND DB "Not Found, Now Insert it . ",0AH,0DH,"$"MSG_NEWDICT DB 0AH,0DH,"New Dictionary : ","$"MSG_FOUND DB 0AH,0DH,"Found Word in Dictionary : ","$"MSG_POSITION DB 0AH,0DH,"Position : ","$"MSG_DICTLENGTH D B 0AH,0DH,"New Dictionary Length : ","$"MSG_NEWLINE DB 0AH,0DH,"$"BUFFER DB 10H DUP(20H) ; BUFFER 用于保存需要查询的单词。
目录1.设计目的..................................................... 2.总体设计.....................................................2.1 系统总体分析......................................................2.2 主模块框图及说明.................................................. 3.详细设计.....................................................3.1 主模块及子模块说明................................................3.2 各模块详细设计.................................................... 4.程序调试.....................................................4.1 运行界面分析......................................................4.2 算法的分析........................................................4.3 调试过程及分析.................................................... 5.心得体会.....................................................5.1 设计体会..........................................................5.2 系统改进.......................................................... .参考文献.......................................................致谢摘要汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。
FPGA_实验⼩项⽬:四位运算⼩计算器最近在武汉参加⾄芯科技的FPGA培训,经过了第⼀周的强化基础培训,我们掌握了分频模块的书写,以及按键消抖的书写,还有就是边沿检测的⽅法,当然按键消抖模块我们这⾥⽤到的是通过移位打拍然后相或的⽅法,达到了消抖的⽬的,不过运⽤过程中这种⽅法也会遇到⼀些BUG,⽐如时间过短的问题,所以我计划是好要学习⼀下按键消抖的状态机的实现⽅法,除了这些还有7段数码管的显⽰驱动的编写,状态机与TB⽂件的编写,常⽤加法期间_74ls161的驱动等等。
这⾥就不赘述了,当然还有另外⼀个实验,数字钟的实现的实验,这个实验会在另外⼀篇随笔中详述。
现在开始今天这次四位运算⼩计算器的实现,设计之前⾸先得明确要实现的功能,以及按照⽼师所说,⾃顶向下的设计思路,⾸先要明确顶层模块需要有哪些输⼊以及输出,然后顶层以下有哪些模块构建。
⾸先明确四则运算模块的实现需要哪些⼦模块构成:1. 7段数码管显⽰模块2. 4*4键盘码扫描分析电路3.算数逻辑运算模块4.数制转换模块:涉及BCD转bin bin转BCD5.运算操作状态机的书写⾸先是7段数码管显⽰模块的书写,这⼀任务在第⼀周的培训中已经讲解,并已经写出,参考我原来写的7段数码管显⽰原理的介绍。
其中在计算模块时要先对码制进⾏转换,计算器只能对⼆进制码进⾏运算,⽽显⽰的时候要显⽰BCD码,所以要对其进⾏转换,就要编写bin2BCD 和BCD2bin模块。
此次设计的计算器可实现的功能有:可以实现4位以内的加减乘除,以及固定两位⼩数的运算。
矩阵键盘与数码管显⽰模块已经写出,现在主要说⼀下操作输⼊输出控制这⼀模块。
因为要考虑⼩数的计算,所以对应的要显⽰⼩数点的标志位。
第⼀个操作数显⽰,操作符显⽰,第⼆个操作数显⽰,以及连续运算模块。
module key2bcd1 (clk,rst_n,real_number,opcode,BCDa,BCDb,result ,iKey);input [4:0] real_number;input rst_n,clk;input iKey;// ⼩数点控制位input [24:0] result;output reg [24:0] BCDa,BCDb;output reg [3:0] opcode;reg [3:0] opcode_reg;reg [3:0] state;reg datacoming_state,datacoming_flag;// ,rst_dian;reg dian_flag;//always @( posedge rst_dian or negedge iKey)// begin// if(rst_dian)// dian_flag <= 0;// else// dian_flag <= 1;// endalways @(posedge clk)if (!rst_n)begindatacoming_state <=0;datacoming_flag <=0;endelseif (real_number!=17)case(datacoming_state)0: begindatacoming_flag <=1;datacoming_state <=1;end1: begindatacoming_flag <=0;datacoming_state <=1;endendcasedatacoming_state <= 0;datacoming_flag <= 0;endreg [2:0] i;always @ (posedge clk or negedge rst_n)beginif(!rst_n)beginBCDa <= 0;BCDb <= 0;state <= 0;opcode <= 0;dian_flag <=1;i<=0;endelse if (iKey)dian_flag <= 1;elseif(datacoming_flag)begincase(state)0: case(real_number)0,1,2,3,4,5,6,7,8,9:if(!dian_flag)BCDa[23:8] <={BCDa[19:8],real_number[3:0]};else if (dian_flag==1 && i==0)beginBCDa[7:4] <= real_number [3:0];i <= i+1;endelse if(dian_flag==1 && i==1)beginBCDa[3:0] <= real_number [3:0];end// begin// BCDa[23:0] <= {BCDa[19:0],real_number[3:0]};// state <= 0;// end10,11,12,13:beginopcode_reg <= real_number[3:0];state <= 1;i <=0;dian_flag <=0;end15:beginBCDa[24]= ~BCDa[24];state <= 0 ;enddefault:state <= 0;endcase1: case(real_number)0,1,2,3,4,5,6,7,8,9:beginopcode <= opcode_reg;dian_flag <=0;if(!dian_flag)BCDb[23:8] <={BCDb[19:8],real_number[3:0]};else if (dian_flag && i==0)beginBCDb[7:4] <= real_number [3:0];i <= i+1;endelse if(dian_flag && i==1)beginBCDb[3:0] <= real_number[3:0];endend// if(!dian_flag)// BCDa[23:8] <={BCDa[19:8],real_number[3:0]};// else if (dian_flag && i=1)// begin// BCDa[7:4] <= real_number [3:0];// i <= i+1;// end// else if(dian_flag && i=2)// begin// BCDa[3:0] <= real_number [3:0];// end14:beginBCDa <= result;BCDb <= 0;opcode <= 0;state <= 2;i <=0;dian_flag<=0;end15:beginBCDb[24]= ~BCDb[24];state <= 1;enddefault:state <= 1;endcase// 连续运算模块2:begindian_flag<=1;case( real_number)0,1,2,3,4,5,6,7,8,9:beginBCDa <= {real_number,8'h00};state <= 0;end10,11,12,13:beginopcode_reg <= real_number[3:0];state <= 1;end15:beginBCDa[24]= ~BCDa[24];state <= 2 ;enddefault:state <= 2;endcaseenddefault : state <= 0;endcaseendendendmodule计算模块中涉及到的理论图:计算时是利⽤⼆进制来进⾏的所以要先利⽤bcd2bin模块来进⾏码制转换。
汇编语言课程设计实验报告一、课程设计目的《汇编语言程序设计》是计算机专业一门重要的核心课程,也是一门实践性很强的课程,而课程设计则是其中一个重要的应用实践环节。
本次课程设计的目的是提高分析问题、解决问题的能力以及实际动手能力,进一步加深对汇编语言程序设计基本理论的理解,熟练掌握汇编语言程序上机调试的方法技巧、结构化程序设计技术及高级汇编语言技术,能编写较复杂的应用程序,为学习后继课程打下扎实的基础二、实验环境编译机器:兼容操作系统:中文版编译工具:三、课程设计内容、编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示:-+=-――=*-=-/-=要求程序能接收键入的算式,在接收到‘=’号时,计算并以有符号十进制数的形式显示结果,然后允许用户继续键入算式。
如果键入算式后再键入‘.’,则显示结果并结束整个程序。
(‘/’为整除)程序源代码:、已知一个由英语单词组成的字符串已按字典序排好,每个单词以空格符为结束,该串的首二字节为位无符号二进制数,用以说明串的长度。
试编程能从键盘上输入单词(以空格字符为结束),若字符串中没有该单词,则将该单词插入该串适当的位置,使其仍保持字典序,并修改串长度,显示单词在串中位置及串长度;若字符串中有该单词,则显示字符串中所有包含该单词的单词,及其在字符串中的位置。
程序设计框图:程序代码:; 字典字符串,首两个字节为位无符号二进制数,说明字符串长度。
," "() ; 空的缓冲区。
" : ","$"" , . ","$"," : ","$"," : ","$"," : ","$"," : ","$","$"() ; 用于保存需要查询的单词。
学院:班级:姓名:学号:课程设计题目:四则运算计算器课程名称:汇编语言与微机原理评阅成绩:评阅意见:成绩评定教师签名:日期:年月目录概述 (1)一、设计要求 (1)二、设计思想 (1)三、程序工作原理 (2)四、程序流程图及说明 (3)五、程序源代码 (7)六、程序运行示例 (18)七、设计过程中遇到的问题及解决方法 (18)八、设计心得 (19)九、参考文献 (19)四则运算计算器概述此计算器,可以实现从键盘输入一个十进制的四则运算表达式,如:-3+4*(5-6)-8/2,编程计算表达式的值,输出十进制结果。
表达式和结果可以是三位或四位十进制,也可以是带负数的十进制数,并且+-*/()位置任意摆放(只要符合数学上的运算逻辑)。
一、设计要求用汇编语言设计一个程序,用来实现计算器的四则运算功能。
需要实现在屏幕要显示输入的表达式,以及运算结果。
例如:-3+4*(5-6)-8/2计算表达式的结果,并将该表达式及结果显示出来;设计要求如下:(1)由键盘作为输入部分。
(2)能进行四则混合运算,并且能计算带括号和负数的数学表达式。
(3)按ESC 键则退出计算器菜单界面并返回dos 系统,否则继续输入表达式,求得对应的结果。
二、设计思想根据题目的要求,可以把整个源程序大致划分六大步骤。
(1)首先键盘输入合法中缀算术表达式,并将其存储到S1中。
(2)然后调用子程序CHANGE将中缀式转化为后缀式。
(3)调用子程序CALCULATE对后缀表达式进行有符号数的运算,并将最终结果存放在栈中。
(4)POP AX,AX->STORAGE,即用STORAGE 存放最终运算结果。
(5)调用子程序OUTPUT将运算结果输出。
(6)通过用键盘输入ESC退出DOS程序。
三、程序工作原理步骤一的原理:此处用系统功能1号调用,每次从键盘输入一个字符,就将其存入到数组S1中,然后在判断此字符是否为回车,如果不是,则循环,继续输入字符,否则,程序往下执行。
编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示:-278+32=-132――12=11*-32=-1234/-18=要求程序能接收键入的算式,在接收到‘=’号时,计算并以有符号十进制数的形式显示结果,然后允许用户继续键入算式。
如果键入算式后再键入‘.’,则显示结果并结束整个程序。
(‘/’为整除)data segmentinputstring db 0dh,0ah,'Please input the equaltion(s):$'errorstring db 0dh,0ah,'The inputstring is wrong!$'endstring db 0dh,0ah,'The Pragramm has ended.$'bufferstring db 80 dup(?) ;保存输入的字符串number1 dw 0 ;保存第一个操作数number2 dw 0 ;保存第二个操作数number1sign db '+' ;第一个数的符号此初始化是为了判断此数字没有符号number2sign db '+' ;第二个数的符号computesign db '#' ;运算符号total dw 0 ;记录字符总个数test1 dw 1 ;判断有符号的数据的符号位之后第一个数据是否为运算符yanzheng db 0dh,0ah,'Please enter string again$' ;此字符串仅仅是用来验证输出结果做调试用可以删除test2 dw 0 ;此数据是判断第一个字符是否有符号data endscode segmentmain proc farassume cs:code,ds:databegin:push dsxor ax,axpush axmov ax,datamov ds,axstart1:mov number1sign,'+'mov number2sign,'+'mov computesign,'#' ;对所有的数据进行初始化必须的mov ax,0mov bx,0mov di,0mov si,0mov cx,0mov dx,0mov test1,1mov test2,0mov total,0mov number1,0mov number2,0mov dx,offset inputstring ;显示输入提示信息mov ah,09h ;输出提示信息int 21hnewchar:mov ah,01h ;输入字符int 21hcmp al,'.' ;程序完全结束情况*******注意'='以及'.'并没有存入字符数组之中*******jz show1cmp al,'=' ;允许用户继续输入等式jz show2sub al,30hjl inputcmp al,9djg inputmov bufferstring[si],alinc siinc total ;存储字符的总个数jmp newcharinput:add al,30hmov bufferstring[si],alinc siinc totaljmp newcharshow1:mov cx,total ;判断用户是否只输入一个'.'字符如果是则直接退出cmp cx,0jz xianshicall checkxianshi:mov dx,offset endstring ;显示输入错误mov ah,09hint 21hjmp exitshow2:call check ;以'='结束的字符串处理jmp start1exit:mov ah,4ch ;退出返回DOS系统int 21hmain endpcheck proc near ;第一个数的识别过程mov si,0newchar1:mov al,bufferstring[si] ;这里只取第一个字符进行判断cmp al,'-' ;查看字符串的第一个字符是'+'或者'-'或者整数是整数的话直接进行操作jz ZFshucmp al,'+'jz ZFshucmp al,0djl error ;此处error是用来处理第一个不是此三种情况的错误现在暂时未添加cmp al,9djg errorjmp nonfuhao ;如果能执行到此则说明第一个数是无符号数已经将'+'赋值给第一个数的符号ZFshu:call check1 ;转入后续操作数运算符第二个操作数的识别操作jmp exit1nonfuhao:mov test2,1 ;用来提供下面判断的依据如果test2为1 则说明是无符号数不需要赋值符号位call check1jmp exit1error:mov dx,offset errorstring ;结束信息输出mov ah,09hint 21hexit1:retcheck endpcheck1 proc nearcmp test2,1jz count1mov number1sign,al ;记录第一个数据的符号inc sisub total,1 ;因为此处是从字符数组的第二个数据开始识别所以total-1jmp countcount1:sub total,1 ;此处也要记得总数-1mov si,0count: ;读取第一个操作数mov al,bufferstring[si]cmp al,'+'jz compute1 ;如果是这些运算符则开始识别第二个数据cmp al,'-'jz compute1cmp al,'*'jz compute1cmp al,'/'jz compute1cmp al,0djl error1cmp al,9djg error1cbw ;如果能够执行到此说明此字符一定为0-9的数字而不是运算符则进行转换xchg ax,bxmov cx,10dmul cxxchg ax,bxadd bx,axmov number1,bx ;保存数据于number1mov test1,0 ;如果已经输入数据了则将test1赋值1inc si ;记录指针cmp total,sijge countcompute1:cmp test1,1 ;如果之前已经取数据则test1的值已经被修改为0 jz error1 ;如果此处为1 则说明第一个操作数之后紧接着是另一个运算符则出错mov bx,0mov computesign,al ;记录为运算符号inc si ;记录第二个操作数的符号判断count2:mov al,bufferstring[si]cmp al,'+' ;此处既是第二个操作数的符号然后直接进行读数操作即可jz compute2cmp al,'-'jz compute2cmp al,0djl error1cmp al,9djg error1cbw ;如果能够执行到此说明此字符一定为0-9的数字则进行转换xchg ax,bx ;此表明第二个操作数也是没有符号的mov cx,10dmul cxxchg ax,bxadd bx,ax ;十进制数据最终存放在bx中mov number2,bx ;保存数据于number2inc si ;记录指针cmp total,sijge count2call computionjmp exit2compute2:mov number2sign,al ;保存第二个操作数的符号inc si ;第二个操作数符号的下一位count3:mov al,bufferstring[si]cmp al,0djl error1cmp al,9djg error1cbw ;如果能够执行到此说明此字符一定为0-9的数字则进行转换xchg ax,bxmov cx,10dmul cxxchg ax,bxadd bx,ax ;十进制数据最终存放在bx中mov number2,bx ;保存数据于number2inc si ;记录指针cmp total,si ;判断是否越界jge count3call compution ;第二个数据识别完毕则进行运算jmp exit2error1: ;错误处理***当输入表达式错误的时候这边能够识别***mov dx,offset errorstringmov ah,09hint 21hmov dx,offset yanzhengmov ah,09hint 21hexit2:retcheck1 endpcompution proc near ;上面过程已经将运算符和操作数的运算符取出下面进行相应的操作cmp computesign,'*'jz multiply1cmp computesign,'/'jz devide11cmp computesign,'+'jz plus1cmp computesign,'-'jz minus1jmp exit3multiply1:call multiplyjmp exit3devide11:call dividejmp exit3plus1:call plusjmp exit3minus1:call minusexit3:retcompution endpmultiply proc near ;两个数的乘法运算mov ax,number1mov cx,number2 ;先行计算两个数的乘积然后判断符号mul cxmov bx,axmov dl,number1signcmp dl,number2sign ;相同则输出'+'jz multmov dl,'-' ;不同则输出'-'mov ah,02hint 21hmult:call showretmultiply endpdivide proc near ;除法运算mov ax,number1mov cx,number2 ;做法与乘法相同div cxmov bx,axmov dl,number1signcmp dl,number2signjz dividmov dl,'-'mov ah,02hint 21hdivid:call showretdivide endpplus proc nearmov dl,number1sign ;判断符号是否相等cmp dl,number2signjz first3mov bx,number1 ;整体思想就是如果符号相同则进行相加然后先输出符号再输出结果cmp bx,number2 ;如果不相同则用较大数据减去小数据然后判断大数的符号进行输出jg first333mov bx,number2sub bx,number1cmp number2sign,'-'jz outputfuhaooutputzheng:mov dl,'+' ;输出'+'mov ah,02hint 21hcall showjmp exit4first333:sub bx,number2cmp number1sign,'+'jz outputzhengoutputfuhao:mov dl,'-'mov ah,02hint 21hcall showjmp exit4first3:mov bx,number1 ;两者符号相同一定为'+'操作add bx,number2cmp number1sign,'-'jz first33mov dl,'+'mov ah,02hint 21hcall showjmp exit4first33:mov dl,'-'mov ah,02hint 21hcall showexit4:retplus endpminus proc nearmov dl,number1sign ;如果符号相同则用较大数减去小数判断大数的符号然后输出符号cmp dl,number2sign ;如果符号不同则相加然后输出number1signjz first4mov bx,number1add bx,number2cmp number1sign,'-'jz first444first56:mov dl,'+'mov ah,02hint 21hfirst44:call showjmp exit5first444:mov dl,'-'mov ah,02hint 21hjmp first44first4:mov bx,number1cmp bx,number2jge first5mov bx,number2sub bx,number1cmp number1sign,'+'jz first444jmp first56first5:sub bx,number2mov dl,number1signmov ah,02hint 21hcall showexit5:retminus endpshow proc NEAR ;将存放在bx中的数据进行输出mov cx,10000dcall dec_divmov cx,1000dcall dec_divmov cx,100dcall dec_divmov cx,10dcall dec_divmov cx,1dcall dec_divretdec_div proc nearmov ax,bxmov dx,0div cxmov bx,dxmov dl,alcmp dl,0jz exit6add dl,30hmov ah,02hint 21hexit6:retdec_div endpshow endpcode endsend begin ;搞定嘎嘎……………………。
目录一.设计内容 (2)二.设计方案 (2)1.主程序模块. (2)2.赋权值模块. (2)3.加减乘除运算子程序模块. (2)4.调用赋权宏子程序模块. (2)5.回车换行宏模块. (2)6.9号功能显示字符串宏模块. (2)三.设计框图 (3)四.程序代码 (4)五.运行结果 (9)六.设计总结 (9)计算器汇编语言程序设计一.设计内容从键盘输入一个十进制两位数的四则运算表达式,如23*56-(8*19)/6+67-8=,编程计算表达式的值,输出十进制结果(有可能是三位或四位十进制),+-*/位置任意。
并要求程序能反复执行直道对“还要继续吗?(y/n)”之类的提示回答“n”或“N”为止。
四则运算主要包括以下几个模块:(1)主程序模块.(2)赋权宏模块.(3)加减乘除运算子程序模块.(4)调用赋权宏子程序模块.(5)回车换行宏模块.(6)9号功能显示字符串宏模块.二.设计方案1.主程序模块.主程序初始化数据段,调用显示宏show显示界面,输入字符或数字并判断,调用子程序dyfq调用赋权宏fq为符号赋权,从而判断优先级,调用加减乘除运算子程序ys对判断出的相应运算符进行运算,输出运算结果,判断是否继续,继续则返回输入,不继续则退出程序.2.赋权宏模块.通过定义宏fq,定义了变元a,b进行参数传递,并使用替换运算符&使变元a与标号s对应.接着给对应的符号赋予权值,将其权值存入ch中.3.加减乘除运算子程序模块.运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的符号是否为乘号*,若为乘号*则将number中的数字与其下一位的数字相乘,并把结果存入该位置,类似的若不为乘号*则接着判断是否为除号/,若为除号/则进行除法运算,然后判断是否为加法,为加法则进行加法运算,接着判断是否为减法,为减法则进行减法运算并将结果存入当前的计算的第二个数的位置.4.调用赋权宏子程序模块.该模块实现了调用赋权宏fq为(,),*,/,+,-,=等符号分别赋权值为5,1,4,4,3,3,0.从而可以通过设定的权值来判断优先级.5.回车换行宏模块.通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将0ah赋予dl输出,从而实现回车换行功能.6.9号功能显示字符串宏模块.通过定义宏show,用9号显示功能,通过变元str将字符串显示出来。
python简易计算器代码Python是一种高级编程语言,因其简洁、易学、易读的特点而备受青睐。
Python可以用于各种应用程序开发,包括网络、桌面、移动设备等。
本文将介绍如何使用Python编写一个简易计算器。
我们需要了解Python的基本语法。
Python是一种动态类型语言,这意味着我们不需要在代码中声明变量的类型。
例如,我们可以使用以下代码创建一个变量并将其值设置为5:```x = 5```Python也支持各种运算符,例如加法、减法、乘法和除法。
我们可以使用这些运算符在Python中执行基本数学运算。
例如,以下代码将两个变量相加并将结果打印到屏幕上:```x = 5y = 10z = x + yprint(z)```这将输出15,因为5加上10等于15。
现在,我们可以开始编写我们的简易计算器。
我们将使用Python 的控制台窗口作为我们的计算器界面。
首先,让我们创建一个简单的菜单,让用户选择要执行的操作。
我们将使用Python的input 函数来获取用户的输入。
以下是我们的菜单代码:```print("请选择要执行的操作:")print("1. 加法")print("2. 减法")print("3. 乘法")print("4. 除法")choice = input("请选择操作(1/2/3/4):")```上述代码将输出一个简单的菜单,然后等待用户输入。
用户可以选择执行加法、减法、乘法或除法操作。
一旦用户选择了操作,我们将使用Python的条件语句来执行相应的操作。
以下是我们的条件语句代码:```if choice == "1":num1 = input("请输入第一个数字:") num2 = input("请输入第二个数字:") result = float(num1) + float(num2) print("结果:", result)elif choice == "2":num1 = input("请输入第一个数字:") num2 = input("请输入第二个数字:") result = float(num1) - float(num2) print("结果:", result)elif choice == "3":num1 = input("请输入第一个数字:") num2 = input("请输入第二个数字:") result = float(num1) * float(num2) print("结果:", result)elif choice == "4":num1 = input("请输入第一个数字:") num2 = input("请输入第二个数字:") result = float(num1) / float(num2) print("结果:", result)else:print("无效的选择")```上述代码将根据用户的选择执行相应的操作。
课程设计报告课程名称:单片机原理与接口技术课程设计设计题目:简单计算器院系:机电工程学院班级:2010级电气工程及其自动化专业姓名:学号:指导教师:史丽萍,闫广明,张波,张扬,王冠然设计时间:2013年12月一、设计方案描述与论证我们所设计的是一个简单计算器,它具有四位数以内的整数加减乘除运算。
可以在输入错误的时候退格,也可以初始化。
在初始化的状态下可以进行关机以减少耗能。
显示使用的数码管扫描显示的方法来显示数字,所以我们每一次运算前我们都需要将个位、十位、百位和千位相结合。
我们使用的是4×4的键盘,检测的时候是进行键盘扫描来完成确定哪一个键被摁下,然后是否释放。
键盘被摁下后,先判断是什么键。
如果是数字键,则进行数的输入,首先先把百位的数值赋给千位,十位赋给百位,个位赋给十位,然后把摁下键的对应数赋给个位。
如果是算法键,则将对应的算法寄存地址赋上相应算法的值,并且在下一次输入数字时把十位、百位和千位清零以完成下一次的赋值,而这一次的值将转换为一个数储存在相应的地址中。
当按下的是退格键,则将十位赋值给个位,百位赋值给十位,千位赋值给百位然后千位清零。
当按下的是等号键的时候,将前一次储存的数取出与这一次的数进行相应的运算然后将得到的二进制数拆分为个位、十位、百位和千位然后扫描显示就可以。
复位键是使用的中断,当个位、十位、百位和千位都不为零的时候按下将会初始化计算器的所有数据,如果个位、十位、百位和千位均为零这进入休眠状态等待下一次中断的唤醒。
二、硬件设计部分我们使用的是PIC16F877A单片机,使用四位的八段数码管,4×4的键盘和一个独立的中断键。
八段数码管我们使用的是共基极的接法,所以当给出低电平的时候导通,给出高电平的时候关断。
我们以RD端口来控制段选,分别以RB0控制a、RB1控制b、RB2控制c、RB3控制d、RB4控制e、RB5控制f、RB6控制g和RB7控制dp。
以RD1、RD2、RD3和RD4端口分别控制位选的千位、百位、十位和个位。
键盘我们使用RC端口扫描的方法来实现4×4的键盘。
其中RC0、RC1、RC2和RC3端口分别设置为输出,RC4、RC5、RC6和RC7端口设置为输入。
两组端口分别接入键盘的行和列。
RC4、RC5、RC6和RC7端口再通过10K的电阻接VCC以实现为高电平。
键盘扫描的时候,首先RC0、RC1、RC2和RC3端口均输入为低电平0,判断RC4、RC5、RC6和RC7端口是否全为高电平1,如果是则无按键被按下。
如果不全为高电平1则证明有按键被按下。
这时需要依次将RC0、RC1、RC2和RC3端口置低电平0,检测RC4、RC5、RC6和RC7端口何时有一个变为低电平0,这时可以对应出哪一个按键被按下。
中断键是单独接出的,外接电容增加其稳定性,减少被摁下是的抖动。
三、软件设计部分主程序流程图键盘扫描子程序流程图第0、1、2、3、4、5、6、第7号键8、9、A号键子程序第C、D、E、F键子程序按键释放子程序流程图加法子程序流程图减法子程序流程图乘法子程序流程图除法子程序流程图十进制转换二进制程序流程图二进制转换十进制程序流程图睡眠子程序流程图中断子程序流程图源程序:;********************************************************************** ; * ; Filename: xxx.asm * ; Date: * ; File Version: *; * ; Author: * ; Company: * ; * ; * ;********************************************************************** ; * ; Files required: *; * ; *; *;**********************************************************************; *; Notes: *; *; *; *; *;**********************************************************************list p=16f877A ; list directive to define processor#include <p16f877A.inc> ; processor specific variable definitions__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _LVP_OFF & _DEBUG_ON & _CPD_OFF;***** V ARIABLE DEFINITIONSw_temp EQU 0x71 ; variable used for context savingstatus_temp EQU 0x72 ; variable used for context savingGE EQU 0x40SHI EQU 0x41BAI EQU 0x42QIAN EQU 0x43S1H EQU 0x44S1L EQU 0x45S2H EQU 0x46S2L EQU 0x47R1H EQU 0x48R1L EQU 0x49M1H EQU 0x4AM1L EQU 0x4BM2H EQU 0x4CM2L EQU 0x4DM3H EQU 0x4EM3L EQU 0x4FR2H EQU 0x50R2L EQU 0x51SHUH EQU 0x52SHUL EQU 0x53SHURUSHU EQU 0x54SHU1H EQU 0x55SHU1L EQU 0x56P1H EQU 0x57P1L EQU 0x58FUHAO EQU 0x59D1H EQU 0x5AD1L EQU 0x5BD2H EQU 0x5CD2L EQU 0x5DD3H EQU 0x5ED3L EQU 0x5FJIESHU EQU 0x60COUNT EQU0x61.ZHONG EQU 0x62DUI1 EQU 0x63DUI2 EQU 0x64JIANGE EQU 0x65;**********************************************************************ORG 0x000 ; processor reset vectorclrfPCLATH; ensure page bits are cleared goto MAIN ; go to beginning of programORG 0x004 ; interrupt vector locationmovwf w_temp ; save off current W register contentsmovf STA TUS,w ; move status register into W registermovwf status_temp ; save off contents of STA TUS register; isr code can go here or be located as a call subroutine elsewhereCALL DELAYCALL DELAYCALL DELAYCALL DELAYBTFSS PORTB,0GOTO N1MOVLW 00HSUBWF GEBTFSS STA TUS,ZGOTO CLEARAMOVLW 00HSUBWF SHIBTFSS STA TUS,ZGOTO CLEARAMOVLW 00HSUBWF BAIBTFSS STA TUS,ZGOTO CLEARAMOVLW 00HSUBWF QIANBTFSS STA TUS,ZGOTO CLEARAINCF ZHONGGOTO N1CLEARA CALL CLEARCLRF FUHAOCLRF ZHONGCLRF JIESHUN1 BCF INTCON,INTFmovf status_temp,w ; retrieve copy of STATUS registermovwf STA TUS ; restore pre-isr STATUS register contentsswapf w_temp,fswapf w_temp,w ; restore pre-isr W register contentsretfie ; return from interruptCHABIAO ADDWF PCL,FRETLW 0xC0RETLW 0xF9RETLW 0xA4RETLW 0xB0RETLW 0x99RETLW 0x92RETLW 0x82RETLW 0xF8RETLW 0x80RETLW 0x90MAIN; remaining code goes hereBSF STA TUS,RP0CLRF TRISDBSF TRISB,0BCF TRISE,0BCF TRISB,1BCF TRISB,2BCF TRISB,3BCF TRISB,4BCF TRISC,0BCF TRISC,1BCF TRISC,2BCF TRISC,3BSF TRISC,4BSF TRISC,5BSF TRISC,6BSF TRISC,7BCF STA TUS,RP0BSF PORTB,1BSF PORTB,2BSF PORTB,3BSF PORTB,4CLRF PORTCBSF INTCON,INTEBSF INTCON,GIEBCF INTCON,INTFCLRF ZHONGLOOPN MOVLW 00HMOVWF GEMOVLW 00HMOVWF SHIMOVLW 00HMOVWF BAIMOVLW 00HMOVWF QIANMOVLW 0xFFMOVWF JIESHUCLRF S1LCLRF S1HCLRF SHU1LCLRF SHU1HCLRF S2LCLRF S2HCLRF R1LCLRF R1HCLRF R2LCLRF R2HCLRF SHUHCLRF SHULCLRF JIESHULOOP BTFSC ZHONG,0GOTO GUANMOVF GE,WCALL CHABIAOMOVWF PORTDBCF PORTB,4CALL DELAYBSF PORTB,4MOVF SHI,WCALL CHABIAOMOVWF PORTDBCF PORTB,3CALL DELAYBSF PORTB,3MOVF BAI,WCALL CHABIAOMOVWF PORTDBCF PORTB,2CALL DELAYBSF PORTB,2MOVF QIAN,WCALL CHABIAOMOVWF PORTDBCF PORTB,1CALL DELAYBSF PORTB,1JIANPAN MOVLW 00HMOVWF PORTCMOVLW 0F0HANDWF PORTC,WSUBLW 0F0HBTFSC STATUS,ZGOTO LOOPCALL DELAY10CALL DELAY10MOVLW 00HMOVWF PORTCMOVLW 0F0HANDWF PORTC,WSUBLW 0F0HGOTO LOOP MOVLW 0FEH MOVWF PORTC BTFSS PORTC,4 GOTO JIAN0 BTFSS PORTC,5 GOTO JIAN1 BTFSS PORTC,6 GOTO JIAN2 BTFSS PORTC,7 GOTO JIAN3 MOVLW 0FDH MOVWF PORTC BTFSS PORTC,4 GOTO JIAN4 BTFSS PORTC,5 GOTO JIAN5 BTFSS PORTC,6 GOTO JIAN6 BTFSS PORTC,7 GOTO JIAN7 MOVLW 0FBH MOVWF PORTC BTFSS PORTC,4 GOTO JIAN8 BTFSS PORTC,5 GOTO JIAN9 BTFSS PORTC,6 GOTO JIANA BTFSS PORTC,7 GOTO JIANB MOVLW 0F7H MOVWF PORTCGOTO JIANCBTFSS PORTC,5GOTO JIANDBTFSS PORTC,6GOTO JIANEBTFSS PORTC,7GOTO JIANFGOTO LOOPJINWEI MOVF BAI,WMOVWF QIANMOVF SHI,WMOVWF BAIMOVF GE,WMOVWF SHIMOVF SHURUSHU,WMOVWF GEGOTO LOOPJIAN0 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 01HMOVWF SHURUSHUGOTO JINWEIJIAN1 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 02HMOVWF SHURUSHUGOTO JINWEIJIAN2 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 03HMOVWF SHURUSHUGOTO JINWEIJIAN3 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 00HMOVWF SHURUSHUGOTO JINWEIJIAN4 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 04HMOVWF SHURUSHUGOTO JINWEIJIAN5 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 05HMOVWF SHURUSHUGOTO JINWEIJIAN6 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 06HMOVWF SHURUSHUGOTO JINWEIJIAN7 CALL SFANGCALL SHITOERMOVF R1L,WMOVWF S2LMOVF R1H,WMOVWF S2HMOVF SHU1L,WMOVWF S1LMOVF SHU1H,WMOVWF S1HBTFSC FUHAO,0CALL ADDXYBTFSC FUHAO,1CALL SUBXYBTFSC FUHAO,2CALL MPXYBTFSC FUHAO,3CALL DIVXYCALL ERTOSHI BSF JIESHU,0GOTO LOOPJIAN8 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 07HMOVWF SHURUSHUGOTO JINWEIJIAN9 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 08HMOVWF SHURUSHUGOTO JINWEIJIANA CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 09HMOVWF SHURUSHUGOTO JINWEIJIANB CALL SFANG MOVF SHI,WMOVWF GEMOVF BAI,WMOVWF SHIMOVF QIAN,WMOVWF BAICLRF QIANGOTO LOOPJIANC CALL SFANGCLRF FUHAOBSF FUHAO,0CALL SHITOERMOVF R1L,WMOVWF SHU1LMOVF R1H,WMOVWF SHU1H BSF JIESHU,0GOTO LOOP JIAND CALL SFANGCLRF FUHAOBSF FUHAO,1CALL SHITOERMOVF R1L,WMOVWF SHU1LMOVF R1H,WMOVWF SHU1H BSF JIESHU,0GOTO LOOPJIANE CALL SFANGCLRF FUHAOBSF FUHAO,2CALL SHITOERMOVF R1L,WMOVWF SHU1LMOVF R1H,WMOVWF SHU1H BSF JIESHU,0GOTO LOOPJIANF CALL SFANGCLRF FUHAOBSF FUHAO,3CALL SHITOERMOVF R1L,WMOVWF SHU1LMOVF R1H,WMOVWF SHU1H BSF JIESHU,0GOTO LOOPSFANG MOVLW 00HMOVWF PORTCMOVLW 0F0HANDWF PORTC,WSUBLW 0F0hBTFSS STA TUS,ZGOTO SFANGCALL DELAY10CALL DELAY10CALL DELAY10MOVLW 00HMOVWF PORTCMOVLW 0F0HANDWF PORTC,WSUBLW 0F0HBTFSS STA TUS,ZGOTO SFANGRETURNCLEAR BCF JIESHU,0CLRF GECLRF SHICLRF BAICLRF QIANRETURNDELAY DECFSZ 30H,FGOTO DELAYRETURNDELAY1 DECFSZ 30H,FGOTO DELAYDECFSZ 31H,FGOTO DELAYRETURNADDXY MOVF S1L,WADDWF S2LBTFSC STATUS,CINCF S2HMOVF S1H,WADDWF S2HMOVF S2H,WMOVWF R1HMOVF S2L,WMOVWF R1LRETURNSUBXY COMF S2LINCF S2LBTFSC STATUS,ZDECF S2HCOMF S2HCALL ADDXYRETURNMPXY MOVF S1L,WMOVWF M1LMOVF S1H,WMOVWF M1HMOVF S2L,WMOVWF M2LMOVF S2H,WMOVF S1L,WMOVWF M3LMOVF S1H,WMOVWF M3HCLRF R1HCLRF R2HL2 MOVLW 00HSUBWF M2LBTFSS STA TUS,ZGOTO L1MOVLW 00HSUBWF M2HBTFSC STA TUS,ZGOTO L3L1 MOVF M1L,WMOVWF S1LMOVF M3L,WMOVWF S2LMOVF M1H,WMOVWF S1HMOVF M3H,WMOVWF S2HCALL ADDXYMOVF R1L,WMOVWF M1LMOVF R1H,WMOVWF M1HMOVWF S1LMOVF M2H,WMOVWF S1HCLRF S2HMOVLW 01HMOVWF S2LCALL SUBXYMOVF R1L,WMOVWF M2LMOVF R1H,WMOVWF M2HMOVF M1L,WMOVWF R1LMOVF M1H,WMOVWF R1HGOTO L2L3 MOVF R1L,WMOVWF S1LMOVF R1H,WMOVWF S1HMOVF M3L,WMOVWF S2LMOVF M3H,WMOVWF S2HCAll S UBXYRETURNDIVXY MOVF S1L,WMOVWF D1LMOVF S1H,WMOVF S2L,WMOVWF D2LMOVF S2H,WMOVWF D2HCLRF D3LCLRF D3HD1 MOVF D2H,WSUBWF D1H,WBTFSS STA TUS,CGOTO D2BTFSS STA TUS,ZGOTO D3MOVF D2L,WSUBWF D1L,WBTFSS STA TUS,CGOTO D2D3 MOVF D1L,WMOVWF S1LMOVF D1H,WMOVWF S1HMOVF D2L,WMOVWF S2LMOVF D2H,WMOVWF S2HCALL SUBXYMOVF R1L,WMOVWF D1LMOVF R1H,WMOVWF D1HMOVF D3H,WMOVF D3L,WMOVWF S1LCLRF S2HMOVLW 01HMOVWF S2LCALL ADDXYMOVF R1H,WMOVWF D3HMOVF R1L,WMOVWF D3LGOTO D1D2 MOVF D3L,WMOVWF R1LMOVF D3H,WMOVWF R1HMOVF D1L,WMOVWF R2LMOVF D1H,WMOVWF R2HRETURNDELAY10 MOVLW 0DHMOVWF 20H LOOP1 MOVLW 0FFHMOVWF 21H LOOP2 DECFSZ 21HGOTO LOOP2DECFSZ 20HGOTO LOOP1RETURNSHITOER MOVLW 03HMOVWF S2HMOVLW 0xE8MOVWF S2LMOVF QIAN,WMOVWF S1LCLRF S1HCALL MPXYMOVF R1H,WMOVWF SHUHMOVF R1L,WMOVWF SHULMOVLW 64HMOVWF S2LCLRF S2HCLRF S1HMOVF BAI,WMOVWF S1LCALL MPXYMOVF SHUH,WMOVWF S1HMOVF SHUL,WMOVWF S1LMOVF R1H,WMOVWF S2HMOVF R1L,WMOVWF S2LCALL ADDXYMOVF R1H,WMOVWF SHUHMOVWF SHULMOVLW 0AHMOVWF S2LCLRF S2HMOVF SHI,WMOVWF S1LCLRF S1HCALL MPXYMOVF SHUH,WMOVWF S1HMOVF SHUL,WMOVWF S1LMOVF R1H,WMOVWF S2HMOVF R1L,WMOVWF S2LCALL ADDXYMOVF R1H,WMOVWF S1HMOVF R1L,WMOVWF S1LCLRF S2HMOVF GE,WMOVWF S2LCALL ADDXYRETURN ERTOSHI MOVF R1H,WMOVF R1L,W MOVWF S1L MOVLW 27H MOVWF S2H MOVLW 10H MOVWF S2L CALL DIVXYMOVLW 03H MOVWF S2H MOVLW 0xE8 MOVWF S2L MOVF R2L,W MOVWF S1L MOVF R2H,W MOVWF S1H CALL DIVXY MOVF R1L,W MOVWF QIANMOVLW 64H MOVWF S2L CLRF S2H MOVF R2L,W MOVWF S1L MOVF R2H,W MOVWF S1H CALL DIVXY MOVF R1L,W MOVWF BAIMOVWF S2LCLRF S2HMOVF R2L,WMOVWF S1LMOVF R2H,WMOVWF S1HCALL DIVXYMOVF R1L,WMOVWF SHIMOVF R2L,WMOVWF GERETURNDUI1D MOVLW 0AHMOVWF S2LCLRF S2HMOVF DUI1,WMOVWF S1LCLRF S1HCALL DIVXYMOVF R1L,WMOVWF QIANMOVF R2L,WMOVWF BAIRETURNDUI2D MOVLW 0AHMOVWF S2LCLRF S2HMOVF DUI2,WMOVWF S1LCLRF S1HCALL DIVXYMOVF R1L,WMOVWF SHIMOVF R2L,WMOVWF GERETURNGUAN SLEEPNOPGOTO LOOPNEND ; directive 'end of program'四、评价这个设计的所有运算都是基于加减法的,然后是得出乘除法,最后的个位、十位、百位和千位的整合转换为一个双精度的二进制数和将一个双精度的二进制数拆分为个位、十位、百位和千位都是基于乘除法的。