8086实现计算器实验报告.docx

上传人:b****9 文档编号:25979900 上传时间:2023-06-16 格式:DOCX 页数:30 大小:1.03MB
下载 相关 举报
8086实现计算器实验报告.docx_第1页
第1页 / 共30页
8086实现计算器实验报告.docx_第2页
第2页 / 共30页
8086实现计算器实验报告.docx_第3页
第3页 / 共30页
8086实现计算器实验报告.docx_第4页
第4页 / 共30页
8086实现计算器实验报告.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

8086实现计算器实验报告.docx

《8086实现计算器实验报告.docx》由会员分享,可在线阅读,更多相关《8086实现计算器实验报告.docx(30页珍藏版)》请在冰豆网上搜索。

8086实现计算器实验报告.docx

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端口。

为高电平时访问存储器,表示当前要进行CPU与存储器之间的数据传送。

为低电平时,访问I/O端口,表示当前要进行CPU与I/O端口之间的数据传送。

(2)WR:

写信号,输出,低电平有效。

信号有效时,表明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。

(3)INTA:

可屏蔽中断响应信号,输出,低电平有效。

CPU通过信号对外设提出的可屏蔽中断请求做出响应。

为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。

(4)ALE:

地址锁存允许信号,输出,高电平有效。

CPU利用ALE信号可以把AD15~AD0地址/数据、A19/S6~A16/S3地址/状态线上的地址信息锁存在地址锁存器中。

(5)DT:

数据发送/接收信号,输出,三态。

DT/信号用来控制数据传送的方向。

DT/为高电平时,CPU发送数据到存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。

(6)DEN:

数据允许控制信号,输出,三态,低电平有效。

信号用作总线收发器的选通控制信号。

当为低电平时,表明CPU进行数据的读/写操作。

(7)HOLD:

总线保持请求信号,输入,高电平有效。

在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。

(8)HLDA:

总线保持响应信号,输出,高电平有效。

HLDA是与HOLD配合使用的联络信号。

在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。

2、可编程并行通信接口芯片8255A

8255A可为8086微处理器与外部设备之间提供并行输入/

输出的通道。

通过编程可以设置芯片的工作方式,因此,用8255A连接外部设备时,通常不用再附加外部电路。

并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。

  在输入过程中,输入设备把数据送给接口,并且使状态线“输入准备好”有效。

接口把数据存放在“输入缓冲寄存器”中,同时使“输入回答”线有效,作为对外设的响应。

外设在收到这个回答信号后,就撤消数据和“输入准备好”信号。

数据到达接口中后,接口会在“状态寄存器”中设置输入准备好标志,或者向CPU发一个中断请求。

CPU可用查询方式或中断方式从接口中读取数据。

接口中的数据被读取后,接口会自动清除状态寄存器中的标志,且撤消对CPU的中断请求。

  在输出过程中,每当输出寄存器可以接收数据,接口就会将状态寄存器中“输出准备好”状态置1或向CPU发一个中断请求,CPU可用查询或中断方式向接口输出数据。

当CPU输出的数据到达接口后,接口会清除“输出准备好”状态,把数据送往外设,并向外设发一个“数据输出准备好”信号。

外设受到驱动后,便接收数据,并向接口电路发一个“输出回答”信号,接口收到该回答信号后,又将状态寄存器中“输出准备好”置位,以便CPU输出下一个数据。

定义工作方式控制字:

 

 

3、LED数码显示管

LED由7个字符段和一个小数点段组成,每段对应一个发光二极管,当发光二极管点亮时,相应的字符段点亮。

LED有共阴极和共阳极两种供应状态。

共阴极显示时,将LED显示的COM接地,将八个字符段端a、b、c、d、e、f、g、dp依次与一个8位I/O口的最低到最高位连接,当I/O给LED的哪个字符段送入一个高电平时,该段就被点亮,从而可从这7个字符段中被点亮的构成相应的字符显示出来。

同理,COM阳极即将COM端接Vcc,其显示原理与COM阴极的基本相同,但I/O口送入低电平是相应的段才被点亮。

4、4×5矩阵按键

因为4×5矩阵键盘有9个管脚,于是将键盘的行接口接到8255A的PC口,列接口接到8255A的列接口。

行键盘扫描一般要求有一部分的I/O口的工作方式是输入,另一部分I/O是输出,具体到4×5键盘则要求4个I/O口输入,另外4个输出,所以PC口接行。

而PA、PB口要么全部输入或输出,所以PA口接列接口,而所对应的键值=行数*5+列数,我们定义当键值在0~9之间时输入数据,当键值在10~17之间是分别实现加、减、乘、除、幂运算、阶乘、求余、求最大公约数的运算,当键值为18时为等号,键值为19时为清零号。

六、软件设计

(1)键盘输入数据或者符号的流程图

(2)计算器运算流程图

\

(3)源代码

DATASEGMENT

XDB?

?

?

?

;存放数据的每一位

X1DW?

;存放第一个数据值

X2DW?

;存放第二个数据值

YDW?

;存放运算结果

SDB?

;存放运算符号值

EDB?

;按下等号键标记

CCDB?

;存放运算数据位数

HDB0;存放按键行号

LDB0;存放按键列号

DISCODEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;段码表

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVAL,90H;设置为A口输入,B口输出,C口输出

OUT46H,AL

MOVDI,OFFSETX+3;DI指向X的高位

KKK:

CALLKEY;扫描按键

JMPKKK

;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号

KEYPROC

CHECK:

CALLDISP;等待按键按下的同时进行显示

MOVAL,0F0H;所有行输出低电平

OUT44H,AL

INAL,40H

CMPAL,0FFH;读列值

JZCHECK;若都为高电平则无键按下,等待

MOVCX,50

LOOP$;延时消抖

INAL,DX;重读列值

CMPAL,0FFH

JZCHECK;无键按下一直等待

MOVH,0;有键按下,先把行列号变量清0

MOVL,0

MOVBL,01H

MOVBH,0FEH;扫描法读键值:

从第一行开始测试,即PC0输出低电平

NEXT:

MOVAL,BH

OUT44H,AL

NEXTH:

INAL,40H;读列值,判断是第几列有键按下

TESTAL,BL;从第一列开始判断

JZWAIT0

ROLBL,1

CMPBL,20H;当前行状态下没有任何列有键按下,则转为对下一行的测试

JZNEXTL

INCH;每判断一列,列号加1

JMPNEXTH;再对下一列进行判断

NEXTL:

MOVH,0

MOVBL,01H

ROLBH,1;对下一行测试,让下一个PC口输出低电平

CMPBH,0EFH

JZEXIT

INCL

JMPNEXT

WAIT0:

INAL,40H;若有键按下,则等该按键松开后再计算键值

CMPAL,0FFH

JNZWAIT0

MOVCX,50

LOOP$;延时消抖

INAL,40H

CMPAL,0FFH

JNZWAIT0

CALLKEYVALUE;调计算键值子程序

EXIT:

RET

KEYENDP

;以下为计算键值子程序,通过行列号计算键值(键值=行号*5+列号)

;键值存放在DL寄存器中

KEYVALUEPROC

MOVDL,L

MOVDH,H

XORAX,AX

MOVAL,5

MULDL

MOVDL,AL;行号乘5

ADDDL,DH

CMPDL,9;按下的是数字键

JNGNUM_CALL

CMPDL,18

JLCONT_CALL;按下的是运算键

CMPDL,18

JZOUTP_CALL;按下的是等于键

CMPDL,19

JZCLR_CALL;按下的是清除键

NUM_CALL:

CALLNUMBER;调数字键处理子程序

JMPEXIT1

CONT_CALL:

MOVS,DL;存放运算键的键值

MOVE,0

CALLCOUNT;调运算键处理子程序,计算第一个加数

JMPEXIT1

OUTP_CALL:

CALLOUTP;调等号键处理子程序

JMPEXIT1

CLR_CALL:

CALLCLEAR;调清除键处理子程序

EXIT1:

RET

KEYVALUEENDP

;以下为清除键处理子程序,按下清除键后,X变量全部清0

CLEARPROC

MOVX[3],0

MOVX[2],0

MOVX[1],0

MOVX[0],0

CALLBITP

RET

CLEARENDP

;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量

;并根据运算符号,调用相应的运算子程序

OUTPPROC

PUSHAX

PUSHDX

PUSHBX

INCE

CALLCOUNT;调运算键处理子程序,计算第二个运算数据

CMPS,10

JZADD_CALL;运算符为加号,则调用加法子程序

CMPS,11

JZSUB_CALL;运算符为减号,则调用减法子程序

CMPS,12

JZMUL_CALL;运算符为乘号,则调用乘法子程序

CMPS,13

JZDIVP_CALL;运算符为除号,则调用除法子程序

CMPS,14

JZPF_CALL;运算符为求幂,则调用求幂子程序

