微机原理 加法计算器设计及显示

合集下载

微机原理实验:加减法

微机原理实验:加减法
mov cx, 8 ; 循环次数
print: mov ah, 2
mov dl, '0'
test bl, 10000000b
jz zero
mov dl, '1'
zero: int 21h
shl bl, 1
loop print
; 设置背景及字体颜色
mov cx, 9 ; 字符数量
mov di, 01h ; 起始地址
jz zero_2
mov dl, '1'
zero_2: int 21h
shl bh, 1
loop print_2
; 设置背景及字体颜色来自mov cx, 9 ; 字符数量
mov di, 01h ; 起始地址
color_2: mov [di], 11100000b ;黄底(1110) ,黑字(0000)
add di, 2
color: mov [di], 11110001b ;白底(1111) ,蓝字(0001)
add di, 2
loop color
mov dl, 'b'
mov ah, 2
int 21h
mov ax, 4c00h
int 21h
(二)减法部分
name "add-sub"
org 100h
; set segment register
mov ax, 0b800h
mov ds, ax
; 8 + 10 = 18 (decimal) or bin=00010010b
mov al, 8
mov bl, 10
add bl, al
mov bh, bl ;保存加法结果

微机原理课件设计简易计算器

微机原理课件设计简易计算器

$二○一一~二○一二学年第一学期信息科学与工程学院自动化系:课程设计计划书课程名称:微机原理及应用课程设计班级:自动化 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代替。

4、8088的CLK由8284A提供,其电路连接方式参照Datasheet5、最大系统组态连接方式参照课本。

微机基本知识加法计算器设计及显示

微机基本知识加法计算器设计及显示

装订线实验报告课程名称:微机原理实验指导老师:成绩:实验名称:加法计算器及显示实验类型:同组学生姓名:一、实验目的和要求(必填)二、实验内容和原理(必填)三、主要仪器设备(必填)四、操作方法和实验步骤五、实验数据记录和处理六、实验结果与分析(必填)七、讨论、心得一、实验目的和要求1.掌握基于状态机的编程方法2.实现数字运算、键盘输入、LED显示的多任务协调编程二、实验内容和原理1.编写程序,输入两个两位十进制数并显示,按确认键后显示运算结果2.基本功能:能够输入输入数字(非数字无效)并显示结果3.附加功能:光标指示功能(通过LED闪烁实现)以及退格功能三、程序代码ORG 0000HSTART: MOV 78H,#0 ;初始化:78H放0的段码,其余放熄灭码MOV 79H,#10MOV 7AH,#10MOV 7BH,#10MOV 7CH,#10MOV R5,#0 ;R5是按键次数,初始置0MOV R6,#0 ;将0置入R6中MOV R7,#0 ;将0置入R7中MOV 30H,#0 ;30H是功能键存放单元,置为0MOV 31H,#0 ;31H单元初始置为0MOV 40H,#0 ;40H单元初始置为0MOV 41H,#0 ;41H单元初始置为0LOOP: LCALL DIR ;调用显示子程序LCALL KEY ;调用键盘检测程序INC R5 ;按键次数加1S1: CJNE A,#10,S2 ;不是"+"键,跳到S2LJMP FUN ;是"+"键,跳到FUNS2: CJNE A,#11,S3 ;不是"-"键,跳到S3LJMP FUN ;是"-"键,跳到FUNS3: CJNE A,#12,S4 ; 不是"*"键,跳到S4LJMP FUN ; 是"*"键,跳到FUNS4: CJNE A,#13,S5 ; 不是"/"键,跳到S5LJMP FUN ; 是"/"键,跳到FUNS5: CJNE A,#14,S6 ; 不是"="键,跳到S6LJMP FUN ;是"="键,跳到FUNS6: CJNE A,#15,N1 ; 不是"CL"键,跳到N1LJMP START ; 是"CL"键,跳到STARTN1: CJNE R5,#1,N2 ;若按键次数不等于1,跳到N2 LJMP D11 ;跳到D11N2: CJNE R5,#2,START;若按键次数不等于2,跳到START LJMP T1 ;跳到T1D11: MOV R4,A ;将A写入R4MOV 78H,A ;输入值送显示个位缓存MOV 79H,#10 ;将10送到79H单元LJMP LOOP ;跳转到循环T1: MOV 53H,A ;将A写入53HMOV B,#10 ;将10置入BMOV A,R4 ;将上一次输入的R4写进A MUL AB ;A乘以10ADD A,53H ;53H里面的值与A相加MOV R4,A ;将新的值置入到R4 MOV 79H,78H ;个位到十位MOV 78H,53H ;新数为个位LJMP LOOP ;跳转到循环FUN:MOV 78H,#10 ;将10置入到78H MOV 79H,#10 ;将10置入到79HMOV R0,30H ;与上次功能键交换MOV 30H,AMOV A,R0CJNE A,#10,FUN1 ;判断功能键LJMP ADDY ;"+"FUN1: CJNE A,#11,FUN2LJMP SUBT ;"-"FUN2: CJNE A,#12,FUN3LJMP MULT ;"*"FUN3: CJNE A,#13,FUN4LJMP DIVI ;"/"FUN4: CJNE A,#14,FUN5 ;首次按功能键,即A=#0 LJMP EQUA ;"="FUN5: MOV 40H,R4 ;保存第一个数MOV R5,#0 ;按键次数清零LJMP BCD ;将其拆为BCD码,以便后来将其显示OF: LJMP START ;跳转回开始ADDY: MOV A,40H ;加法,第一个数送累加器ADD A,R4 ;第一个数加第二个数MOV 40H,A ;存本次结果MOV R5,#0 ;按键次数清零LJMP BCD ;跳转到BCD程序SUBT: MOV A,40H ;减法,第一个数送累加器CLR C ;借位清零SUBB A,R4 ;带借位的减法,第一个数减第二个数JB CY,BCD2 ;借位为1,跳转到BCD2MOV 40H,A ;将减的结果送40HMOV R5,#0 ;按键次数清零LJMP BCD ;跳转到BCDMULT: MOV A,40H ;乘法,第一个数送累加器MOV B,A ;将A送BMOV A,R4 ;将第二个数送累加器MUL AB ;第一个数乘以第二个数MOV R5,#0 ;按键次数清零JB OV,BCD1 ;若乘法结果溢出,则跳转到BCD1 MOV 40H,A ;将A送40HLJMP BCD ;跳转到BCDDIVI: MOV A,R4 ;除法,第二个数送累加器MOV B,A ;将第二个数送BMOV A,40H ;将第一个数送ADIV AB ;A除以BJB OV,OF ;当B为0时跳到OFMOV 40H,A ;将A送40HMOV R5,#0 ;按键次数清零LJMP BCD ;跳转到BCDEQUA: MOV R5,#0 ;按键次数清零MOV 31H,A ;将A送31HLJMP BCD ;跳转到BCD;----乘法溢出时的处理程序BCD1: ;乘法溢出时的处理程序MOV 78H, B ;将高8位送78HMOV 79H, A ;将低8位送79HLCALL HEX2BCD ;调用子程序把78H、79H中的数字,转换成BCD码,送到7AH 7BH 7CH MOV A, 7CH ;下面,把万千百十个位,分别存入7CH 7BH 7AH 79H 78HMOV B, #16DIV AB ;除以16,目的是分离出高、低四位MOV 79H, A ;存放十位MOV 78H, B ;存放个位MOV A, 7AHMOV 7CH, A ;存放万位MOV A, 7BHMOV B, #16DIV ABMOV 7BH, AMOV 7AH, BLJMP LOOPHEX2BCD: ;子程序:把78H、79H中的数字,转换成BCD码,送到7AH 7BH 7CH CLR AMOV 7AH, A ;先清零MOV 7BH, AMOV 7CH, AMOV R6, #16 ;共转换十六位数LOOPP:CLR CMOV A, 79H ;从待转换数的高端移出一位到Cy RLC AMOV 79H, AMOV A, 78HRLC AMOV 78H, AMOV A, 7CH ;送到BCD码的低端ADDC A, 7CH ;带进位加。

微机原理课程设计简易计算器

微机原理课程设计简易计算器

-O一一〜二O—二学年第一学期信息科学与工程学院自动化系课程设计计划书二o—年十二月六日一、课题名称简易计算器设计二、课题目的利用8088和8255设计一个简易计算器,并将其结果显示在LED数码管上。

熟悉系统设计的基本步骤,掌握8088与8255的接口设计,掌握通过8255设计键盘扫描技术,掌握通过8255显示七段共阴极数码管设计。

加强对8088数据总线,地址总线及接口寻址的理解,加深对8255的端口控制的理解。

三、需求分析(1)能够实现99以内的加减乘法运算,并显示在2位LED上。

(2)对于减法运算产生的负数,可在LED上显示号,若负量超过9,则显示“E0S四、方案选择方案一:该方案将LED显示电路直接接在8088的DB上,而键盘则采用8255进行扫描。

方案二:该方案则是将LED显示电路和键盘扫描电路分别接在两个不同的8255上,扫描和显示时,选中不同的8255。

方案三:该方案则只用一片8255驱动LED显示和键盘扫描电路。

方案评估:方案一:LED显示驱动电路实现起来较简单,但是很浪费系统总线资源,舍弃!方案二:释放了系统数据总线,但是方案缺乏经济性,因为采用了两片8255,与建设资源节约型社会初衷冲突!舍弃!方案三:此种方案较为经济,方便,具有模块化的特点(因为将计算和显示电路全部集成在了8255上,应用时,直接挂接8255即可实现要求!)综上所述:采用方案三!五、程序流程图程序总流程图:判断输入流程图: 断电开始I六. 系统原理图键盘映射图:键盘编码图:系统原理图:注:1、复位电路单独画在旁边,其参数设置符合6MHZo2、74HC04反相器由于位置不够,本人自己画了一个小型的74HC04。

3、IOW, IOR信号线由于采用了最大系统组态,故由8288的IORC 和AIOWC 代替。

4.8088的CLK由8284A提供,其电路连接方式参照Datasheet5、最大系统组态连接方式参照课本。

6、LED与键盘扫描电路的上拉电阻阻值统一采用,保证数码管有足够亮度。

单片机十进制加法计算器设计

单片机十进制加法计算器设计

单片机十进制加法计算器设计设计概述:1.输入部分设计为了实现数字输入功能,可以采用4x4矩阵键盘作为输入设备。

通过扫描键盘矩阵,可以检测用户按下的按键,并将相应的按键字符存储在单片机内部的缓冲区中。

键盘扫描需要使用外部中断或定时器中断,在按键被按下时触发中断程序进行扫描和存储。

2.计算部分设计为了进行数字加法运算,需要在单片机中定义变量来存储输入的数字,并使用适当的算法进行加法运算。

加法运算可以通过逐位相加的方式实现,先对个位数进行加法运算,再对十位数进行加法运算,以此类推,直到最高位数。

3.显示部分设计为了显示运算结果,可以使用数码管来显示数字。

数码管的选型可以选择共阳极或共阴极的数码管,具体选择要根据实际的需求和电路设计来确定。

单片机需要通过IO口控制数码管的显示,将运算结果转化为相应的数码管段码,并通过IO口输出给数码管进行显示。

4.输出部分设计为了实现结果的输出,可以选择将结果通过串口发送给上位机,或者通过并行接口输出给其他设备。

具体的接口选择要根据实际的需求和电路设计来确定。

设计步骤:1.确定硬件平台和单片机型号,根据单片机的外设资源选择合适的输入、输出和显示设备。

2.进行电路设计,包括键盘输入电路、按键检测电路、数码管显示电路和外部接口电路。

3.编写单片机的初始化程序,包括IO口初始化、定时器中断初始化和中断服务程序编写。

4.编写键盘扫描程序,实现对键盘输入的检测和字符存储。

5.编写数字加法运算程序,实现输入数字的加法运算和结果的存储。

6.编写数码管显示程序,将加法运算结果转化为数码管的段码并进行显示。

7.编写输出程序,将结果通过串口或并行接口输出给上位机或其他设备。

8.进行调试和测试,优化程序和电路设计,确保计算器的稳定性和准确性。

9.编写用户界面程序,实现菜单、输入和输出操作的交互。

设计思路:利用单片机的运算和控制能力来实现数字加法的功能,以实现单片机十进制加法计算器的设计。

通过键盘输入,将数字存储在单片机内部的变量中,并采用逐位相加的算法实现数字加法运算。

8086简易计算器的设计微机原理计硬报告DOC

8086简易计算器的设计微机原理计硬报告DOC

简易计算器的设计 自动化(电站方向)计算机硬件技术实践报告题目 姓名 专业 班级学号上海电力学院自动化工程学院 实践报告内容(目录)一. 设计题目二.开发目的三.小组成员分工及成果四.设计方案以及论证五. 硬件原理图(包括芯片的选型介绍)六. 程序流程图(包括各个子系统和子过程的程序流程)七. 程序清单,要有适当的注释八. 程序运行结果分析与预测九. 结果评述或总结(对实验结果进行分析,对实验过程进行总结,系统改进升级建议或者提出新的方案等。

)8255 控制键. 设 计题目 :用 8086 设计一个能实现 0~9 整数加法运算的计算器 , 并用 2 位 LED 数码显示 . 键盘包 括0-9 , + , - ,*, / , =, ON/C;共16个按键.能实现简单的清零操作,减法运算,乘法运算.. 开发目的 :通过课程设计,熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,得到微机 开发应用方面的初步训练。

培养集体讨论设计题目的总体设计方案、 编程、软件硬件调试、 编写设计报告等问题,做到理论联系实际,提高动手能力和分析问题、解决问题的能力,实现由学习知识到应用知识的初步过渡。

通过本次课程设计熟练运用程序对 盘和LED 显示的控制,完成计算器加减法的应用,并熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法。

本组的三个成员一起讨论研究简易计算器设计的主要方案。

粗略设计程序流程图以确定简易计算器设计的大概框架。

明确目的后各自查询资料了解设计原理、逐步清晰设计思路。

以下为大体分工:主要负责: 1 、设计主要程序,编写;2、查找资料验证修改;主要负责: 1、选择需要用的各个芯片;2、设计硬件原理图;主要负责: 1、各个芯片功能的资料查找;2 、设计程序流程图四. 设计方案以及论证利用程序不断扫描所设的按钮键盘是不是有输入,如果没有就一直扫描,如果有就调 用子程序进行判断,是数值则进行存储并同时进行显示,是运算符号等就调用相应的子程 序进行操作,操作后则继续利用程序不断扫描键盘是不是有输入,从而实现部分十进制数 的加、减、乘、除的运算。

简易加减计算器设计

简易加减计算器设计

简易加减计算器设计一、引言计算器是一种用于进行数学计算的设备,它可以帮助我们进行各种加减乘除等运算。

本篇文章将介绍如何设计一个简易的加减计算器,该计算器基于数字电路的原理,通过逻辑门电路实现加法和减法运算。

二、设计思路1.确定输入和输出2.设计加法电路加法可以通过逻辑门电路实现,其中最基本的逻辑门是异或门。

我们可以使用多个异或门来实现加法,具体的实现方法如下:-使用8个异或门分别对两个二进制数的对应位进行异或运算,得到8个中间结果;-使用7个与门分别对中间结果和进位信号进行与运算,得到7个进位信号;-使用7个或门分别对进位信号进行或运算,得到进位输出;-使用一个或门对中间结果和进位输出进行或运算,得到最终的结果。

3.设计减法电路减法可以通过将减数取反然后与被减数进行加法运算来实现。

具体的实现方法如下:-对减数取反,可以使用8个反相器实现;-将取反后的减数和被减数输入到加法电路中进行加法运算,得到结果。

三、电路实现根据上述设计思路,我们可以使用数字集成电路来实现加减计算器。

以下是一个基于数字集成电路74LS83A的简易加减计算器电路图:```______________,---,A+B,----,S_______,,_____________,______---,M,---_______,,_________________-----------,B'+1=B__________```在上述电路图中,A和B分别表示两个8位二进制数的输入,S表示计算结果的输出,M表示减号操作符的输入,B'+1表示减数的取反。

四、测试与验证为了验证电路的正确性,我们需要进行测试。

我们可以编写一个测试程序,将各种情况的输入输入到电路中,并检查输出结果是否符合预期。

测试例子如下:输入:M=0预期输出:输入:M=1预期输出:通过编写测试程序,并根据预期结果检查输出结果,可以验证电路设计的正确性。

五、总结本篇文章介绍了如何设计一个简易的加减计算器,该计算器基于数字电路的原理,通过逻辑门电路实现加法和减法运算。

微机原理课设 计算器设计

微机原理课设 计算器设计

摘要21世纪是一个信息化日益加快的时代,它对人才的需求也呈现出新的变化趋势。

对计算机的掌握已成为了当今时代对人才考验的一项重要指标;大学计算机公共课程也面临着新的机遇和挑战。

基于此事实,微机原理课程在计算机教学上强调了对当今学生在“难度—深度—强度”三维同步教学上的侧重,并极力注重学生的实践能力的培养,本次课程设计,老师通过给学生布置一定的设计任务,而学生分组实践完成,从而达到对学生计算机原理知识的教学和汇编语言程序的锻炼。

汇编语言是联系C等高级语言到机器语言的重要编程语言,其指令是机器指令的一种符号表示,具有很强的机器相关性;也正基于此,可以实现起执行效率的很大提高本次课设是基于汇编语言的计算器设计,通过编写相应的程序代码实现一个16进制的简单计算器设计。

其能够实现实现16进制整数的加减乘除计算,通过键盘输入两个数据及选择运算符,回车输出16进制的结果。

关键词:汇编语言计算器 16进制目录1 设计任务及要求 (3)2方案比较及论证 (3)3 软件设计说明 (4)3.1 程序流程图 (4)3.2 源程序设计及说明 (5)4 程序调试说明和结果分析 (15)4.1 程序调试及说明 (15)4.2 结果分析 (19)5心得体会 (20)参考文献 (21)附录 (22)附录一 ASCII码表 (22)附录二 DOS系统功能调用(INT21H) (23)十六进制计算器的设计1 设计任务及要求(1) 利用汇编语言,能实现基本的计算功能,回车得到正确结果。

(2)实现16进制整数的加减乘除计算,输出16进制数。

(3) 按照规范撰写、装订课程设计说明书。

2方案比较及论证(1) 本次课程设计要求实现16进制的加减乘除运算,并能够显示运算数、运算符以及正确显示最终的运算结果。

我们自然想到通过DOS功能调用的9号调用来实现界面的显示。

9号调用的功能是实现多个字符输出到屏幕上的显示,这可以使我们实现简易计算器的设计,将输入数据回显到计算机界面上,而为了使计算结果的顺利显示,则可以通过编写一个功能模块首先使计算结果转化为其对应ASCII值,再特别地通过2号功能的调用最终完成计算结果的显示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告课程名称:微机原理实验指导老师: 成绩:实验名称: 加法计算器及显示实验类型: 同组学生姓名: 一、实验目的与要求(必填)ﻩﻩ二、实验内容与原理(必填)三、主要仪器设备(必填) ﻩﻩ四、操作方法与实验步骤五、实验数据记录与处理ﻩﻩ六、实验结果与分析(必填)七、讨论、心得一、实验目的与要求1.掌握基于状态机的编程方法2.实现数字运算、键盘输入、LED显示的多任务协调编程二、实验内容与原理1.编写程序,输入两个两位十进制数并显示,按确认键后显示运算结果2.基本功能:能够输入输入数字(非数字无效)并显示结果3.附加功能:光标指示功能(通过LED闪烁实现)以及退格功能三、程序代码ORG 0000HSTART: MOV78H,#0 ;初始化:78H放0的段码,其余放熄灭码MOV 79H,#10MOV7AH,#10MOV7BH,#10MOV 7CH,#10MOVR5,#0 ;R5就是按键次数,初始置0MOV R6,#0;将0置入R6中MOVR7,#0;将0置入R7中MOV30H,#0;30H就是功能键存放单元,置为0MOV 31H,#0 ;31H单元初始置为0MOV 40H,#0;40H单元初始置为0MOV41H,#0 ;41H单元初始置为0LOOP: LCALL DIR;调用显示子程序LCALLKEY ;调用键盘检测程序INC R5 ;按键次数加1S1: CJNE A,#10,S2;不就是"+"键,跳到S2LJMP FUN ;就是"+"键,跳到FUNS2: CJNE A,#11,S3;不就是"-"键,跳到S3LJMPFUN ;就是"-"键,跳到FUNS3: CJNE A,#12,S4 ;不就是"*"键,跳到S4LJMPFUN; 就是"*"键,跳到FUNS4:CJNEA,#13,S5 ; 不就是"/"键,跳到S5LJMPFUN ; 就是"/"键,跳到FUNS5: CJNEA,#14,S6 ; 不就是"="键,跳到S6LJMP FUN ;就是"="键,跳到FUNS6:CJNE A,#15,N1 ; 不就是"CL"键,跳到N1LJMP START; 就是"CL"键,跳到STARTN1: CJNE R5,#1,N2 ;若按键次数不等于1,跳到N2LJMP D11 ;跳到D11N2:CJNE R5,#2,START;若按键次数不等于2,跳到STARTLJMPT1 ;跳到T1D11: MOV R4,A;将A写入R4MOV 78H,A;输入值送显示个位缓存MOV 79H,#10;将10送到79H单元LJMP LOOP ;跳转到循环T1:MOV 53H,A;将A写入53HMOV B,#10;将10置入BMOVA,R4;将上一次输入的R4写进AMUL AB;A乘以10ADD A,53H ;53H里面的值与A相加MOV R4,A ;将新的值置入到R4MOV 79H,78H ;个位到十位MOV78H,53H;新数为个位LJMPLOOP;跳转到循环FUN:MOV 78H,#10 ;将10置入到78HMOV79H,#10;将10置入到79HMOV R0,30H ;与上次功能键交换MOV 30H,AMOV A,R0CJNE A,#10,FUN1;判断功能键LJMPADDY;"+"FUN1: CJNE A,#11,FUN2LJMP SUBT ;"-"FUN2: CJNE A,#12,FUN3LJMP MULT ;"*"FUN3: CJNE A,#13,FUN4LJMP DIVI;"/"FUN4: CJNE A,#14,FUN5 ;首次按功能键,即A=#0LJMPEQUA ;"="FUN5:MOV 40H,R4;保存第一个数MOVR5,#0;按键次数清零LJMPBCD ;将其拆为BCD码,以便后来将其显示OF: LJMP START ;跳转回开始ADDY: MOVA,40H ;加法,第一个数送累加器ADDA,R4 ;第一个数加第二个数MOV 40H,A ;存本次结果MOV R5,#0 ;按键次数清零LJMP BCD ;跳转到BCD程序SUBT: MOVA,40H;减法,第一个数送累加器CLRC;借位清零SUBB A,R4;带借位的减法,第一个数减第二个数JB CY,BCD2 ;借位为1,跳转到BCD2MOV 40H,A;将减的结果送40HMOVR5,#0 ;按键次数清零LJMPBCD ;跳转到BCDMULT: MOV A,40H ;乘法,第一个数送累加器MOV B,A;将A送BMOV A,R4;将第二个数送累加器MUL AB;第一个数乘以第二个数MOV R5,#0;按键次数清零JB OV,BCD1 ;若乘法结果溢出,则跳转到BCD1MOV40H,A ;将A送40HLJMP BCD;跳转到BCDDIVI: MOV A,R4 ;除法,第二个数送累加器MOV B,A;将第二个数送BMOVA,40H ;将第一个数送ADIVAB ;A除以BJB OV,OF ;当B为0时跳到OFMOV40H,A;将A送40HMOV R5,#0 ;按键次数清零LJMP BCD ;跳转到BCDEQUA: MOV R5,#0;按键次数清零MOV 31H,A ;将A送31HLJMP BCD ;跳转到BCD;----乘法溢出时的处理程序BCD1: ;乘法溢出时的处理程序MOV 78H, B;将高8位送78HMOV 79H, A ;将低8位送79HLCALLHEX2BCD;调用子程序把78H、79H中的数字,转换成BCD码,送到7AH 7BH 7CHMOVA, 7CH;下面,把万千百十个位,分别存入7CH 7BH7AH79H78HMOV B, #16DIV AB ;除以16,目的就是分离出高、低四位MOV 79H, A ;存放十位MOV 78H, B ;存放个位MOV A, 7AHMOV7CH,A;存放万位MOV A, 7BHMOV B, #16DIV ABMOV7BH, AMOV7AH, BLJMP LOOPHEX2BCD: ;子程序:把78H、79H中的数字,转换成BCD码,送到7AH7BH 7CH CLR AMOV 7AH, A ;先清零MOV7BH, AMOV7CH, AMOV R6, #16 ;共转换十六位数LOOPP:CLRCMOV A, 79H;从待转换数的高端移出一位到CyRLC AMOV79H, AMOVA, 78HRLC AMOV78H, AMOV A,7CH ;送到BCD码的低端ADDC A, 7CH ;带进位加。

自身相加,相当于左移一位DA A ;十进制调整,变成BCD码MOV7CH, AMOVA, 7BHADDCA,7BHDA AMOV 7BH, AMOV A, 7AHADDCA, 7AHMOV 7AH, ADJNZ R6,LOOPP ;共转换十六位数RETBCD2:MOV A,#100 ;减法第七位有借位时的处理程序CLR C;借位清零SUBBA,R4;100-被减数MOVR4,A ;将结果存在R4中MOV A,40H ;将减数给AADDA,R4 ;减数+(100-被减数)MOV R4,A ;将结果给R4MOV A,#100 ;将100给ACLR C ;将CY清零SUBB A,R4;100-(减数+(100-被减数))MOV B,#10;将10给BDIV AB ;A除以10MOV 7AH,#11 ;将11给7AH,以便显示符号MOV 79H,A;将A给79HMOV78H,B;将B给78HLJMPLOOP;跳转到LOOP;----拆为BCD码的程序BCD: MOV B,#10 ;将10给BMOVA,40Hﻩ;结果送累加器DIVAB ;结果除10MOV 41H,A ;41H暂存"商"MOVA,B ;取余数MOV78H,A ;余数送78HMOVB,#10 ;将10送BMOV A,41H ;将商送ADIVAB;A除以10CJNEA,#0,PANDUAN1;若A不等于0,则跳转到PANDUAN1 MOV 79H,B;若A等于0,则将B送79HLJMPRETURN;跳转到RETURNPANDUAN1:MOV7AH,Aﻩ;A送7AHMOV 79H,B ;B送79HRETURN:LJMP LOOP ;跳转到LOOP;----动态显示子程序DIR: MOVDPTR,#TAB ;数码管译码表首址MOV R0,#78H ;待显缓冲区个位地址CJNE R5,#1,ANJIAN2;判断按键次数就是否为1,不就是则跳转到ANJIAN2ANJIAN1: MOV A,@R0 ;将显示区的个位地址给AMOVC A,@A+DPTR ;查表CLRP2、3 ;点亮P2、3MOVP3,A;字段码送P3口LCALLDELAY1ms ;调延时1ms 子程序SETB P2、3 ;关闭P2、3MOV P3,#0FFH ;将P3口熄灭LCALL DELAY1ms;调用延时1ms子程序;----按键1次时光标闪烁功能INC R6 ;将R6加1CJNE R6,#70,SHANSHUO1 ;若R6不等于70,则跳转到SHANSHUO1SETB P2、2;将P2.2关闭MOVP3,#0FFH;将P2口熄灭LCALL DELAY1ms ;调用延时1ms子程序DEC R6;R6就减1INC R7 ;R7加1CJNE R7,#70,FANHUI ;判断R7就是否等于70,若不等于70,则跳转到FANHUIMOV R6,#0;将R6置0MOV R7,#0 ;将R7置0FANHUI:RET ;子程序返回SHANSHUO1:CLR P2、2;打开P2、2MOVP3,#0EFH ;显示“-”LCALL DELAY1ms;调用延时1ms子程序SETBP2.2;关闭P2、2MOV P3,#0FFH;熄灭P3RET ;返回;----按键次数为2显示ANJIAN2:CJNE R5,#2,ANJIANDENG;如果R5不等于0,则跳转到ANJIANDENGMOVA,@R0 ;将显示区的个位地址给AMOVC A,@A+DPTR ;查表CLRP2、3;点亮P2、3MOV P3,A ;将个位显示LCALL DELAY1ms ;调用延时1msSETBP2、3 ;关闭P2、3MOVP3,#0FFH ;关闭显示INC R0 ;R0加1MOVA,@R0 ;将显示区的十位地址给AMOVCA,@A+DPTR ;查表CLRP2、2;打开P2.2MOV P3,A ;将十位送P3显示LCALL DELAY1ms ;调用延时1ms子程序SETB P2、2 ;关闭P2.2MOV P3,#0FFH ;关闭显示;----按键两次时光标闪烁功能INCR6 ;R6加1CJNER6,#70,SHANSHUO2 ;判断R6就是否为70,若否跳转到SHANSHUO2 SETB P2.1 ;将P2、1关闭MOV P3,#0FFH ;关闭显示LCALL DELAY1ms ;调用延时1ms子程序DEC R6;R6减1INC R7 ;R7加1CJNE R7,#70,FANHUI2;若R7不等于70,则跳转到FANHUI2MOVR6,#0 ;将0送R6MOV R7,#0 ;将R7置0FANHUI2:RET;子程序返回SHANSHUO2:CLRP2.1;打开P2、1MOV P3,#0EFH ;显示“-”LCALL DELAY1ms ;调用延时1ms子程序SETB P2、1 ;关闭P2.1MOV P3,#0FFH;关闭显示RET ;返回;----按“=”键后的显示ANJIANDENG:MOVA,31H;将31H送ACJNE A,#0,ANJIAN0 ;A不等于0时跳转到ANJIAN0MOV A,@R0 ;将个位的地址送AMOVC A,@A+DPTR ;查表CLR P2.3;打开P2、3MOV P3,A;显示个位LCALLDELAY1ms ;调用延时1ms子程序SETB P2、3;关闭P2、3MOV P3,#0FFH;关闭显示INCR0;R0加1MOV A,@R0;将十位的地址送AMOVC A,@A+DPTR;查表CLR P2、2 ;打开P2、2MOVP3,A ;显示十位LCALL DELAY1ms;调用延时1ms子程序SETB P2、2 ;关闭P2、2MOV P3,#0FFH;关闭显示INCR0;R0加1MOV A,@R0 ;将百位地址送AMOVC A,@A+DPTR ;查表CLRP2、1;打开P2、1MOVP3,A;显示百位LCALL DELAY1ms;调用延时1ms子程序SETB P2、1 ;关闭P2、1MOV P3,#0FFH;关闭显示INC R0 ;R0加1MOV A,@R0 ;将千位的地址送AMOVC A,@A+DPTR ;查表CLRP2.0 ;打开P2、0MOV P3,A;显示千位LCALLDELAY1ms;调用延时1ms子程序SETB P2.0 ;关闭P2、0MOV P3,#0FFH;关闭显示RET ;返回;----没按键时的显示ANJIAN0: MOV A,@R0;将R0的地址送AMOVC A,@A+DPTR;查表CLR P2.3;打开P2、3MOVP3,A ;显示LCALL DELAY1ms ;调用延时1ms子程序SETBP2、3 ;关闭P2、3MOVP3,#0FFH ;关闭显示RET ;返回TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H,0FFH,0F7H;共阳极译码表DELAY1ms:MOV 50H,#2;延时1ms子程序LOOP1: MOV 53H,#248NOPLOOP2:DJNZ53H,LOOP2DJNZ 50H,LOOP1RETDELAY1:MOV 51H,#5 ;延时子程序DELAY1DELAY3:DJNZ 51H,DELAY3RET;----键盘子程序KEY: LCALL KS;调用检测按键子程序JNZK1 ;有键按下继续LCALLDELAY2 ;无键按调用延时去抖ACALL DIR;调用动态显示AJMP KEY;返回继续检测按键K1: LCALLDELAY2;有键按下延时去抖动LCALLKS ;再调用检测按腱子程序JNZK2 ;确认有按键进行下一步ACALL DIR;调用动态显示AJMPKEY;无键按下返回继续检测K2: MOV R2,#0EFH;将扫描值送入R2暂存MOVR3,#00H;将第一列值送入R3暂存K3:MOV P1,R2;将R2值送入P1口L0: JB P1、0,L1;P1、0等于1跳转到L1MOV A,#00H ;将第一行值送入ACCAJMPLK;跳转到键值处理程序L1: JBP1、1,L2;P1、1等于1跳转到L2MOVA,#04H;将第二行的行值送入ACCAJMPLK ;跳转到键值处理程序L2:JB P1.2,L3 ;P1.2等于1跳转到L3MOV A,#08H;将第三行行值送入ACCAJMP LK;跳转到键值处理程序L3: JB P1.3,NEXT ;P1、3等于1跳转到NEXT处MOV A,#0CH ;将第四行行值送入ACCLK:ADD A,R3;行值与列值相加后的键值送入A PUSHACC ;将A中的值送入堆栈暂存K4: LCALL DELAY2;调用延时去抖程序LCALLKS ;调用按键检测程序JNZ K4;按键没有松开继续返回检测POP ACC ;将堆栈值送入ACCMOV DPTR,#KEYTABMOVC A,@A+DPTRRETNEXT:INC R3 ;列值加一MOV A,R2;R2值送入AJNB ACC、7,KEY;扫描完至KEY处进行下一扫描RL A ;扫描未完将值左移一位进行下一列扫描MOV R2,A;将ACC值送入R2暂存AJMPK3 ;跳转到K3继续KS: MOV P1, #0FH;将P1口高四位置0低四位置1 MOV A,P1 ;读P1口XRL A,#0FH ;将A中的值与A中的值相异或RET ;子程序返回KEYTAB:DB1,2,3,10,4,5,6,11,7,8,9,12,15,0,14,13;键值表DELAY2:MOV 52H,#2H ;延时去抖动子程序LP1: MOV 53H,#0FAHLP2: DJNZ 53H,LP2DJNZ 52H,LP1RETEND微机原理加法计算器设计及显示四、讨论、心得本次计算器的实验就是一次综合性比较强的实验,对前面所学的知识就是一个很好的考察。

相关文档
最新文档