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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 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 程序运行结果显示八、结果评述或总结本次实验是一个相对而言比较难的设计,因为这次设计不仅仅是课本上知识的整合,而且还有很多是课外的扩展。