CMPS,15

JZJC_CALL;运算符为阶乘,则调用阶乘子程序

CMPS,16

CALLQYP;运算符为求余,则调用求余子程序

ADD_CALL:

CALLADDP

JMPSTORE1

SUB_CALL:

CALLSUBP

JMPSTORE1

MUL_CALL:

CALLMULP

JMPSTORE1

DIVP_CALL:

CALLDIVP

JMPSTORE1

PF_CALL:

CALLPF

JMPSTORE1

JC_CALL:

CALLJCP

STORE1:

MOVAX,Y;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量

CMPAX,0

JLCCC

MOVDX,0

MOVBX,1000

DIVBX

MOVX[0],AL

MOVAX,DX

JMPDDD

CCC:

MOVX[0],73H

MOVAX,Y

NEGAX

DDD:

MOVBL,100

DIVBL

MOVCX,Y

CMPCX,0

JNLEEE

CMPAL,0

JZFFF

EEE:

MOVX[1],AL

JMPGGG

FFF:

MOVX[1],85H

GGG:

MOVAL,AH

MOVAH,0

MOVBL,10

DIVBL

MOVCX,Y

CMPCX,0

JNLHHH

CMPAL,0

JZIII

HHH:

MOVX[2],AL

JMPJJJ

III:

MOVX[2],85H

JJJ:

MOVX[3],AH

POPBX

POPDX

POPAX

RET

OUTPENDP

;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量

;或者将第二个运算数据的数值计算出来并存入X2变量

;将运算符的值存入S变量

COUNTPROC

PUSHAX

PUSHBX

PUSHDX

MOVDX,0

CALLBITP;测试X中的数据是多少位

CMPCC,4;输入的数据是4位数?

JZC4

CMPCC,3;输入的数据是3位数?

JZC3

CMPCC,2;输入的数据是2位数?

JZC2

JMPC1;输入的数据是1位数?

C4:

MOVAX,0

MOVAL,X[0]

MOVBX,1000

MULBX

MOVDX,AX

C3:

MOVAL,X[1]

MOVBL,100

MULBL

ADDDX,AX

C2:

MOVAL,X[2]

MOVBL,10

MULBL

ADDDX,AX

C1:

MOVAL,X[3]

MOVAH,0

ADDDX,AX

CMPE,1

JNZX1_S

MOVX2,DX;按下的是等号,则将第二个运算数据的值存入X2变量

JMPEXIT3

X1_S:

MOVX1,DX;按下的是运算符号,则将第一个运算数据的值存X1变量

MOVX[3],0;清空X变量

MOVX[2],0

MOVX[1],0

MOVX[0],0

EXIT3:

POPDX

POPBX

POPAX

RET

COUNTENDP

;以下为数字键处理子程序

;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数

NUMBERPROC

CMPE,1

JNZCONTINUE

MOVE,0

CALLCLEAR

CONTINUE:

CMPCC,0;目前数据为0位,即没有数据,则转到SSS

JZSSS

;若已有数据,以下程序将X左移8位。

;例如:

先输入“1”,当再输入2时,

;先要将“1”从个位移到十位,然后再将“2”存放到个位

PUSHAX

PUSHDX

MOVAL,X[3]

MOVAH,X[2]

MOVDL,X[1]

MOVDH,X[0]

MOVCX,8

LL:

SHLAX,1

RCLDX,1

LOOPLL

MOVX[3],AL

MOVX[2],AH

MOVX[1],DL

MOVX[0],DH

POPDX

POPAX

SSS:

MOV[DI],DL;将当前键入的数据存放到X的最低位

INCCC;数据位数加1

CMPCC,4;判断数据位数

JNGEXIT2

MOVCC,0;如果数据超过4位,重新从最低位开始存放

MOVX[2],0

MOVX[1],0

MOVX[0],0

EXIT2:

CALLDISP;调显示子程序,显示输入的数据

RET

NUMBERENDP

;加法子程序

ADDPPROC

PUSHAX

MOVAX,X1

ADDAX,X2

MOVY,AX

POPAX

RET

ADDPENDP

;减法子程序

SUBPPROC

PUSHAX

MOVAX,X1

SUBAX,X2

MOVY,AX

POPAX

RET

SUBPENDP

;乘法子程序

MULPPROC

PUSHAX

PUSHDX

MOVAX,X1

MOVDX,X2

MULDX

MOVY,AX

POPDX

POPAX

RET

MULPENDP

;除法子程序

