四则运算计算器
前言
本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的。通过对具有加减乘除基本功能的计算器的设计实现,学会使用汇编语言实现输入输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的设计。通过对各种指令的合理使用,熟悉并加深对各种指令的用法。学会使用汇编语言设计各个功能模块。当实现各个程序模块后,学会通过程序的调用最终实现一个具有基本计算功能的简单计算器。
1
中文摘要
实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算
关键字:计算器、四则运算、进位、错位、清屏
目录
1系统分析 -------------------------------------------------2系统总体设计----------------------------------------------3详细设计-------------------------------------------------- 4统测试 ---------------------------------------------------5软件使用说明书 ------------------------------------------- 设计总结----------------------------------------------------参考文献----------------------------------------------------致谢———————————————————————————————————
3
1.系统分析
本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比如,十进制数的加减乘除四则运算。我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
第一步,我要解决的是输入时是用INT 21H的10号功能调用还是用INT 21H 的1号功能调用来进行输入。若是用10号功能调用则我们进行多字符输入,可以将输入的字符都存储到一个数据区里面,并调用9号功能调用输出存进去的字符,这种输入和输出的方案是可行的。我选择的是利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了。在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。
第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+’号、‘-’号、‘*’号、‘/’号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。
第三步,根据计算器程序所要实现的功能完成各个功能模块。设计程序主体部分,根据主体部分所需的功能模块对各个子模块一一进行设计编写。子模块中包含有:do_add加法运算模块,do_sub减法运算模块,do_mul乘法运算模块,do_div 除法运算模块,input输入模块等。
最后还要对这个简易计算器进行功能完善。为了使程序符合我们使用者的操作
习惯,设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算
5
2.系统总体设计
7
3.详细设计
B_P EQU BYTE PTR
W_P EQU WORD PTR
D_P EQU DWORD PTR
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
;主程序开始
NEWSTAR:
JMP STAR
EVEN
NUM1 DW 0,0
NUM2 DW 0,0
NUM3 DW 0,0
JGV4 DW 0,0
YSF LABEL WORD
YSF1 DB 0
YSF2 DB 0
JUV DB 0
UV DB 0
;使DS:SI指向第一有效字符
OVERS LABEL NEAR
CLD
PUSH AX
OVERS1:
LODSB
CMP AL,' '
JZ OVERS1
CMP AL,9
JZ OVERS1
DEC SI
CMP AL,13
POP AX
RET
;输出一个制表符
TAB LABEL NEAR
MOV AL,9
JMP SHORT DISP ;输出一个回车换行符
CRLF LABEL NEAR
MOV AL,13
CALL DISP
MOV AL,10
;显示一个字符
DISP LABEL NEAR
PUSH AX
PUSH DX
MOV AH,2
MOV DL,AL
INT 21H
POP DX
POP AX
RET
;检查是否为运算符
ISYSF LABEL NEAR
CLD
LODSB
CALL ISJJ
JZ ISYSF1
CALL ISII
JZ ISYSF1
DEC SI
9
ISYSF1:
RET
;检查是否是加减运算
ISJJ LABEL NEAR
CMP AL,'+'
JZ ISYSF1
CMP AL,'-'
RET
;检查是否为乘除运算
ISII LABEL NEAR
CMP AL,'*'
JZ ISYSF1
CMP AL,'/'
JZ ISYSF1
CMP AL,'\'
RET
;数据输出
;CX=10 十进制
;CX=16 十六进制
DOUT LABEL NEAR
PUSH AX
PUSH BX
PUSH DX
PUSH BP
XOR BP,BP DOUT1:
INC BP
PUSH AX
MOV AX,DX
XOR DX,DX
DIV CX
MOV BX,AX
POP AX
DIV CX
PUSH DX
MOV DX,BX
OR BX,AX
JNZ DOUT1
DOUT2:
POP AX
ADD AL,'0'
CMP AL,'9'
JBE DOUT3
ADD AL,'A'-'9'-1 DOUT3:
CALL DISP
DEC BP
JNZ DOUT2
POP BP
POP DX
POP BX
POP AX
RET
;输入数据在DX:AX中返回
;CX=0 数据为10进制
;CX#0 数据为16进制
DATE LABEL NEAR
PUSH BX
PUSH BP
PUSH DI
XOR AX,AX
XOR DX,DX
11
MOV DI,AX
LODSB
CMP AL,'0'
JB DATE7
CMP AL,'9'
JA DATE6
DATE2:
AND AX,0FH
SHL DI,1
RCL DX,1
MOV BX,DI
MOV BP,DX
SHL DI,1
RCL DX,1
SHL DI,1
RCL DX,1
JCXZ DATE3
SHL DI,1
RCL DX,1
Jmp short DATE4 DATE3:
ADD DI,BX
ADC DX,BP
DATE4:
ADD AX,DI
ADC DX,0
JMP DATE1
DATE5:
ADD AL,9
JMP DATE2
JCXZ DATE7
CMP AL,'A'
JB DATE7
CMP AL,'F'
JBE DATE5
CMP AL,'a'
JB DATE7
CMP AL,'f'
JBE DATE5
DATE7:
MOV AX,DI
DEC SI
OR DI,DX
POP DI
POP BP
POP BX
RET
;数据1与数据2根据YSF1进行加减运算JSJJ LABEL NEAR
MOV AX,NUM2
MOV DX,NUM2+2
CMP YSF1,'+'
JZ JSJJ1
SUB NUM1,AX
SBB NUM1+2,DX
JMP SHORT JSJJ2 JSJJ1:
ADD NUM1,AX
ADC NUM1+2,DX JSJJ2:
13
RET
;数据1与数据2根据YSF1进行乘除运算JSII1 LABEL NEAR
MOV BX,OFFSET NUM1
JMP SHORT JSII2_1 ;数据2与数据3根据YSF2进行乘除运算JSII2 LABEL NEAR
MOV BX,OFFSET NUM2 JSII2_1:
DB 66H
MOV AX,[BX]
DB 66H
MOV CX,[BX+4]
CMP YSF2,'*'
JNZ JSII2_2
DB 66H
IMUL CX
JMP SHORT JSII2_3 JSII2_2:
DB 66H
CWD
DB 66H
IDIV CX
CMP YSF2,'/'
JZ JSII2_3
DB 66H
XCHG DX,AX
JSII2_3:
DB 66H
MOV [BX],AX
RET
;显示结果
XUJG LABEL NEAR
MOV AX,JGV4
MOV DX,JGV4+2
MOV CX,10
CMP UV,10
JZ XUJG0
MOV CX,16
XUJG0:
TEST DX,8000H
JZ XUJG1
CMP UV,10
JZ XUJG2
CALL DOUT
XUJG2:
NOT AX
NOT DX
ADD AX,1
ADC DX,0
PUSH AX
CMP UV,10
JZ XUJG3
MOV AL,' '
CALL DISP
MOV AL,'('
CALL DISP
XUJG3:
MOV AL,'-'
CALL DISP
POP AX
CMP UV,10
15
JZ XUJG1
CALL DOUT
MOV AL,')'
CALL DISP
RET
XUJG1:
CALL DOUT
RET
;计算结果放入DX:AX中
JSJG LABEL NEAR
CALL JSJJ
MOV AX,NUM1
MOV DX,NUM1+2
RET
;从DS:SI处取一个数据
LOADATE LABEL NEAR
LODSB
CMP AL,'('
JZ LOADATE1
DEC SI
PUSH CX
XOR CX,CX
CMP UV,10
JZ LOADATE0
INC CX ;取16进制数LOADATE0:
CALL DATE ;取数据放入DX:AX中
POP CX
RET
LOADATE1:
PUSH NUM1 ;保存数据1数据2及运算符
PUSH NUM1+2
PUSH NUM2
PUSH NUM2+2
PUSH YSF
INC JUV
MOV JGV4,0 ;结果值清零
MOV JGV4+2,0
;进行四则运算
SZYS LABEL NEAR
CALL ISYSF ;首字符是运算符?
JZ SZYS2
CALL LOADATE ;不是,取数并保存
MOV NUM1,AX
MOV NUM1+2,DX
SZYS1:
XOR AX,AX ;数据2清零
MOV NUM2,AX
MOV NUM2+2,AX
CALL ISYSF ;下个是运算符?
JZ SZYS3
JNZ SZYS6
SZYS2:
PUSH AX
MOV AX,JGV4 ;将结果作为数据1
MOV NUM1,AX
MOV AX,JGV4+2
MOV NUM1+2,AX
POP AX
SZYS3:
MOV YSF1,AL
MOV YSF2,AL
17
CALL ISJJ ;是加减运算转
JZ SZYS4
CALL LOADATE ;取数据2
MOV NUM2,AX
MOV NUM2+2,DX
CALL JSII1 ;数据1与数据2根据YSF1进行乘除运算
JMP SZYS1 ; 结果保存在数据1中SZYS4:
CALL LOADATE ;取数据2并保存
MOV NUM2,AX
MOV NUM2+2,DX
SZYS4_1:
CALL ISYSF
JNZ SZYS6
CALL ISJJ ;运算符2是加减运算?
JNZ SZYS5 ;不是转
PUSH AX
CALL JSJJ ;数据1与数据2根据YSF1进行加减运算
POP AX ; 结果保存在数据1中
MOV YSF1,AL ;保存新的运算符
JMP SZYS4
SZYS5:
MOV YSF2,AL ;保存运算符2
CALL LOADATE ;取数据3
MOV NUM3,AX
MOV NUM3+2,DX
CALL JSII2 ;数据2与数据3根据YSF2进行乘除运算
JMP SZYS4_1 ; 结果保存在数据2中
SZYS6:
MOV CL,AL
CMP AL,13
JNZ SZYS9
SZYS7:
CALL JSJG
CMP JUV,0
JZ SZYS8
DEC JUV
POP YSF
POP NUM2+2
POP NUM2
POP NUM1+2
POP NUM1
RET
SZYS8:
CMP CL,')'
JZ SZYS10
MOV JGV4,AX
MOV JGV4+2,DX
JNZ SZYS12
SZYS9:
CMP AL,')'
JNZ SZYS11
INC SI
JMP SZYS7
SZYS10:
MOV NUM1,AX
MOV NUM1+2,DX
JMP SZYS1
SZYS11:
19
STC
RET
SZYS12:
CLC
RET
;数制处理
UVIL LABEL NEAR
PUSH SI UVIL1:
LODSB
CMP AL,' '
JZ UVIL2
CMP AL,9
JZ UVIL2
CMP AL,13
JZ UVIL4
JNZ UVIL1 UVIL2:
MOV BX,SI
CALL OVERS
JZ UVIL3
LODSW
CALL OVERS
POP SI
JNZ SZYS11
CMP AX,'01'
JNZ SZYS11
PUSH SI
MOV UV,10 UVIL3:
MOV AL,13
基于51单片机的计算器设计
目录 第一章引言 (3) 1.1 简述简易计算器 (3) 1.2 本设计主要任务 (3) 1.3 系统主要功能 (4) 第二章系统主要硬件电路设计 (4) 2.1 系统的硬件构成及功能 (4) 2.2 键盘电路设计 (5) 2.3 显示电路设计 (6) 第三章系统软件设计 (7) 3.1 计算器的软件规划 (7) 3.2 键盘扫描的程序设计 (7) 3.3 显示模块的程序设计 (8) 3.4 主程序的设计 (9) 3.5 软件的可靠性设计 (9) 第四章调试 (9) 第五章结束语 (10) 参考文献 (11) 附录源程序 (11)
第一章引言 1.1 简述简易计算器 近几年单片机技术的发展很快,其中电子产品的更新速度迅猛。计算器是日常生活中比较的常见的电子产品之一。如何才能使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器呢? 本设计是以AT89S52单片机为核心的计算器模拟系统设计,输入采用4×6矩阵键盘,可以进行加、减、乘、除9位带符号数字运算,并在LCD1602上显示操作过程。 科技的进步告别了以前复杂的模拟电路,一块几厘米平方的单片机可以省去很多繁琐的电路。现在应用较广泛的是科学计算器,与我们日常所用的简单计算器有较大差别,除了能进行加减乘除,科学计算器还可以进行正数的四则运算和乘方、开方运算,具有指数、对数、三角函数、反三角函数及存储等计算功能。计算器的未来是小型化和轻便化,现在市面上出现的使用太阳能电池的计算器, 使用ASIC设计的计算器,如使用纯软件实现的计算器等,未来的智能化计算器将是我们的发展方向,更希望成为应用广泛的计算工具。 1.2 本设计主要任务 以下是初步设定的矩阵键盘简易计算器的功能: 1.扩展4*6键盘,其中10个数字,5个功能键,1个清零 2.强化对于电路的焊接 3.使用五位数码管接口电路 4. 完成十进制的四则运算(加、减、乘、除); 5. 实现结果低于五位的连续运算; 6. 使用keil 软件编写程序,使用汇编语言; 7. 最后用ptoteus模拟仿真; 8.学会对电路的调试
简单的四则运算计算器程序
简单的四则运算计算器程序
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
附件:程序源代码 // sizheyunsuan.cpp : Defines the entry point for the console application. #include
简单的计算器
吉首大学课程设计 课程设计名称:简单的计算器 专业班级: 10 网络工程 学生姓名:胡申城唐茂林赖佳 学号:20104045049 20104045006 201040450 指导教师:鲁荣波老师 课程序设计时间:2011.12.18-2011.12.25
目录 一内容 (1) 二.设计要求 (2) 三.计算器的算法 (2) 四..流程图 (5) 五.源程序 (7) 六.执行结果 (8) 七.课程设计总结 (3) 八.参考书目 (3)
一、内容 编写一个功能基本完善的计算器程序,支持四则运算、乘方开方、指数对数等运算,支持带括号的表达式。 二、设计要求 1) 程序采用字符界面 2) 显示功能菜单,用户指定键即可进入相应功能 3) 每次计算完成后输出一个提示符,要计算的数字或表达式由用户在提示后面输入 4) 用户输入完按回车立即显示计算结果 三、计算器的算法 我们现在用的计算器多是一个数一个运算符的输入输出的。一个比较具有现实意义的计算器,应该具有如下功能: 1.能够实现整数的四则运算:如:1+6-9*4+4/3 2.能够实现小数的四则运算:如:0.2+7-4 这样的计算器基本可以使用在我们生活中。如果我们按照栈的使用来描述一下表达式的进栈出栈问题: 表达式例如:1+9*4/4-5。 假设有栈D和数组S;S中放运算数,D栈放入运算符,优先级高的现运算,四则运算中,*和/优先级最高。 第一步:扫描到‘1’,是运算数,放入S; 第二步:扫描到‘+‘进入D
第三步:扫描到9;进S 第四步:扫描‘*’,因为乘比加优先级高,所以9出栈实现:9*4,把结果入S, 第五步:扫描到/,同样计算S的栈顶元素出栈,实现36/4,把结果如S 第六步:扫描到—,进入D栈; 第七步:扫描到‘5’,进S 第八步:扫描到‘\0’,为结束符;把S栈顶元素栈S1,D顶元素出栈,然后S栈顶元素在出栈,实现减操作,接着S栈顶元素出栈,实现加操作。 具体进出栈如图: Next 为下一个字符或数字,run表示运行,空为不操作S[] D S[] D S[] D S[] D S[] D S[] top t top 9 top 36 top 4 - -1 top base 1 + 1 + 1 + 1 + 1 + 0 top top next + 9 * 4 / 4 - 5 = run 9*4 36/4 4-5 -1+1 表1-1 运算数运算符进栈、出栈
基于51单片机的计算器设计程序代码汇编
DBUF EQU 30H TEMP EQU 40H YJ EQU 50H ;结果存放 YJ1 EQU 51H ;中间结果存放GONG EQU 52H ;功能键存放 ORG 00H START: MOV R3,#0 ;初始化显示为空MOV GONG,#0 MOV 30H,#10H MOV 31H,#10H MOV 32H,#10H MOV 33H,#10H MOV 34H,#10H MLOOP: CALL DISP ;PAN调显示子程序WAIT: CALL TESTKEY ; 判断有无按键JZ WAIT CALL GETKEY ;读键 INC R3 ;按键个数 CJNE A,#0,NEXT1 ; 判断就是否数字键 LJMP E1 ; 转数字键处理NEXT1: CJNE A,#1,NEXT2 LJMP E1 NEXT2: CJNE A,#2,NEXT3 LJMP E1 NEXT3: CJNE A,#3,NEXT4 LJMP E1 NEXT4: CJNE A,#4,NEXT5 LJMP E1 NEXT5: CJNE A,#5,NEXT6 LJMP E1 NEXT6: CJNE A,#6,NEXT7 LJMP E1 NEXT7: CJNE A,#7,NEXT8 LJMP E1 NEXT8: CJNE A,#8,NEXT9 LJMP E1 NEXT9: CJNE A,#9,NEXT10 LJMP E1 NEXT10: CJNE A,#10,NEXT11 ;判断就是否功能键LJMP E2 ;转功能键处理NEXT11: CJNE A,#11,NEXT12 LJMP E2 NEXT12: CJNE A,#12, NEXT13 LJMP E2
四则运算计算器
基于单片机实现的四则运算计算器 姓名 学号: 班级: 专业名称:测控技术与仪器 指导教师: 东北大学 2016年1月
课程设计(论文)任务书课程设计(论文)题目:基于单片机实现的四则运算计算器 基本内容和设计要求: 1、主机的矩阵键盘输入数和运算符号,从机显示运算结果。 2、主从单片机串行通信系统,并在LCD上显示运算内容及结果。 3、计算结果超过十位数字则显示错误。 4、运算除法时,结果只取整数,不是四舍五入。 5、有清零功能。
目录 课程设计(论文)任务书................................................................................................ i i 摘要 (1) 第1章绪论 (2) 1.1计算器简介 (2) 1.2设计主要内容 (2) 第2章系统硬件设计 (4) 2.1硬件组成 (4) 2.2输入模块 (4) 2.3输出模块 (5) 2.4运算模块 (5) 第3章系统软件设计 (7) 3.1 主程序 (7) 3.1.1主程序框图及初始化 (7) 3.1.2LCD程序框图及初始化 (8) 3.1.3键盘程序框图及初始化 (9) 3.1.4运算程序框图 (10) 第4章调试测试与实验分析 (11) 4.1 计算器调试 (11) 参考文献 (12) 心得体会 (13) 附录硬件原理图及PCB图 (14) 附录程序清单 (15) 附录实物照片 (28)
摘要 单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本设计是基于89C52RC单片机来进行的四则运算计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除的基本四则运算,并在LCD1602液晶显示屏上显示相应的结果。本电路采用89C52RC单片机为主要控制电路,利用4*4矩阵键盘作为计算器以及运算符的输入。显示采用字符LCD静态显示。软件用C语言编程,并用开发板进行演示。 关键词:计算器,89C52RC单片机,LCD,矩阵键盘
HTML5+css+JavaScript进行四则运算简易计算器(用按钮实现)
HTML5+JavaScript: