8086简易计算器的设计
8086语言顺序程序设计
8086语言顺序程序设计8086是Intel8086微处理器的型号,它采用x86命令集,是早期个人计算机的重要组成部分。
8086语言顺序程序设计是使用8086汇编语言进行程序设计的过程,它是一种低级编程语言,通过直接控制计算机硬件来完成特定任务。
1.寻址方式在8086语言顺序程序设计中,可以使用多种寻址方式来访问内存数据,例如直接寻址、寄存器间接寻址、寄存器相对寻址等。
其中,直接寻址和寄存器间接寻址是使用最为广泛的,直接寻址通过给出内存地址来访问数据,寄存器间接寻址通过给出寄存器中存放的地址来访问数据。
2.数据传送数据传送是编程中最基本的操作之一、8086提供了多条数据传送指令,可以将数据从一个地方传送到另一个地方。
常用的数据传送指令有MOV、XCHG等。
MOV指令可以将一个数据从源操作数传送到目的操作数,XCHG指令可以交换两个操作数的值。
3.算术运算8086提供了多条算术运算指令,可以进行加法、减法、乘法和除法等运算。
例如,ADD指令可以用于两个操作数的加法运算,SUB指令可以用于两个操作数的减法运算,MUL指令可以用于两个操作数的乘法运算,DIV指令可以用于两个操作数的除法运算。
4.逻辑运算8086还提供了多条逻辑运算指令,可以进行与、或、非、异或等逻辑运算。
例如,AND指令可以用于两个操作数的与运算,OR指令可以用于两个操作数的或运算,NOT指令可以用于对一个操作数进行非运算,XOR指令可以用于两个操作数的异或运算。
5.循环循环是程序中常用的结构之一,8086提供了多条循环指令,可以根据特定条件来重复执行一些程序片段。
常用的循环指令有LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ等。
其中,LOOP指令可以根据CX寄存器的值来自动减1并跳转到指定的标号处。
6.过程过程是一组有关联的指令的集合,适用于在程序中被反复调用的任务。
8086提供了CALL和RET指令,可以实现过程的调用和返回。
简单计算器的制作(实验版)
设计与实现
运算. (13)单个操作数的运算的处理,例如"1/x"运算.在按钮"1/x"的单击 )单个操作数的运算的处理,例如" 运算 在按钮" 的单击 事 件过程OnButton3Click中编写实现代码: 中编写实现代码: 件过程 中编写实现代码
注意: 注意:加,减,乘,除这些按钮都要做相应的处理!! 除这些按钮都要做相应的处理!!
设计与实现
(8)退格键(BackSpace)功能的实现.在按钮"BackSpace"的单击 )退格键( )功能的实现.在按钮" 的单击 事 件过程OnBackSpaceBtnClick中编写实现代码: 中编写实现代码: 件过程 中编写实现代码
设计与实现
当用户按下运算操作符按钮,在按钮" 单击事件过程中编写实现代码 单击事件过程中编写实现代码: 当用户按下运算操作符按钮,在按钮"+"单击事件过程中编写实现代码:
设计与实现
(4)定义一个可以根据不同的操作符进行不同运算的过程: 定义一个可以根据不同的操作符进行不同运算的过程: 定义一个可以根据不同的操作符进行不同运算的过程
设计与分析
混合运算的情况: 混合运算的情况 (1)在没有按下运算操作符按钮之前,通过按钮输入的数 字均作为第一个操作数,保存在opnum1变量中; (2)选择运算的种类,按下运算操作符按钮,首先对上一 次的运算进行求解,并把结果显示出来,同时把该计 算结果作为第一个操作数,存在到opnum1变量中,把 按下的运算操作符也保存在ca_operator变量中; (3)按下运算操作符按钮后(设置一个变量operated来记 录),通过按钮输入的数字均作为第二个操作数保存 在opnum2变量中; (4)按下"="按钮后,根据选择的运算操作符对两个操作数 进行运算,并把结果显示在edit编辑框中.
8086汇编语言实现简易计算器
8086汇编语⾔实现简易计算器8086汇编语⾔实现简易计算器本周看了⼀个很有意思的知识。
C语⾔的编译器最初是怎么来的?最初应该是由汇编语⾔实现⼀个简化版C语⾔,然后使⽤简化版的C语⾔进⾏多次迭代,功能更新,从⽽出现了如今强⼤的C语⾔。
本⼈找到了⼀个古⽼的课程设计,当时学汇编时候的⼀个⼩demo分享出来。
1.概述为了更深⼊地理解计算机⼯作原理以及CPU的功能和结构,掌握汇编语⾔的使⽤。
本⽂以简易计算器程序的汇编语⾔实现为主要任务,进⾏对程序的⼀些算法和汇编语⾔语法的论述。
计算器是最简单的计算⼯具,简单计算器具有加、减、乘、除四项运算功能。
想要⽤汇编语⾔实现简单的计算器,就必须通过对数据存储,寄存器的使⽤,加减乘除相关指令以及模块的调⽤等汇编语⾔知识进⾏运⽤,以实现⼀个基本功能完善,界⾯友好,操作简便易⾏的计算器。
⽤汇编语⾔实现简单计算器还涉及到输⼊输出模块的设计,加减乘除运算的判断以及退出程序的判断的设计。
通过对各种指令的合理使⽤,设计各个功能模块。
当实现各个程序模块后,通过程序的调⽤最终实现⼀个简单的计算器。
本⽂以⽤8086汇编语⾔实现简易计算器为⽬标,对程序的算法以及结构进⾏分析和解释。
汇编语⾔的语句类型有指令语句、伪指令语句和宏指令语句。
在实现简易计算器的过程中暂不需要宏指令语句,故对此语句不进⾏介绍。
计算器的实现需要使⽤输⼊输出,DOS系统的01H,02H,09H号调⽤可以完成所需功能。
由于简易计算器对结果没有很⾼的范围要求,故对四则运算只需考虑ADD,SUB,MUL,DIV等指令。
在计算器中,输⼊的是10进制数字,⽽在汇编语⾔中读⼊字符只能⼀位⼀位的读取,故需要使⽤MUL设置⼀个循环算法,将输⼊的数字以16进制形式放⼊寄存器中,⽽输出则是使⽤MOD设置⼀个循环算法,将16进制转化为10进制后处理为ASCII码进⾏输出。
2.程序算法结构简易计算器程序的任务主要有处理输⼊数据,选择运算⽅式进⾏计算,显⽰算式结果。
8086计时器课程设计
8086计时器课程设计一、课程目标知识目标:1. 理解8086计时器的硬件结构和工作原理;2. 掌握8086计时器的编程方法,能编写简单的计时程序;3. 了解8086计时器在实际应用中的功能和使用场景。
技能目标:1. 学会使用8086计时器进行时间测量和定时控制;2. 能分析并解决8086计时器编程中遇到的问题;3. 培养学生的动手实践能力和团队协作能力。
情感态度价值观目标:1. 培养学生对计算机硬件及编程的兴趣,激发学习热情;2. 培养学生严谨、细心的学习态度,养成良好的编程习惯;3. 增强学生的创新意识,鼓励学生勇于尝试,敢于挑战。
课程性质:本课程为计算机硬件及编程相关课程,结合学生年级特点,注重理论与实践相结合。
学生特点:学生具备一定的计算机基础,对硬件及编程有一定了解,但实践经验不足。
教学要求:通过本课程的学习,使学生掌握8086计时器的原理和编程方法,提高学生的实践能力,为后续课程打下坚实基础。
教学过程中,注重引导学生主动探究,培养学生的创新思维和团队协作能力。
课程目标分解为具体学习成果,以便于教学设计和评估。
二、教学内容1. 计时器原理及8086计时器硬件结构- 理解计时器的基本概念- 学习8086计时器的硬件结构及其工作原理2. 8086计时器的编程方法- 掌握计时器的编程接口- 学习编写简单的计时程序- 熟悉中断处理程序在计时器编程中的应用3. 实际应用案例分析与编程实践- 分析8086计时器在实际应用中的功能和使用场景- 开展编程实践,实现计时功能- 选取典型实例,进行问题分析和解决方案设计4. 课程项目设计与实施- 分组进行课程项目设计,培养学生的团队协作能力- 结合实际应用场景,设计具有创新性的计时器应用方案- 实施项目,进行调试和优化教学内容安排与进度:第一周:计时器原理及8086计时器硬件结构第二周:8086计时器的编程方法第三周:实际应用案例分析与编程实践第四周:课程项目设计与实施教材章节关联:本教学内容与教材中关于8086计时器相关章节紧密关联,涵盖了计时器的基本概念、硬件结构、编程方法及实际应用等方面,确保了教学内容的科学性和系统性。
8086计时器课程设计
8086计时器课程设计一、课程目标知识目标:1. 理解8086计时器的原理与功能,掌握其内部结构与工作流程;2. 学习并掌握8086计时器的编程方法,能够编写简单的计时程序;3. 了解计时器在计算机系统中的应用场景,如延时、定时等。
技能目标:1. 能够运用所学知识,独立完成8086计时器的编程与调试;2. 培养学生的动手实践能力,学会使用相关开发工具进行程序开发;3. 提高学生的逻辑思维和分析问题的能力,能够解决实际编程中遇到的问题。
情感态度价值观目标:1. 培养学生对计算机硬件与编程的兴趣,激发学生的学习热情;2. 培养学生严谨、踏实的学术态度,养成良好的编程习惯;3. 增强学生的团队协作意识,学会与他人合作解决问题。
课程性质:本课程为计算机硬件与接口技术的实践课程,通过学习8086计时器的原理与编程,使学生掌握计算机硬件编程的基本方法,提高学生的动手实践能力。
学生特点:学生具备一定的计算机基础知识和编程能力,对硬件编程有一定兴趣,希望通过实践课程提高自己的技能。
教学要求:教师应结合学生特点,采用理论讲解与实践操作相结合的教学方法,引导学生主动参与,注重培养学生的实际操作能力。
在教学过程中,将课程目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. 8086计时器原理及功能:讲解8086微处理器的计时器工作原理,介绍计时器的内部结构、计数方式、时钟源等,使学生理解计时器的基本概念。
相关教材章节:第3章 计时器与计数器2. 8086计时器编程方法:教授学生如何使用汇编语言编写8086计时器程序,包括初始化计时器、设置计数初值、启动与停止计时等操作。
相关教材章节:第4章 汇编语言编程3. 实践操作:指导学生使用开发工具(如EMU8086)进行计时器编程实践,通过编写简单的延时、定时程序,加深对计时器编程的理解。
相关教材章节:第5章 硬件编程实践4. 计时器应用案例分析:分析计时器在计算机系统中的应用案例,如电子时钟、倒计时等,使学生了解计时器的实际应用。
简易计算器设计范文
简易计算器设计范文首先,我们需要决定计算器的基本功能。
一个简易计算器通常应该具备加法、减法、乘法和除法的功能。
此外,我们还可以添加开方、求平方以及取模等功能。
在设计计算器之前,我们需要确定用户界面。
对于一个简易计算器来说,我们可以使用命令行界面或者图形用户界面。
在本文中,我们将使用命令行界面。
接下来我们需要设计计算器的算法。
为了实现加、减、乘、除这些基本运算,我们可以编写四个函数来完成。
比如,加法函数可以接收两个数并返回它们的和,减法函数可以接收两个数并返回它们的差,乘法函数可以接收两个数并返回它们的乘积,除法函数可以接收两个数并返回它们的商。
同时,我们还需要添加一些辅助函数来处理开方、求平方以及取模等功能。
比如,开方函数可以接收一个数并返回它的平方根,求平方函数可以接收一个数并返回它的平方,取模函数可以接收两个数并返回它们的余数。
在设计计算器时,我们还要考虑到用户输入的错误处理。
如果用户输入无效的操作或者除数为零,我们需要给出错误的提示信息。
接下来,我们来设计主要的程序流程。
首先,我们需要显示一个欢迎信息,告诉用户如何使用计算器。
然后,在一个循环中,我们会要求用户输入要执行的操作,然后读取用户输入的操作和操作数。
根据用户的选择,我们会调用相应的函数来执行计算,并输出结果。
接着,我们会继续询问用户是否要继续进行计算。
如果用户选择退出,我们会结束循环并显示一个退出信息。
最后,我们需要编写测试用例来确保计算器的功能正常。
我们可以输入一些固定的操作和操作数,然后验证计算器返回的结果是否正确。
如果测试用例中出现错误,我们需要进行修复。
在编写代码之前,我们还需要选择一个编程语言。
对于一个简易计算器来说,Python是一个非常适合的选择。
Python具有简单易读的语法,能够轻松地实现我们的设计。
下面是本文的设计示例:```python#导入所需的库import math#加法函数def add(x, y):return x + y#减法函数def subtract(x, y):return x - y#乘法函数def multiply(x, y):return x * y#除法函数def divide(x, y):if y == 0:raise ValueError("除数不能为零") return x / y#开方函数def square_root(x):if x < 0:raise ValueError("不能对负数开方") return math.sqrt(x)#求平方函数def square(x):return x ** 2#取模函数def modulo(x, y):if y == 0:raise ValueError("除数不能为零") return x % y#欢迎信息print("欢迎使用简易计算器!")print("请按以下方式输入操作:")print("加法:'a 数1 数2'")print("减法:'s 数1 数2'")print("乘法:'m 数1 数2'")print("除法:'d 数1 数2'")print("开方:'r 数'")print("求平方:'q 数'")print("取模:'o 数1 数2'")#主程序循环while True:#用户输入operation = input("输入操作:")data = operation.splitif data[0] == "a":result = add(float(data[1]), float(data[2])) print("结果为:", result)elif data[0] == "s":result = subtract(float(data[1]), float(data[2])) print("结果为:", result)elif data[0] == "m":result = multiply(float(data[1]), float(data[2])) print("结果为:", result)elif data[0] == "d":try:result = divide(float(data[1]), float(data[2])) print("结果为:", result)except ValueError as e:print("错误:", str(e))elif data[0] == "r":try:result = square_root(float(data[1]))print("结果为:", result)except ValueError as e:print("错误:", str(e))elif data[0] == "q":result = square(float(data[1]))print("结果为:", result)elif data[0] == "o":try:result = modulo(float(data[1]), float(data[2]))print("结果为:", result)except ValueError as e:print("错误:", str(e))else:print("无效的操作")#判断是否继续计算choice = input("是否继续计算?(y/n)")if choice == "n":breakprint("谢谢使用,再见!")```通过以上设计,我们可以在命令行中使用这个简易计算器来执行加、减、乘、除、开方、求平方和取模等操作。
简易计算器的设计
学号:课程设计题目简易计算器的设计学院自动化专业电气工程及其自动化班级姓名指导教师2014 年1月9日课程设计任务书学生姓名:专业班级:指导教师:工作单位:自动化学院题目: 简易计算器的设计初始条件:用8086CPU、8255A并行通信接口、七段LED数码管接口、小键盘控制电路接口、外围电路芯片及元器件实现一个简易计算器,完成相应的程序编写。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)可进行2位十进制的加减乘除法运算。
(2)键盘输入数据,同时LED数码管显示,模拟计算器的工作。
(3)键盘上要求有0~9数字键,+、-、×、÷、=功能键,清除键C。
(4)撰写课程设计说明书。
内容包括:摘要、目录、正文、参考文献、附录(程序清单)。
正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。
时间安排:12月26日----- 12月 28 日查阅资料及方案设计12月29日----- 1 月 2 日编程1 月 3日----- 1 月 7日调试程序1 月 8日----- 1 月 9日撰写课程设计报告指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (1)1设计的任务及要求 (2)2方案的设计 (3)2.1方案设计论证 (3)2.2方案概述与原理硬件电路图 (3)3系统模块与功能 (5)3.18086CPU芯片 (5)3.2 8255A 并行通信接口芯片 (5)3.3 译码电路 (6)3.4 小键盘电路 (6)3.5 四位七段 LED 数码管显示电路 (7)4软件设计框图与程序 (8)4.1计算器系统程序总体流程图 (8)4.2 模块程序流程图与程序 (8)4.2.1流程图 (8)4.2.2键盘扫描流程图 (9)4.3输入运算 (10)4.3.1输入运算的流程图 (10)4.3.2输入运算程序 (10)4.4显示部分 (11)4.4.1显示部分流程图 (11)4.4.2显示部分程序 (12)5系统仿真 (14)6小结与体会 (15)参考文献 (16)附录:设计源程序 (17)本科生课程设计成绩评定表摘要这次微机原理的课程设计的题目是简易计算器的设计,设计一个可以实现2位十进制加减乘除运算功能的电路,并用LED显示出来。
8086简易计算器的设计-计算机硬件-微机原理-课程设计
计算机硬件技术实践报告题目简易计算器的设计姓名专业自动化(电站方向)班级学号上海电力学院自动化工程学院一、设计题目及目的本次课程设计的实验目的是:通过该实验掌握较复杂程序的设计;能独立完成用程序对8086、8255A控制键盘和LED显示的控制,完成计算器加减法的应用;独立编写程序,明白和掌握程序的原理和实现方式;学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用;进一步加强理论知识与应用相结合的实践和锻炼,为以后的设计提供经验。
这次设计实践,加深了我对专业知识和理论知识学习的认识和理解,使我的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。
我们的具体任务是用8086设计一个能实现0~9整数加减乘除法的运算器,并用2位LED数码显示,键盘包括0-9,+ ,-,×,÷,=,NO/C共16个按键。
二、小组成员分工及成果在实验课程要求下,我们选择基于8086CPU的模拟计算器设计。
要完成设计首先需要构建简单的微型计算机应用系统,其次是确定组成各部件的芯片,然后画原理图,根据相应的原理以及实现过程,编写出相应的汇编代码。
再根据原理图连接硬件电路,电路连接完成后进行调试。
设计过程中我们用到了8086CPU、可编程并行输入/输出芯片8255A、74HC138、74HC373、矩阵式键盘、LED数码管。
我们的模拟计算器能实现2位十进制数以内的加减乘除法运算。
首先,本组的三个成员一起讨论研究简易计算器设计的主要方案。
粗略设计程序流程图以确定简易计算器设计的大概框架。
明确目的后各自查询资料了解设计原理、逐步清晰设计思路。
以下为大体分工:主要负责:1、设计主要程序,编写;2、查找资料验证修改;主要负责:1、选择需要用的各个芯片;2、设计硬件原理图;主要负责:1、各个芯片功能的资料查找;2、设计程序流程图三、设计方案思路用8086设计一个能实现0~9整数加减乘除法的运算器,并用2位LED数码显示,键盘包括0-9,+ ,-,×,÷,=,NO/C共16个按键。
微机原理课设--简易计数器设计
1.总体设计思想及主要功能1.1总体设计思想程序主要分为主程序,输入子程序,输出子程序,加法子程序,减法子程序,乘法子程序,除法子程序。
根椐输入的符号选用不同的运算子程序,最后调用输出子程序。
各个程序的具体做法,详见后面的流程图和分析。
本程序的关键是在输入、输出程序,值得特别注意的地方是call 和ret的调用,而且还要清楚跳转的返回地址;由于计算器比数学用表等计算工具要先进得多,应该积极倡导学生加速用计算器取代数学用表的进程。
从键盘输入数据与运算符;可以进行加、减、乘、除四则运算,输入和输出的数均必须为十进制的。
输入的数据最大为双字的,。
如果输入的除数为0;输出错误信息。
输入的表达式有误,输出错误信息。
输入的两个数,不能除尽时,输出除数输入错误信息。
如果输入了空格,同样输出错误信息。
输出的数据最大可输出4字,为的是输出乘除法的结果。
除法最后所得结果可为小数点后四位值。
1.2实现的主要功能(1)输入和输出的数均为十进制的。
(2)输入的数据最大为双字的且必须是数字,当输入字母或其他非数字符号时,输出错误信息。
(3)如果输入的除数为0;输出错误信息。
(4)输入的表达式有误,输出错误信息。
(5)输入的两个数,有一个大于双字,输出错误信息。
(6)如果输入了空格,输出错误信息。
(7)输出的数据最大可输出4字,为的是输出乘法的结果。
(8)除法有不能整除的情况时,输出小数结果保留小数点后四位并显示除数输入错误信息。
2.简单计算器的流程图2.1 主程序的流程图主程序设计思路说明:输入的数据如果超过双字,就会溢出,因为我定义的存储器为双字的。
输入什么样的数都会有一个范围,一定得有这个信息。
根据输入的符号调用相应的函数。
除法和别的不一样,还要输出余数,并且,除数不能是0。
所以我就在里面调用了输出函数,要输出两次,而外面只能输出一次,为了更好输出结果,我就只好这样了。
输入y可以继续进行运算,要注意的是,要把原来的数给清0,不然得不到答案。
简单计算器的制作
简单计算器的制作引言:计算器是一种用于进行基本数学运算的工具。
它通常具备加法、减法、乘法和除法的功能。
在本文中,我们将介绍如何制作一个简单的计算器,让用户能够输入两个数字并选择进行的运算。
该计算器将使用基本的HTML、CSS和JavaScript技术,以及一些计算逻辑来实现。
准备工作:在开始制作计算器之前,我们需要确保我们具备以下环境和资源:2. 基础的HTML、CSS和JavaScript知识。
3. 可以创建和保存HTML、CSS和JavaScript文件的文件夹。
4.一些布局和样式设计的想法。
步骤一:创建HTML文件步骤二:设计计算器布局1. 在 "calculator-container" `<div>` 内部,创建一个`<input>` 元素,并给它一个独立的id属性,例如 "input1"。
这个输入框将用于输入第一个数字。
2. 在 "calculator-container" `<div>` 内部,创建一个`<input>` 元素,并给它一个独立的id属性,例如 "input2"。
这个输入框将用于输入第二个数字。
3. 在 "calculator-container" `<div>` 内部,创建一个`<select>` 元素,并给它一个独立的id属性,例如 "operator"。
这个下拉菜单将用于选择运算符。
4. 在 "operator" `<select>` 内部,创建四个 `<option>` 元素,分别代表加法、减法、乘法和除法,这些元素的值分别为 "+"、"-"、"*"和"/"。
简易计算器课程设计摘要
简易计算器课程设计摘要一、课程目标知识目标:1. 学生能够掌握简易计算器的基本功能,包括加、减、乘、除等四则运算。
2. 学生能够理解计算器的操作原理,了解显示屏、按键与内部电路之间的关系。
3. 学生能够运用计算器解决日常生活中遇到的基础数学问题。
技能目标:1. 学生能够熟练操作简易计算器,进行快速准确的计算。
2. 学生能够通过使用计算器,培养解决问题的能力和逻辑思维能力。
3. 学生能够通过小组合作,共同探讨计算器的使用技巧,提高团队协作能力。
情感态度价值观目标:1. 学生能够增强对数学学科的兴趣,认识到数学在生活中的重要性。
2. 学生能够树立正确的计算观念,注重计算的准确性和效率。
3. 学生能够培养严谨的学习态度,对待计算任务认真负责。
4. 学生能够学会尊重他人,学会倾听和分享,形成良好的团队合作精神。
课程性质:本课程为信息技术与数学学科的融合课程,以实践操作为主,注重培养学生的动手能力和解决问题的能力。
学生特点:四年级学生具备一定的数学基础和逻辑思维能力,对新鲜事物充满好奇心,喜欢动手操作。
教学要求:教师应结合学生特点,以实际操作为主,引导学生主动探究,注重培养学生的自主学习能力和团队合作精神。
在教学过程中,关注学生的个体差异,鼓励学生积极参与,确保每个学生都能达到课程目标。
通过本课程的学习,使学生能够将所学知识运用到实际生活中,提高综合素质。
二、教学内容本课程教学内容紧密结合课程目标,确保学生掌握简易计算器的使用及其背后的数学概念。
1. 计算器基础知识:- 计算器的发展历程- 计算器的种类及功能- 认识简易计算器的外观、按键布局及其功能2. 基本操作与四则运算:- 认识显示屏,理解操作结果- 学习加、减、乘、除四则运算的操作方法- 练习使用计算器解决实际问题3. 进阶操作与问题解决:- 掌握计算器上的额外功能,如百分比、乘方等- 解决涉及复合运算的数学问题- 通过计算器进行数据比较和分析教学大纲安排如下:- 第一课时:计算器基础知识介绍,认识简易计算器- 第二课时:基本操作学习,加、减、乘、除四则运算- 第三课时:进阶操作学习,掌握额外功能键的使用- 第四课时:综合练习,解决实际生活中的数学问题教学内容与教材关联性:- 章节一:数学基础知识与计算器操作- 章节二:四则运算在实际生活中的应用- 章节三:计算器的进阶功能及其在数学中的应用教学内容注重科学性和系统性,通过理论与实践相结合,使学生在学习过程中逐步提高计算能力和解决问题的能力。
简易计算器设计与实现
简易计算器设计与实现一、引言计算器是一种广泛应用的工具,可以进行基本的算数运算和一些科学计算,能够极大地方便人们的日常生活和工作。
本文将介绍一个简易的计算器的设计和实现方案。
二、设计思路1.功能选择:通过提供菜单供用户选择,以实现计算器常见功能如加法、减法、乘法、除法等。
2.输入输出处理:用户通过键盘输入待计算的数字和操作符,计算器将结果输出到屏幕上。
3.算术运算:根据用户选择的功能,进行相应的算术运算,如加法、减法、乘法、除法等。
4.错误处理:对于非法的输入,如除数为0,需要给出错误提示。
三、详细设计1.界面设计:计算器通过命令行界面展示,用户通过菜单选择功能。
界面可以提供以下功能选择菜单:1)加法2)减法3)乘法4)除法5)退出2.输入输出处理:在命令行界面上提示用户输入数字和操作符,并读取用户输入的数据。
用户输入格式为两个数字和一个操作符,操作符为"+","-","*"或"/"。
3.算术运算:a)加法运算:将两个数字相加,得到结果。
b)减法运算:将第一个数字减去第二个数字,得到结果。
c)乘法运算:将两个数字相乘,得到结果。
d)除法运算:将第一个数字除以第二个数字,得到结果。
在执行除法运算前,需要检查除数是否为0,如果为0,则给出错误提示。
4.错误处理:在用户选择除法运算时,需要检查除数是否为0。
如果为0,则输出错误提示信息,提示用户输入合法操作数。
五、实现以下为Python语言实现的简易计算器代码示例:```pythondef add(a, b):return a + bdef subtract(a, b):return a - bdef multiply(a, b):return a * bdef divide(a, b):if b == 0:raise ValueError("除数不能为0")return a / bdef calculator(:while True:print("请选择功能:")print("1) 加法")print("2) 减法")print("3) 乘法")print("4) 除法")print("5) 退出")choice = int(input()if choice == 1:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) result = add(a, b)print("计算结果:%f" % result)elif choice == 2:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) result = subtract(a, b)print("计算结果:%f" % result)elif choice == 3:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) result = multiply(a, b)print("计算结果:%f" % result)elif choice == 4:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) try:result = divide(a, b)print("计算结果:%f" % result)except ValueError as e:print("错误:%s" % str(e))elif choice == 5:breakelse:print("无效的选择,请重新选择功能。
简单计算器课程设计(DOC)
简单计算器课程设计一. 课程设计的目的Java语言是此刻流行的网络编程语言,它拥有面向对象、跨平台、散布应用等特色。
面向对象的开发方法是此刻世界最流行的开发方法,它不单具有更切近自然的语义,并且有益于软件的保护和继承。
为了进一步稳固讲堂上所学到的知识,深刻掌握Java语言的重要观点及其面向对象的特征,锻炼学生娴熟的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java 程序设计课程设计。
经过此次课程设计,稳固所学Java 语言基本知识,增进Java 语言编写基本功,掌握 JDK、Editplus、Eclipse、JCreator等开发工具的运用,拓宽常用类库的应用。
使学生经过该教课环节与手段,把所学课程及有关知识加以举一反三,全面掌握 Java 语言的编程思想及面向对象程序设计的方法,为此后从事实质工作打下坚固的基础。
二. 设计方案论证1.开发环境:JAVA编程工具 JDK 1.5.0 ,操作系统WindowsXP.2.功能描绘 :本计算器能够进行简单的四则运算(加、减、乘、除)但仅限于十进制下,还能够进行(八进制, 十进制, 十六进制)之间的互相变换, 八进制最多能够输入19 位数, 十进制最多能够输入18 位数,十六进制最多能够输入14 位数,backspace 表示退格,clear 表示初始化,在window 下直接运转(Jsp2003.bat )即可,界面为灰白对称。
3.纲要设计 :**********************************************************类名 : This_number_too_big作用 :自定义的异样类,用来办理计算结果溢出继承的父类 : Exception类实现的接口 :没有**********************************************************class This_number_too_big extends Exception{}// 自定义的一个结果溢出异样类**********************************************************类名 : Jsp2003作用:主类继承的父类 : Frame 类实现的接口 : ItemListener类,ActionListener类**********************************************************class Jsp2003 extends Frame implements ItemListener,ActionListener{public int number=0,length=18;//number 是用来记录输入的数字个数,//length是用来设置在不一样进制下同意输入的最多半字位数,默以为十进制char mark='n';//设置运算符号为没有即为‘ n’,它的值是‘ +’‘ - ’‘ * ’‘ / ’public double data=0;//设置运算数据为零public char ch;//用到暂时寄存所按按钮的第一个字符public boolean Refresh=false;//设置 lab 能否要在输入数据的时候刷新,初始为否4.主要方法说明://用来办理按了运算符后的计算 -public void js() throws This_number_too_big //指定由method抛出异常{if (mark=='n') //没有运算符{mark=ch; //,则设置运算符为刚才输入的字符,data=Double.parseDouble(lab.getText());//则设置运算数据为lab 的值Refresh=true;// 则设置下一次输入的时候要刷新lab}else //假如采纳的是连续运算(即没有使用‘=’号)则运转下边的语句{switch (mark) //依据运算符计算结果,并把结果保留到data{ case '+': data+=Double.parseDouble(lab.getText()); break;case '-': data-=Double.parseDouble(lab.getText()); break;case '*': data*=Double.parseDouble(lab.getText()); break;case '/': data/=Double.parseDouble(lab.getText()); break;}lab.setText(Double.toString(data)); //显示运算结果mark=ch;// 设置运算符为刚才按下的运算符Refresh=true;// 则设置下一次输入的时候要刷新 labnumber=lab.getText().length();//设置输入的字符个数// System.out.println(lab.getText());//用来调试用的if (data>Double.MAX_VALUE)//假如 data 超出 double 种类的最大值则抛出自定义的一个异样类{throw new This_number_too_big(); }}}//end js() methodpublic void enter()//办理输入字符{if(Refresh==true)//假如已经设置了运算符则在下一次输入数据的时候要把从前 lab 的内容消除去{lab.setText("0"); number=0; Refresh=false;}if(lab.getText().charAt(0)=='0'&& lab.getText().length()==1)//假如 lab 的内容为 0 则, lab 的内容将被所输入的字符取代,//不然直接在 lab 的内容后边加上所输入的字符{lab.setText(Character.toString(ch)); number++;}elseif(number<length){number++;lab.setText(lab.getText()+ch);}}//end enter() method//八进制或十六进制变换成十进制I public String goto_10(String s,long l)//参数 s:是要变换的字符串,因为输入的控制,保证了字符串的合法性;//参数 l :使用来设置是将 8 进制仍是 16 进制变换成 10 进制,它的有效值为8或 16;{ String str=s; //用来变换的字符串long j=l; //表示进制long lg=0,jing=1;//lg用来记录权乘和,jing用来记录位权char cha;//暂时记录要变换的字符for(int i=1;i<=str.length();i++){ cha=str.charAt(str.length()-i);switch(cha){ case '1': lg=lg+1*jing;break;case '2': lg=lg+2*jing;break;case '3': lg=lg+3*jing;break;case '4': lg=lg+4*jing;break;case '5': lg=lg+5*jing;break;case '6': lg=lg+6*jing;break;case '7': lg=lg+7*jing;break;case '8': lg=lg+8*jing;break;case '9': lg=lg+9*jing;break;case 'A': lg=lg+10*jing;break;case 'B': lg=lg+11*jing;break;case 'C': lg=lg+12*jing;break;case 'D': lg=lg+13*jing;break;case 'E': lg=lg+14*jing;break;case 'F': lg=lg+15*jing;break;}jing*=j; //位权升一级,为下次使用做好准备}return Long.toString(lg);}//end String goto_10() method}3.系统流程图开始初始化数据Double result=0; //储存结果Boolean newnum=true; //能否新数String lastop=” =”; /储存操作符按下数字按钮按下操作符( +-* 、 =)按钮判断把目前文本框的内容转为double 后传给calc 方法calc(double.parsedouble(txt.gettext()))newnumTrue false文本框显示新数;文本框接着显示Lastop=”操作txt.settext(“数txt.settext(txtgettext()+ ”符”newnum=true 字”)newnum=false 数字”)4.详尽设计第一剖析这个说要达成的任务,它的主要任务是达成十六进制、十进制、八进制和二进制之间的互相转变,需要包括负数,但不用考虑小数。
简易计算器的设计
简易计算器的设计一、引言计算器是一种常见的电子设备,用于进行数学运算。
然而,现在的计算器功能复杂,有时不易使用。
因此,为了满足用户的需求,我设计了一款简易计算器,以提供简单、直观和用户友好的界面。
二、设计目标1.提供基本数学运算功能,包括加、减、乘、除。
2.确保用户友好的界面设计,使用户易于操作。
3.提供结果的显示,并能够滚动以适应较长的计算结果。
4.支持清零功能,以便用户开始新的计算。
三、设计方案1.界面设计(1)计算器外观:采用手持式设计,与传统计算器外观类似,包括一个屏幕和一组按键。
(2)屏幕设计:使用液晶显示屏,具有高分辨率和抗眩光功能。
屏幕的大小根据实际需求来确定。
2.功能设计(1)基本运算功能:设计四个基本运算按键(加、减、乘、除)和一个等于键用于运算结果的计算。
(2)数字输入:提供0-9数字按键,以(3)小数点输入:提供小数点按键,以便用户输入小数。
(4)清零功能:提供一个清零键,以便用户能够轻松开始新的计算。
(5)结果显示:设计一个屏幕用于显示计算结果,并且能够滚动显示较长的结果。
3.系统设计(1)按钮交互:当用户按下数字、运算符或者清零键时,系统会根据不同按键的输入执行相应的操作。
(2)数学运算:系统在接收到运算符时,会将当前数字和运算符保存起来,当接收到等于键时,执行相应的数学运算并将结果显示在屏幕上。
(3)界面更新:系统根据用户输入时时更新屏幕上的数字和运算符。
四、流程图1.设计输入部分的流程图:(系统等待用户输入)↓(用户输入数字和运算符)↓(显示用户输入的结果)2.设计运算部分的流程图:(系统等待用户输入)↓(用户输入数字和运算符)↓(按下等于键)↓(执行数学运算)↓(显示计算结果)3.设计清零部分的流程图:(系统等待用户输入)↓(用户按下清零键)↓(清除屏幕上的显示内容)五、功能展示```_________________________________________ 2024计算器________________7,8________,________4,5________,________1,2________,________0,.________,________+,-________,________*,/________,________=,C____________,________,________,__________。
8086计算器仿真设计
实验报告一、设计任务:利用微机原理所学的8086微处理器相关知识为核心,利用Proteus仿真软件,设计一个关于计算器的仿真电路并编写汇编代码。
根据8086的结构和其寻址方式、输入输出、I/O 口读写等技术,使用汇编语言的基本语法、伪指令,结合Proteus软件SAMPLES中8086 Demo Board 示例的理解分析,自行设计。
二、需求分析:(1)用8086作为核心处理器;(2)用8255芯片连接主机与外设;(3)用74273锁存器对数据进行锁存;(4)用数码管显示器来显示输入的数字以及输出的结果;(5)由于需要输入数字及运算符所以要用到键盘;(6)用蜂鸣器在按下按键的同时发出声响;(7)连接整个电路要用到导线以及总线将相应的引脚相连接。
三、总体方案(选择与论证)1•方案的选择:基于技术成熟的Proteus软件,以Proteus软件SAMPLES中8086 Demo Board示例为蓝本并充分分析理解,在此基础上提出自己的设计方案。
将例子中电路结构优化精简,舍弃不必要的芯片,并用汇编来实现全部功能。
即计算器能够进行4位数的加、减、乘、除运算在此基础上,为使设计的计算器更具有实用性,我们通过循环调用的方式加入了对幕运算的功能。
与此同时,为优化人机界面,使计算器更为美观和实用,我们加入软件自带的封装好的矩阵键盘和蜂鸣器。
这就使得整个设计更加紧凑。
蜂鸣器实现了每按下一次按键就发出一次声响的功能以使按键检测更加直观,实际的计算器无差别。
此计算器拥有计数的功能,分自动计数和手动计数两种。
自动计数即为一个简单的计时器,用户可按需要定时,当到预定时间时,计算器会发声音提示用户。
手动计数有加1和减1两种,当用户需要计数某些场合中尤为适用。
2. 方案的论证:8086通过74273锁存器与8255A相连,使8086能够读外部数据和给外部芯片写数据。
8255A的A 口设置为输出,B 口和C 口设置为输入,将8255A分别和4*5矩阵、数码管、蜂鸣器相连接。
简易计算器完整课程设计
一、设计要求1.设计4*4的键盘,其中10个数字键0~9,第十三个键为”+“,第十五个键为”=“2 ,实现1位数的简单加运算二、硬件系统设计1、LED接口电路简易计算器需要2位8段码LED显示电路。
用LED显示器,用8255A的A口作为段码(字形代码)数据口,PB0和PB1作为位控制端口。
然后接至各数码显示器的共阴极端。
2、键盘接口电路简易计算器需要4*4的行列式键盘。
8255A的B口作为输出端,C口作为输出端。
采用的是方式0。
3、计算器逻辑电路图将LED接口电路和键盘接口电路结合到一起就是简易计算器的逻辑电路图逻辑电路结构如下:Cpu 8255 键盘三、软件设计1、LED显示程序设计LED显示器由七段发光二极管组成,排列成8字形状,因此也成为七段LED 显示器,器排列形状如下图所示:为了显示数字或符号,要为LED显示器提供代码,即字形代码。
七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。
简易计算器用到的数字0~9的共阴极字形代码如下表:0~9七段数码管共阴级字形代码2位LED显示的程序框图如下:2、读键输入程序设计为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。
为了得到被按键的键码,现使用行扫描法识别按键。
其程序框图如下:3、主程序设计(1)数值送显示缓冲程序设计简易计算器所显示的数值最大位为一位。
(2)运算主程序设计首先初始化参数,送LED低位显示“0”,高位不显示。
然后扫描键盘看是否有键输入,若有,读取键码。
判断键码是数字键、还是功能键(“+”“=”),是数值键则送LED显示并保存数值,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。
运算主程序框图如下所示:4、简易计算器源程序con8255 equ 06c6h ;8255的控制端口的物理号c8255 equ 06c4h ;C端口的端口号b8255 equ 06c2h ; B端口的端口号a8255 equ 06c0h ; A端口的端口号data segmentlist DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H ;对应数字的显示码keycode DB 0EEH, 0DEH, 0BEH, 7EHDB 0EDH, 0DDH, 0BDH, 7DHDB 0EBH, 0DBH, 0BBH, 7BHDB 0E7H, 0D7H, 0B7H, 77H;对应键的特征值(键盘识别码)num1 dw 0 ;偏移量x DB 0FFH ;存放参与运算的第一个数y DB 0FFH ;存放运算符z DB 0FFH ;存放参与运算的第二个数re DB 0FFH ;存放运算结果data endssstack segment stackssda db 100 dup(?)sstack endscode segmentassume cs:code, ds:datastart: mov ax, datamov ds, axcall init8255 ;初始化8255 ispk:call clear ;B端口清零call ispkey ;判断是否有建按下and al, 0fhcmp al, 0fhje ispkcall findkeyboardcall dispnumcmp num1, 14je js1call cunshujmp disnum1js1: call jisuanmov x, 0ffhmov y, 0ffhmov z, 0ffhmov nUM1, 0mov re,0ffhcall dispnummov cx,1000www: loop wwwjmp ispkdisnum1:is: jmp ispkmov ah, 4chint 21hinit8255 proc near ;初始化8255 mov al, bmov dx, 06c6hout dx, alretinit8255 endpclear proc nearmov dx, b8255out dx, alclear endpispkey proc near ;判断是否有建按下mov al, 00hmov dx, a8255out dx, almov dx, c8255in al, dxretispkey endpfindkeyboard proc near ;找具体键盘按键cl1: mov al, bmov ah, alshl ah, 4mov dx, a8255 ;al传递给a端口out dx, almov dx, c8255 ;c端口读入数据赋值给alin al, dxcmp al, 0fhje cl2jmp exitkcl2: mov al, bmov ah, alshl ah, 4mov dx, a8255out dx, almov dx, c8255in al, dxand al, 0fhcmp al, 0fhje cl3jmp exitkcl3: mov al, bmov ah, alshl ah, 4mov dx, a8255out dx, almov dx, c8255in al, dxand al, 0fhcmp al, 0fhje cl4jmp exitkcl4: mov al, bmov ah, alshl ah, 4mov dx, a8255out dx, almov dx, c8255in al, dxand al, 0fhcmp al, 0fhexitk:add ah, al ;得到键盘识别码retfindkeyboard endpdispnum proc near ;显示数字子程序cmp ah,0b7hjnz ll2mov cl,remov ch,0mov si,offset listadd si,cxmov al,[si]mov dx,06c2hout dx,almov num1,14jmp ll3ll2: mov cx, 16mov si, offset keycodemov di, offset listmov num1, 0numl1: cmp [si], ahje exitinc siadd num1, 1loop numl1exit: add di, num1 ;显示相应数字mov al, [di]mov dx, 06c2hout dx, alll3: retdispnum endpCUNSHU PROC NEAR ;存放数据PUSH AXCMP X, 0FFHJNE Y1MOV AL, BYTE PTR NUM1MOV X, ALJMP EX1Y1: CMP Y, 0FFHJNE Z1MOV AL, BYTE PTR NUM1MOV Y, ALJMP EX1Z1:MOV AL, BYTE PTR NUM1MOV Z, ALEX1: POP AXRETCUNSHU ENDPJISUAN PROC NEAR ;计算子程序PUSH SILEA SI, KEYCODEMOV AX, 0ADD AL, XADD AL, ZADD SI, AXMOV AH, [SI]MOV RE, ALPOP SIRETJISUAN ENDPcode endsend start四、心得体会课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
微机原理课程设计简易计算器
微机原理课程设计简易计算器`⼆○⼀⼀~⼆○⼀⼆学年第⼀学期信息科学与⼯程学院⾃动化系-课程设计计划书课程名称:微机原理及应⽤课程设计班级:⾃动化 0901姓名:王⽴学号: 4032 ]指导教师:孟志华⼆○⼀⼀年⼗⼆⽉六⽇⼀、课题名称简易计算器设计⼆、课题⽬的利⽤8088和8255设计⼀个简易计算器,并将其结果显⽰在LED数码管上。
熟悉系统设计的基本步骤,掌握8088与8255的接⼝设计,掌握通过8255设计键盘扫描技术,掌握通过8255显⽰七段共阴极数码管设计。
加强对8088数据总线,地址总线及接⼝寻址的理解,加深对8255的端⼝控制的理解。
,三、需求分析(1)能够实现99以内的加减乘法运算,并显⽰在2位LED上。
(2)对于减法运算产⽣的负数,可在LED上显⽰“-”号,若负量超过9,则显⽰“E0”。
四、⽅案选择⽅案⼀:|该⽅案将LED显⽰电路直接接在8088的DB上,⽽键盘则采⽤8255进⾏扫描。
¥⽅案⼆:该⽅案则是将LED 显⽰电路和键盘扫描电路分别接在两个不同的8255上,扫描和显⽰时,选中不同的8255。
⽅案三:】该⽅案则只⽤⼀⽚8255驱动LED 显⽰和键盘扫描电路。
⽅案评估:⽅案⼀:LED 显⽰驱动电路实现起来较简单,但是很浪费系统总线资源,舍弃!⽅案⼆:释放了系统数据总线,但是⽅案缺乏经济性,因为采⽤了两⽚8255,与建设资源节约型社会初衷冲突!舍弃!⽅案三:此种⽅案较为经济,⽅便,具有模块化的特点(因为将计算和显⽰电路全部集成在了8255上,应⽤时,直接挂接8255即可实现要求!)…综上所述:采⽤⽅案三!五、程序流程图程序总流程图:%判断输⼊流程图:六、系统原理图键盘映射图:}注:1、复位电路单独画在旁边,其参数设置符合6MHZ。
2、74HC04反相器由于位置不够,本⼈⾃⼰画了⼀个⼩型的74HC04。
3、IOW,IOR信号线由于采⽤了最⼤系统组态,故由8288的IORC和AIOWC代替。
8086实现计算器实验报告
实验报告一、题目:数字计算器的汇编语言实现二、设计任务:利用8086微处理器,可编程并行通信接口芯片 8255A等相关器件在proteus中设计仿真一个简单数字计算器,利用8086汇编语言编写完成加、减、乘、除、幂运算、阶乘运算、求余运算等功能,能实现键盘十进制运算表达式的输入和显示,按“=”后输出十进制表示的运算结果。
三、需求分析:(一)根据数据的输入要求对键盘(本实验中用4X5按钮阵来代替键盘)的数据读取及运算符号读取进行定义,根据8255A的相关性质对其进行编程实现,使每一个按钮对应一个十以内的整数或者某一个运算符号。
(二)根据8255A的输出性质,选择输出端口,对其进行编程,8255A为8086微处理器与外部设备之间提供并行输入/输出的通道。
不用附加外部电路,并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。
(三)数据的显示有LED数码管显示,LED数码管有7个字符段和一个小数点段组成,每段对应一个二极管,当二极管点亮时,相应的的字符段点亮,可以进行数据的显示。
四、总体方案首先利用程序不断扫描所设的按钮键盘是不是有输入,如果没有就一直扫描,如果有就调用子程序进行判断,是数值则进行存储并同时进行显示,是运算符号等就调用相应的子程序进行操作,操作后则继续利用程序不断扫描键盘是不是有输入,从而实现部分十进制数的加、减、乘、除、幂运算、阶乘运算、求最大公约数的运算。
运算完成后根据程序将运算的结果储存到锁存器中并显示到LED显示器上。
五、硬件设计本次实验需要的元器件有:8086微处理器、可编程并行通信接口芯片8255A、输入输出锁存器74LS373、LED数码显示管、若干按钮组成的4X5矩阵按键、若干电阻、总线等。
1、8086微处理器当引脚接高电平时,CPU工作于最小模式。
此时,引脚信号24~31的含义及其功能如下:(1)IO/M:存储器、I/O端口选择控制信号。
信号指明当前CPU是选择访问存储器还是访问I/O端口。
简单计算器8086汇编代码
【课题5】模拟十进制计算器(加,减)(一)设计要求1.通过小键盘输入,做十进制的加、减运算,允许五位数以内的不同数位的2个数相加或相减,连加与/或连减。
七段数码管显示器的高位作为符号位,其他5位作为输入数据和计算结果的显示。
2.数字用小键盘0~9;功能键为:A,B,C,D。
C———开始运算(包括取消没有完成的运算),六位七段数码管全部显示‘0’。
A———‘+’,加法操作。
B———‘-’,减法操作。
D———‘=’,计算并显示结果。
3.运算规则(按照一般计算器的功能要求):a.输入第一个数据,显示器跟随显示。
b.按‘+’或‘-’,显示器内容不变。
c.再输入第二个数据,显示器跟随显示。
d.按‘=’,显示器显示计算结果,当超出能显示的最大值时,显示“F”(溢出)。
e.按‘C’,清除显示,重新开始运算。
(二)提示1.七段数码管显示和键盘可参考软件实验9、10,LED显示实验,以及可参阅教材第9章有关章节。
2.显示是动态的、要不断刷新,建议把键盘输入与运算作为主程序,动态显示作为子程序,在主程序中调用显示子程序。
(三)要完成的工作1.设计出完整的汇编语言程序。
2.上机调试,在实验系统中通过验收。
3.写出课程设计报告,内容包括:设计思想、功能流程图、结果讨论和完整的源程序。
;(1)通过小键盘做十进制的加、减运算,允许不同数位的5个数相加或相减。
七段数码管显示器作输入数据和结果数据的显示。
;(2)数字用小键盘0~9,A、B、C、D作功能键。
;C———开始运算(包括撤销运算),显示‘0’。
;A———‘+’。
;B———‘-’。
;D———‘=’。
;E———退出,返回DOS。
;(3)运算顺序:;①输入一原始数据,显示器跟随显示。
;②按‘ +’或‘ -’,显示器内容不变。
;③再输入一数据,显示器跟随显示。
;④按‘ =’,显示器显示结果数据,当超出能显示的最大值时,显示“FFFFF”(溢出)。
;⑤按‘C’,重新开始运算。
;⑥按‘E’,结束退出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、设计题目及目的本次课程设计的实验目的是:通过该实验掌握较复杂程序的设计;能独立完成用程序对8086、8255A控制键盘和LED显示的控制,完成计算器加减法的应用;独立编写程序,明白和掌握程序的原理和实现方式;学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用;进一步加强理论知识与应用相结合的实践和锻炼,为以后的设计提供经验。
这次设计实践,加深了我对专业知识和理论知识学习的认识和理解,使我的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。
我们的具体任务是用8086设计一个能实现0~9整数加减乘除法的运算器,并用2位LED数码显示,键盘包括0-9,+ ,-,×,÷,=,NO/C共16个按键。
二、小组成员分工及成果在实验课程要求下,我们选择基于8086CPU的模拟计算器设计。
要完成设计首先需要构建简单的微型计算机应用系统,其次是确定组成各部件的芯片,然后画原理图,根据相应的原理以及实现过程,编写出相应的汇编代码。
再根据原理图连接硬件电路,电路连接完成后进行调试。
设计过程中我们用到了8086CPU、可编程并行输入/输出芯片8255A、74HC138、74HC373、矩阵式键盘、LED数码管。
我们的模拟计算器能实现2位十进制数以内的加减乘除法运算。
首先,本组的三个成员一起讨论研究简易计算器设计的主要方案。
粗略设计程序流程图以确定简易计算器设计的大概框架。
明确目的后各自查询资料了解设计原理、逐步清晰设计思路。
以下为大体分工:主要负责:1、设计主要程序,编写;2、查找资料验证修改;主要负责:1、选择需要用的各个芯片;2、设计硬件原理图;主要负责:1、各个芯片功能的资料查找;2、设计程序流程图三、设计方案思路用8086设计一个能实现0~9整数加减乘除法的运算器,并用2位LED数码显示,键盘包括0-9,+ ,-,×,÷,=,NO/C共16个按键。
1、通过小键盘做加减乘除运算。
2、数码管显示器作输入数据和结果数据的显示。
3、数字用小键盘0~9,“C、+、-、×、÷、= ”做功能键4、运算顺序:a.首先输入一个原始数据(在0~9之间,否则无反应)显示器跟随显示b.按“+、-、×、÷”显示器内容不变c.再次输入一个数据(在0~9之间,否则无反应)显示器跟随显示d.按“=”显示器显示结果数据e.按C显示“00”数据清0,并重新开始运算f.若输入一个数据后直接按“=”则数据不变设计思路:将整个程序划分为键盘扫描部分,显示部分,运算程序部分。
首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,利用汇编的程序核对输入键的数值,通过调用子程序实现运算。
运算完成后将运算的结果储存并显示到LED显示器上。
软件流程大致如下:开始,然后是系统的初始化,进行键盘扫描,对扫描的键值进行判断(分为数字键和功能键),若为数字键,则执行数字键处理程序,即显示数字并将数值存储;若为功能键,则先判断是否为清屏,如是清屏,则执行清屏子程序,如是加减乘除运算键则调用相应程序运算,如是等号键,则先判断上个符号位,调用相对应的运算子程序进行运算,如此就可以得到需要的结果了。
四、硬件原理图(包括芯片的选型介绍)硬件电路图:(见图1)图1 原理图1、键盘输入模块键盘是常用信息输入元件,其实键盘也是由一个个按钮组成,如果是独立按钮的话必须要对应一个I/O口对它进行检测,而键盘往往只需要键盘按钮数一半的I/O口对它进行检测,也许对一个比较简单的系统I/O口数一般不是问题,但对于一个大型、复杂的系统来说I/O资源就显得非常珍贵了,尽量减少I/O使用是非常利于降低成本,另外一方面键盘比用独立按键要美观,同时硬件上的节省必然导致软件上编程的复杂。
我们设计时使用的是4*4式键盘,如图2所示。
图2 键盘图中有4行4列,4根行线与PC口相连,4根列线与PA口相连。
按键设置在行、列交点处(数字或字符为其键号),行、列线分别连接到按键开关的两端。
键盘中有无按键按下是由行线送入全扫描字、列线读入行线状态来判断。
这就是:给行线所有I/O线均置成低电平,然后读入列线电平状态。
如果有按键按下,总会有一根列线电平被拉至低电平,从而使列线输入不全为1。
2、可编程并行通信接口芯片8255A图3 8255A(1)并行输入/输出端口A,B,C8255A内部包括三个8位的输入输出端口,分别是端口A、端口B、端口C,相应信号线是PA7~PA0、PB7~PB0、PC7~PC0。
端口都是8位,都可以作为输入或输出。
通常将端口A和端口B定义为输入/输出的数据端口,而端口C则既可以作数据端口,又可以作为端口A和端口B的状态和控制信息的传送端口。
(2)A组和B组控制部件端口A和端口C的高4位(PC7~PC4)构成A组;由A组控制部件实现控制功能。
端口B和端口C的低4位(PC3~PC0)构成B组;由B组控制部件实现控制功能。
A组和B组利用各自的控制单元来接收读写控制部件的命令和CPU通过数据总线(D0~D7)送来的控制字,并根据他们来定义各个端口的操作方式。
(3)数据总线缓冲存储器三态双向8位缓冲器,是8255A与8086CPU之间的数据接口。
与I/O操作有关的数据、控制字和状态信息都是通过该缓冲器进行传送。
(4) 读/写控制部件8255A是能完成读/写控制功能的部件。
能接收CPU的控制命令,并根据控制命令向各个功能部件发出操作指令。
CS 片选信号:由CPU输入,有效时表示该8255A被选中。
RD, WR 读、写控制信号:由CPU输入。
RD有效表示CPU读8255A,WR有效表示CPU写8255ARESET 复位信号:由CPU输入。
RESET信号有效,清除8255A中所有控制字寄存器内容,并将各个端口置成输入方式。
图4 8255A内部结构定义工作方式控制字:工作方式0:8255A中各端口的基本输入/输出方式。
图5 8255A工作方式控制3、显示模块图6 显示器显示原理:显示子程序把数据每一位独立显示,每次从最高位显示到最低位,在扫描键盘的时候不断调用显示子程序,形成了从高位到低位的不断循环显示,由于循环速度快,看起来就好像一起显示的。
4、74HC373图7 74HC373其中AD0-AD7为数据输入端,A0-A7为输出端。
当三态允许控制端OE为低电平时,A0-A7为正常逻辑状态,可用来驱动负载或总线,当OE 为高电平时,A0-A7成高阻态,不驱动总线。
当锁存允许端LE为高电平时,A随数据AD而变,当LE为低电平AD被锁存在已建立的数据电平。
5、74HC138图8 74HC13874HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。
74HC138译码器可接受3位二进制加权地址输入(A0, A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。
74HC138特有3个使能输入端:两个低有效(E1和E2)和一个高有效(E3)。
除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高,74HC138为反相输出,它按照三位二进制输入码和赋能输入条件,从8 个输出端中译出一个低电平输出。
两个低电平有效的赋能输入端和一个高电平有效的赋能输入端减少了扩展所需要的外接门或倒相器。
6、8086CPU图98086CPU的40条引脚信号可按功能分可分为四类,它们是:地址总线,数据总线,控制总线,其它(时钟与电源)。
最小模式下一些引脚功能(MN/MX接+5V):AD15~AD0,地址/数据总线A19/S6~A16/S3,地址/状态总线RD,读信号WR,写信号M/IO,存储器/输入输出控制信号ALE,地址锁存允许信号READY(Ready),准备就绪信号INTR,可屏蔽中断请求信号INTA,中断响应信号NMI,非屏蔽中断请求信号RESET,系统复位信号DEN,数据允许信号DT/R,数据发送/接收控制信号HOLD,总线保持请求信号输入HLDA,总线保持响应信号TEST,测试信号CLK,时钟输入信号VCC(+5V),GND六、程序清单,要有适当的注释DATA SEGMENTNUM1 DB 03H DUP(0)NUM DB 03H DUP(0)DATA ENDSSTACK SEGMENTDW 100 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKPORTA EQU 30H ;A口地址PORTB EQU 32HPORTC EQU 34HPORT8255 EQU 36H ;8255片选始地址MAIN PROC FAR(8255初始化)START: MOV AX,DATA ; 数据段MOV DS,AX ;将寄存器AX的内容传送给寄存器DSMOV DX,PORT8255 ;把8255计数器里的内容放到DX寄存器 MOV AL,81H ;A组方式0;A口输出,C口高四位输入 OUT DX,AL ;B组方式0;B口输出,C口低四位输入LOPL: XOR AH,AH ;抑或指令,使AH清零CALL KEY ;调用KEY程序CMP AH,00H ;把AH和00H相比较JZ LOPL ;ZF=1,即结果为0,则转到LOPLCMP AL,0FH ;把AL和0FH相比较JZ CCCL ;ZF=1,即结果为0,则转到CCCLCMP AL,0AH ;把AH和0AH相比较JZ LOPL ;ZF=1,即结果为0,则转到LOPLJNC LOPL ;若CF=0,表示第一个数大,转向LOPL OUT 32H,AL ;输出B口数据ALLOPL2: LEA SI,NUM ;将NUM的偏移地址给SIMOV [SI],AL ;将AL的数据存放在SI中PUSH AX ;AX出栈LOPL1: XOR AH,AH ;抑或指令,使AH清零CALL KEY ;调用KEY程序CMP AH,00H ;把AH和00H相比较JZ LOPL1 ;ZF=1,即结果为0,则转到LOPL1CMP AL,0FH ;把AL和0FH相比较JZ CCCL ;ZF=1,即结果为0,则转到CCCLCMP AL,0AH ;把AL和0AH相比较JZ XX1 ;ZF=1,即结果为0,则转到XX1CMP AL,0BH ;把AL和0BH相比较JZ XX2 ;ZF=1,即结果为0,则转到XX2CMP AL,0CH ;把AL和0CH相比较JZ XX3D ;ZF=1,即结果为0,则转到XX3DCMP AL,0DH ;把AL和0DH相比较JZ XX4D ;ZF=1,即结果为0,则转到XX4DJMP LOPL1 ;转移到LOPL1CCCL: MOV AL,00HOUT 32H,AL ;输出B口数据ALXX3D: CALL XX3 ;调用XX3程序XX4D: CALL XX4 ;调用XX4程序MAIN ENDPXX1 PROCNOP ;加LOPL3: XOR AH,AH ;抑或指令,使AH清零CALL KEY ;调用KEY程序CMP AH,00H ;把AH和00H相比较JZ LOPL3 ; ZF=1,即结果为0,则转到LOPL3CMP AL,0FH ;把AL和0FH相比较JZ CCCL ; ZF=1,即结果为0,则转到CCCLCMP AL,0AH ;把AL和0AH相比较JZ LOPL3 ; ZF=1,即结果为0,则转到LOPL3JNC LOPL3 ;若CF=0,表示第一个数大,转向LOPL3OUT 32H,AL ;输出B口数据ALPUSH AX ;AX出栈LEA SI,NUM ;将NUM的偏移地址给SIMOV [SI+1],AL ;将AL的数据存放在SI+1中LOPL4: XOR AH,AH ;抑或指令,使AH清零CALL KEY ;调用KEY程序CMP AH,00H ;把AH和00H相比较JZ LOPL4 ;ZF=1,即结果为0,则转到LOPL4CMP AL,0FH ;把AL和0FH相比较JZ CCCL ; ZF=1,即结果为0,则转到CCCLCMP AL,0EH ;把AL和0EH相比较JZ XXX1 ; ZF=1,即结果为0,则转到XXX1JMP LOPL4 ;转移到LOPL4XXX1: LEA SI,NUMMOV AL,[SI]AND AL,0FHMOV DL,[SI+1]AND DL,0FH ; 相与,高四位置0,低四位保持不变,赋给DL ADD AL,DLDAA ;转化成BCD码OUT 32H,AL ;输出B口数据ALJMP LOPL ;转移到LOPLXX1 ENDPXX2 PROCNOP ;减LOPL5: XOR AH,AH ;抑或指令,使AH清零CALL KEY ;调用KEY程序CMP AH,00H ;把AH和00H相比较JZ LOPL5 ;ZF=1,即结果为0,则转到LOPL5CMP AL,0FH ;把AL和0FH相比较JZ CCCL ;ZF=1,即结果为0,则转到CCCLCMP AL,0AH ;把AL和0AH相比较JZ LOPL5 ; ZF=1,即结果为0,则转到LOPL5JNC LOPL5PUSH AX ;AX出栈LEA SI,NUM ;将NUM的偏移地址给SIMOV [SI+1],AL ;将AL的数据存放在SI+1中LOPL6:XOR AH,AH ;抑或指令,使AH清零CALL KEY ;调用KEY程序CMP AH,00H ;把AH和00H相比较JZ LOPL6 ; ZF=1,即结果为0,则转到LOPL6 CMP AL,0FH ;把AL和0FH相比较JZ CCCL7 ;ZF=1,即结果为0,则转到LOPL7 CMP AL,0EH ;把AL和0EH相比较JZ XXX2 ;ZF=1,即结果为0,则转到XXX2JMP LOPL6 ;转移到LOPL6XXX2: LEA SI,NUM ;将NUM的偏移地址给SIMOV AL,[SI]AND AL,0FHMOV DL,[SI+1]AND DL,0FHSUB AL,DLADD AL,00HDAAOUT 32H,AL ;输出B口数据ALJMP LOPL ;转移到LOPLCCCL7: MOV AL,00HOUT 32H,AL ;输出B口数据ALJMP LOPL ;转移到LOPLXX2 ENDPXX3 PROC ;乘LOPL7: XOR AH,AH ;抑或指令,使AH清零CALL KEY ;调用KEY程序CMP AH,00H ;把AH和00H相比较JZ LOPL7 ;ZF=1,即结果为0,则转到LOPL7CMP AL,0FH ;把AL和0FH相比较JZ CCCL2 ;ZF=1,即结果为0,则转到CCCL2CMP AL,0AH ;把AL和0AH相比较JZ LOPL7 ; ZF=1,即结果为0,则转到LOPL7JNC LOPL7 ;若CF=0,表示第一个数大,转向LOPL OUT 32H,AL ;输出B口数据ALPUSH AX ;AX出栈LEA SI,NUM ;将NUM的偏移地址给SIMOV [SI+1],AL ;将AL的数据存放在SI+1中LOPL8: XOR AH,AH ;抑或指令,使AH清零CALL KEY ;调用KEY程序CMP AH,00H ;把AH和00H相比较JZ LOPL8 ;ZF=1,即结果为0,则转到LOPL8CMP AL,0FH ;把AL和0FH相比较JZ CCCL3 ; ZF=1,即结果为0,则转到CCCL3CMP AL,0EH ;把AL和0EH相比较JZ XXX3 ;ZF=1,即结果为0,则转到XXX3JMP LOPL8 ;转移到LOPL8XXX3: LEA SI,NUM ;将NUM的偏移地址给SIMOV AL,[SI]AND AL,0FHMOV DL,[SI+1]AND DL,0FHMUL DL ; DL*ALAAM ;商放AH,余数放ALMOV CL,4SAL AH,CL ;把AH向左移四位OR AL,AH ;或指令,有1置1OUT 32H,AL ;输出B口数据ALJMP LOPL ;转移到LOPLCCCL2: MOV AL,00HOUT 32H,AL ;输出B口数据ALJMP LOPL ;转移到LOPLCCCL3: MOV AL,00HOUT 32H,AL ;输出B口数据ALJMP LOPL ;转移到LOPLXX3 ENDPXX4 PROC ;除LOPL9: XOR AH,AH ;抑或指令,使AH清零CALL KEY ;调用KEY程序CMP AH,00H ;把AH和00H相比较JZ LOPL9 ; ZF=1,即结果为0,则转到LOPL9CMP AL,0FH ;把AL和0FH相比较JZ CCCL5 ; ZF=1,即结果为0,则转到CCCL5CMP AL,0AH ;把AL和0AH相比较JZ LOPL9 ;ZF=1,即结果为0,则转到LOPL9JNC LOPL9 ;若CF=0,表示第一个数大,转向LOPL9 OUT 32H,AL ;输出B口数据ALPUSH AX ;AX出栈LEA SI,NUM ;将NUM的偏移地址给SIMOV [SI+1],AL ;将AL的数据存放在SI+1中LOPL10: XOR AH,AH ;抑或指令,使AH清零CALL KEY ;调用KEY程序CMP AH,00H ;把AH和00H相比较JZ LOPL10 ;ZF=1,即结果为0,则转到LOPL10CMP AL,0FH ;把AL和0FH相比较JZ CCCL4 ;ZF=1,即结果为0,则转到CCCL4CMP AL,0EH ;把AL和0EH相比较JZ XXX4 ; ZF=1,即结果为0,则转到XXX4JMP LOPL10 ;转移到LOPL10XXX4: LEA SI,NUM ;将NUM的偏移地址给SIMOV AL,[SI]AND AL,0FH ;与指令,高四位清零,低四位不变MOV BL,[SI+1]AND BL,0FHAND AX,000FHDIV BL ; AL÷BL,商放在AL中,余数放在AH中OUT 32H,AL ;输出B口数据ALJMP LOPL ;转移到LOPLCCCL4: MOV AL,00HOUT 32H,AL ;输出B口数据ALJMP LOPL ;转移到LOPLCCCL5: MOV AL,00HOUT 32H,AL ;输出B口数据ALJMP LOPL ;转移到LOPLXX4 ENDPKEY PROCNOPLEA SI,NUM1MOV AL,0EHOUT 30H,AL ;输出A口数据ALIN AL,34HCMP AL,07H ;把AL和07H相比较JZ LL7 ; ZF=1,即结果为0,则转到LL7CMP AL,0BH ;把AL和0BH相比较JZ LL8 ;ZF=1,即结果为0,则转到LL8CMP AL,0DH ;把AL和0DH相比较JZ LL9 ; ZF=1,即结果为0,则转到LL9CMP AL,0EH ;把AL和0EH相比较JZ LDIV ; ZF=1,即结果为0,则转到LDIVSS1: MOV AL,0DHOUT 30H,AL ;输出A口数据ALIN AL,34HCMP AL,07H ;把AL和07H相比较JZ LL4 ; ZF=1,即结果为0,则转到LL4CMP AL,0BH ;把AL和0BH相比较JZ LL5 ; ZF=1,即结果为0,则转到LL5CMP AL,0DH ;把AL和0DH相比较JZ LL6 ;ZF=1,即结果为0,则转到LL6CMP AL,0EH ;把AL和0EH相比较JZ LMUL ; ZF=1,即结果为0,则转到LMULSS2: MOV AL,0BHOUT 30H,AL ;输出A口数据ALIN AL,34HCMP AL,07H ;把AL和07H相比较JZ LL1 ; ZF=1,即结果为0,则转到LL1CMP AL,0BH ;把AL和0BH相比较JZ LL2 ; ZF=1,即结果为0,则转到LL2CMP AL,0DH ;把AL和0DH相比较JZ LL3 ; ZF=1,即结果为0,则转到LL3 CMP AL,0EH ;把AL和0EH相比较JZ LSUB ;ZF=1,即结果为0,则转到LSUBSS3: MOV AL,07HOUT 30H,AL ;输出A口数据ALIN AL,34HCMP AL,07H ;把AL和07H相比较JZ SCLC ;ZF=1,即结果为0,则转到SCLC CMP AL,0BH ;把AL和0BH相比较JZ LL0 ;ZF=1,即结果为0,则转到LL0 CMP AL,0DH ;把AL和0DH相比较JZ LEQU ;ZF=1,即结果为0,则转到LEQU CMP AL,0EH ;把AL和0DH相比较JZ LADD ;ZF=1,即结果为0,则转到LADD JMP KCLC ;转移到KCLCLDIV: MOV AL,0DHJMP LCLCJMP LCLCLL1: MOV AL,01HJMP LCLCLL2: MOV AL,02HJMP LCLCLL3: MOV AL,03HJMP LCLCLL4: MOV AL,04HJMP LCLCLL5: MOV AL,05HJMP LCLCLL6: MOV AL,06HJMP LCLCLL7: MOV AL,07HJMP LCLCLL8: MOV AL,08HJMP LCLCLL9: MOV AL,09HJMP LCLCLADD: MOV AL,0AHJMP LCLCLSUB: MOV AL,0BHJMP LCLCLMUL: MOV AL,0CHJMP LCLCLEQU: MOV AL,0EHJMP LCLCSCLC: MOV AL,0FHLCLC: MOV [SI],AL ;将AL的数据存放在SI中MOV AH,01HKCLC:RET ; 强制复位KEY ENDP ;KEY结束CODE ENDS ;全部代码结束END START七、程序运行结果分析与预测图7 程序运行结果显示八、结果评述或总结本次实验是一个相对而言比较难的设计,因为这次设计不仅仅是课本上知识的整合,而且还有很多是课外的扩展。