DIVPPROC

PUSHAX

PUSHBX

PUSHDX

MOVDX,0

MOVAX,X1

MOVBX,X2

DIVBX

MOVY,AX

POPDX

POPBX

POPAX

RET

DIVPENDP

;求幂子程序

PFPROC

PUSHAX

PUSHDX

PUSHCX

MOVCX,X2

MOVDX,X1

MOVAX,X1

DECCX

LOP:

MULDX

MOVDX,X1

LOOPLOP

MOVY,AX

POPCX

POPDX

POPAX

RET

PFENDP

;阶乘子程序

JCPPROC

PUSHAX

PUSHBX

PUSHCX

MOVCX,X1

MOVAX,X1

MOVBX,AX

DECBX

DECCX

BEGIN:

MULBX

DECBX

LOOPBEGIN

MOVY,AX

POPCX

POPBX

POPAX

RET

JCPENDP

;求余子程序

QYPPROC

PUSHAX

PUSHBX

PUSHDX

MOVDX,0

MOVAX,X1

MOVBX,X2

DIVBX

MOVY,DX

POPDX

POPBX

POPAX

RET

QYPENDP

;显示子程序,将X中的数值按位显示出来

DISPPROC

PUSHBX

PUSHAX

MOVBH,0

LEASI,DISCODE

CALLBITP;测试X位数

CMPCC,4

JZQIAN

CMPCC,3

JZBAI

CMPCC,2

JZSHI

CMPCC,1

JMPG

JMPNONE

QIAN:

MOVAH,11100000B;从第4位开始显示

MOVAL,AH

OUT44H,AL

MOVBL,X[0]

MOVAL,[SI+BX]

OUT42H,AL

CALLDELY

MOVAL,0

OUT42H,AL

BAI:

MOVAH,11010000B;从第3位开始显示

MOVAL,AH

OUT44H,AL

MOVBL,X[1]

MOVAL,[SI+BX]

OUT42H,AL

CALLDELY

MOVAL,0

OUT42H,AL

SHI:

MOVAH,10110000B;从第2位开始显示

MOVAL,AH

OUT44H,AL

MOVBL,X[2]

MOVAL,[SI+BX]

OUT42H,AL

CALLDELY

MOVAL,0

OUT42H,AL

G:

MOVAH,01110000B;从第1位开始显示

MOVAL,AH

OUT44H,AL

MOVBL,X[3]

MOVAL,[SI+BX]

OUT42H,AL

CALLDELY

JMPEXIT4

NONE:

MOVAL,0;X中没有数据,不显示

OUT42H,AL

EXIT4:

POPAX

POPBX

RET

DISPENDP

;分析数据位数子程序

BITPPROC

CMPX[0],0;如果X[0]不为0,则数据为4位数

JNZFOURBIT

CMPX[1],0;如果X[1]不为0,则数据为3位数

JNZTHREEBIT

CMPX[2],0;如果X[2]不为0,则数据为2位数

JNZTOWBIT

CMPX[3],0;如果X[3]不为0,则数据为1位数

JNZONEBIT

JMPZER0BIT;否则,没有数据

FOURBIT:

MOVCC,4

JMPEXIT5

THREEBIT:

MOVCC,3

JMPEXIT5

TOWBIT:

MOVCC,2

JMPEXIT5

ONEBIT:

MOVCC,1

JMPEXIT5

ZER0BIT:

MOVCC,0

EXIT5:

RET

BITPENDP

;延时子程序

DELYPROC

PUSHCX

MOVCX,100

LOOP$

POPCX

RET

DELYENDP

CODEENDS

ENDSTART

七、调试与测试

(1)任意四位十进制的加法。

输入X1=321;X2=567

(2)任意四位十进制的减法。

输入X1=321;X2=567

(3)任意四位十进制的乘法。

输入X1=21;X2=4

(4)任意四位十进制的除法。

输入X1=39;X2=3

(5)任意有效位十进制的求幂。

输入X1=3;X2=4

(6)任意有效位十进制的阶乘。

输入X1=4;X2=?

(7)任意有效位十进制的求余。

输入X1=9;X2=4

八、关键技术

(1)、通过按键扫描程序,来确定输入的字符类型(数字、运算符、等号、清除),并通过判断语句将输入存入相应的位置;

(2)、一般减法无法将小数减大数的结果正确显示,本设计通过部分关键子程序可以实现负数的显示;

(3)、在完成各项功能时应确保各个子程序模块的协调调用,互不影响;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1