8086实现计算器实验报告

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

实验报告
一、题目:数字计算器的汇编语言实现
二、设计任务:
利用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)计算器运算流程图
\运行 程序初始化
延时12ms
键扫描
保存键值
按键
键释
结束
键闭
Y
Y
Y
N N N
扫描
计算键值
判断?
运算
‘’=’’?
清零
‘’+’’?
加法运算
‘’--’’?
加法运算
‘’*’’?
乘法运算
‘’/’’?
除法运算
‘’求幂’’?
幂运算显示
‘’阶乘’’?
阶乘运算存储
‘’求余’’?
求余运算
(3)源代码
DATA SEGMENT
X DB ?,?,?,? ;存放数据的每一位
X1 DW ? ;存放第一个数据值
X2 DW ? ;存放第二个数据值
Y DW ? ;存放运算结果
S DB ? ;存放运算符号值
E DB ? ;按下等号键标记
CC DB ? ;存放运算数据位数
H DB 0 ;存放按键行号
L DB 0 ;存放按键列号
DISCODE DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5
EH,79H,71H ;段码表
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,90H ;设置为A口输入,B口输出,C口输出 OUT 46H,AL
MOV DI,OFFSET X+3 ;DI指向X的高位 KKK: CALL KEY ;扫描按键
JMP KKK
;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号
KEY PROC
CHECK: CALL DISP ;等待按键按下的同时进行显示 MOV AL,0F0H ;所有行输出低电平
OUT 44H,AL
IN AL,40H
CMP AL,0FFH ;读列值
JZ CHECK ;若都为高电平则无键按下,等待 MOV CX,50
LOOP $ ;延时消抖
IN AL,DX ;重读列值
CMP AL,0FFH
JZ CHECK ;无键按下一直等待
MOV H,0 ;有键按下,先把行列号变量清0 MOV L,0
MOV BL,01H
MOV BH,0FEH ;扫描法读键值:从第一行开始测试,即PC0输出低电平
NEXT: MOV AL,BH
OUT 44H,AL
NEXTH: IN AL,40H ;读列值,判断是第几列有键按下 TEST AL,BL ;从第一列开始判断
JZ WAIT0
ROL BL,1
CMP BL,20H ;当前行状态下没有任何列有键按下,则转为对下一行的测试
JZ NEXTL
INC H ;每判断一列,列号加1
JMP NEXTH ;再对下一列进行判断
NEXTL: MOV H,0
MOV BL,01H
ROL BH,1;对下一行测试,让下一个PC口输出低电平 CMP BH,0EFH
JZ EXIT
INC L
JMP NEXT
WAIT0: IN AL,40H ;若有键按下,则等该按键松开后再计算键值
CMP AL,0FFH
JNZ WAIT0
MOV CX,50
LOOP $ ;延时消抖
IN AL,40H
CMP AL,0FFH
JNZ WAIT0
CALL KEYVALUE ;调计算键值子程序
EXIT: RET
KEY ENDP
;以下为计算键值子程序,通过行列号计算键值(键值=行号*5+列号)
;键值存放在DL寄存器中
KEYVALUE PROC
MOV DL,L
MOV DH,H
XOR AX,AX
MOV AL,5
MUL DL
MOV DL,AL ;行号乘5
ADD DL,DH
CMP DL,9 ;按下的是数字键
JNG NUM_CALL
CMP DL,18
JL CONT_CALL ;按下的是运算键
CMP DL,18
JZ OUTP_CALL ;按下的是等于键
CMP DL,19
JZ CLR_CALL ;按下的是清除键
NUM_CALL: CALL NUMBER ;调数字键处理子程序
JMP EXIT1
CONT_CALL: MOV S,DL ;存放运算键的键值
MOV E,0
CALL COUNT ;调运算键处理子程序,计算第一个加数
JMP EXIT1
OUTP_CALL: CALL OUTP ;调等号键处理子程序
JMP EXIT1
CLR_CALL: CALL CLEAR ;调清除键处理子程序
EXIT1: RET
KEYVALUE ENDP
;以下为清除键处理子程序,按下清除键后,X变量全部清0
CLEAR PROC
MOV X[3],0
MOV X[2],0
MOV X[1],0
MOV X[0],0
CALL BITP
RET
CLEAR ENDP
;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量
;并根据运算符号,调用相应的运算子程序
OUTP PROC
PUSH AX
PUSH DX
PUSH BX
INC E
CALL COUNT ;调运算键处理子程序,计算第二个运算数据
CMP S,10
JZ ADD_CALL ;运算符为加号,则调用加法子程序 CMP S,11
JZ SUB_CALL ;运算符为减号,则调用减法子程序 CMP S,12
JZ MUL_CALL ;运算符为乘号,则调用乘法子程序 CMP S,13
JZ DIVP_CALL ;运算符为除号,则调用除法子程序 CMP S,14
JZ PF_CALL ;运算符为求幂,则调用求幂子程序
JZ JC_CALL ;运算符为阶乘,则调用阶乘子程序 CMP S,16
CALL QYP ;运算符为求余,则调用求余子程序 ADD_CALL: CALL ADDP
JMP STORE1
SUB_CALL: CALL SUBP
JMP STORE1
MUL_CALL: CALL MULP
JMP STORE1
DIVP_CALL: CALL DIVP
JMP STORE1
PF_CALL: CALL PF
JMP STORE1
JC_CALL: CALL JCP
STORE1: MOV AX,Y ;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量
CMP AX,0
JL CCC
MOV DX,0
MOV BX,1000
DIV BX
MOV X[0], AL
MOV AX,DX
JMP DDD
CCC: MOV X[0],73H
MOV AX,Y
NEG AX
DDD: MOV BL,100
DIV BL
MOV CX,Y
CMP CX,0
JNL EEE
CMP AL,0
JZ FFF
EEE: MOV X[1],AL
JMP GGG
FFF: MOV X[1],85H
GGG: MOV AL,AH
MOV AH,0
MOV BL,10
DIV BL
MOV CX,Y
CMP CX,0
CMP AL,0
JZ III
HHH: MOV X[2],AL
JMP JJJ
III: MOV X[2],85H
JJJ: MOV X[3],AH
POP BX
POP DX
POP AX
RET
OUTP ENDP
;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量
;或者将第二个运算数据的数值计算出来并存入X2变量
;将运算符的值存入S变量
COUNT PROC
PUSH AX
PUSH BX
PUSH DX
MOV DX,0
CALL BITP ;测试X中的数据是多少位
CMP CC,4 ;输入的数据是4位数?
JZ C4
CMP CC,3 ;输入的数据是3位数?
JZ C3
CMP CC,2 ;输入的数据是2位数?
JZ C2
JMP C1 ;输入的数据是1位数?
C4: MOV AX,0
MOV AL,X[0]
MOV BX,1000
MUL BX
MOV DX,AX
C3: MOV AL,X[1]
MOV BL,100
MUL BL
ADD DX,AX
C2: MOV AL,X[2]
MOV BL,10
MUL BL
ADD DX,AX
C1: MOV AL,X[3]
ADD DX,AX
CMP E,1
JNZ X1_S
MOV X2,DX ;按下的是等号,则将第二个运算数据的值存入X2变量
JMP EXIT3
X1_S: MOV X1,DX ;按下的是运算符号,则将第一个运算数据的值存X1变量
MOV X[3],0 ;清空X变量
MOV X[2],0
MOV X[1],0
MOV X[0],0
EXIT3: POP DX
POP BX
POP AX
RET
COUNT ENDP
;以下为数字键处理子程序
;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数
NUMBER PROC
CMP E,1
JNZ CONTINUE
MOV E,0
CALL CLEAR
CONTINUE: CMP CC,0 ;目前数据为0位,即没有数据,则转到SSS
JZ SSS
;若已有数据,以下程序将X左移8位。

;例如:先输入“1”,当再输入2时,
;先要将“1”从个位移到十位,然后再将“2”存放到个位
PUSH AX
PUSH DX
MOV AL,X[3]
MOV AH,X[2]
MOV DL,X[1]
MOV DH,X[0]
MOV CX,8
LL: SHL AX, 1
RCL DX,1
LOOP LL
MOV X[3],AL
MOV X[2],AH
MOV X[1],DL
MOV X[0],DH
POP DX
POP AX
SSS: MOV [DI],DL ;将当前键入的数据存放到X的最低位
INC CC ;数据位数加1
CMP CC,4 ;判断数据位数
JNG EXIT2
MOV CC,0 ;如果数据超过4位,重新从最低位开始存放
MOV X[2],0
MOV X[1],0
MOV X[0],0
EXIT2: CALL DISP ;调显示子程序,显示输入的数据 RET
NUMBER ENDP
;加法子程序
ADDP PROC
PUSH AX
MOV AX,X1
ADD AX,X2
MOV Y,AX
POP AX
RET
ADDP ENDP
;减法子程序
SUBP PROC
PUSH AX
MOV AX,X1
SUB AX,X2
MOV Y,AX
POP AX
RET
SUBP ENDP
;乘法子程序
MULP PROC
PUSH AX
PUSH DX
MOV AX,X1
MOV DX,X2
MUL DX
MOV Y,AX
POP DX
POP AX
RET
MULP ENDP
;除法子程序
DIVP PROC
PUSH AX
PUSH BX
PUSH DX
MOV DX,0 MOV AX,X1 MOV BX,X2 DIV BX
MOV Y,AX POP DX
POP BX
POP AX
RET
DIVP ENDP
;求幂子程序
PF PROC
PUSH AX
PUSH DX
PUSH CX
MOV CX,X2
MOV DX,X1
MOV AX,X1
DEC CX
LOP: MUL DX
MOV DX,X1
LOOP LOP
MOV Y,AX
POP CX
POP DX
POP AX
RET
PF ENDP
;阶乘子程序
JCP PROC
PUSH AX
PUSH BX
PUSH CX
MOV CX,X1
MOV AX,X1
MOV BX,AX
DEC BX
DEC CX
BEGIN: MUL BX
DEC BX
LOOP BEGIN
MOV Y,AX
POP CX
POP BX
POP AX
RET
JCP ENDP
;求余子程序
QYP PROC
PUSH AX
PUSH BX
PUSH DX
MOV DX,0
MOV AX,X1
MOV BX,X2
DIV BX
MOV Y,DX
POP DX
POP BX
POP AX
RET
QYP ENDP
;显示子程序,将X中的数值按位显示出来
DISP PROC
PUSH BX
PUSH AX
MOV BH,0
LEA SI,DISCODE
CALL BITP ;测试X位数
CMP CC,4
JZ QIAN
CMP CC,3
JZ BAI
CMP CC,2
JZ SHI
CMP CC,1
JMP G
JMP NONE
QIAN: MOV AH,11100000B ;从第4位开始显示 MOV AL,AH
OUT 44H,AL
MOV BL,X[0]
MOV AL,[SI+BX]
OUT 42H,AL
CALL DELY
MOV AL,0
OUT 42H,AL
BAI: MOV AH,11010000B ;从第3位开始显示
MOV AL,AH
OUT 44H,AL
MOV BL,X[1]
MOV AL,[SI+BX]
OUT 42H,AL
CALL DELY
MOV AL,0
OUT 42H,AL
SHI: MOV AH,10110000B ;从第2位开始显示
MOV AL,AH
OUT 44H,AL
MOV BL,X[2]
MOV AL,[SI+BX]
OUT 42H,AL
CALL DELY
MOV AL,0
OUT 42H,AL
G: MOV AH,01110000B ;从第1位开始显示
MOV AL,AH
OUT 44H,AL
MOV BL,X[3]
MOV AL,[SI+BX]
OUT 42H,AL
CALL DELY
JMP EXIT4
NONE: MOV AL,0 ;X中没有数据,不显示
OUT 42H,AL
EXIT4: POP AX
POP BX
RET
DISP ENDP
;分析数据位数子程序
BITP PROC
CMP X[0],0 ;如果X[0]不为0,则数据为4位数 JNZ FOURBIT
CMP X[1],0 ;如果X[1]不为0,则数据为3位数 JNZ THREEBIT
CMP X[2],0 ;如果X[2]不为0,则数据为2位数 JNZ TOWBIT
CMP X[3],0 ;如果X[3]不为0,则数据为1位数 JNZ ONEBIT
JMP ZER0BIT ;否则,没有数据
FOURBIT: MOV CC,4
JMP EXIT5
THREEBIT: MOV CC,3
JMP EXIT5
TOWBIT: MOV CC,2
JMP EXIT5
ONEBIT: MOV CC,1
JMP EXIT5
ZER0BIT: MOV CC,0
EXIT5: RET
BITP ENDP
;延时子程序
DELY PROC
PUSH CX
MOV CX,100
LOOP $
POP CX
RET
DELY ENDP
CODE ENDS
END START
七、调试与测试
(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)、在完成各项功能时应确保各个子程序模块的协调调用,互不影响;
九、实际完成的功能
(1)加法功能
当输入X1、X2并且输入加法运算符时,进行加法子程序调用,完成加法功能。

(2)减法功能
1、当输入X1>=X2时,调用一般减法功能,完成X1-X2并将结果输出。

2、当输入X1<X2时,在调用一般减法子程序的基础上,并调用输出负好功能,对运算结果负数进行输出。

(3)乘法功能
当输入X1、X2时,并且输入乘法运算符时,调用乘法子程序,完成乘法功能,并对结果进行输出。

(4)除法功能
当输入X1大于X2且为X2(X2=!0)的整数倍时,并且输入除法运算符时,调用除法子程序,完成除法功能,并对结果进行输出。

(注意:如果不符合上述输入条件则输出结果将不能正常显示)。

(5)幂运算功能
当输入X1、X2时,并且输入幂运算符时,调用幂运算子程序,完成X1的X2次幂方运算,并对结果进行输出。

(6)阶乘运算功能
当输入X1时,并且输入阶乘运算符时,调用阶乘运算子程序,完成X1的阶乘,并对结果进行输出。

(7)阶乘运算功能
当输入X1大于X2且为X2(X2=!0)时,并且输入求余运算符时,调用求余运算子程序,完成求余功能,X1除以X2的余数进行输出。

(注意:如果不符合上述输入条件则输出结果将不能正常显示)
(8)清除功能
当输入任何字符错误时,点击将所有的输入清零。

10、总结
(1)、任务分工
(2)、其他部分
我们小组成员本来已将求任意两个数的最大公约数及清除一位的功能子程序编写完成且已在DEBUG环境中调试通过,但由于时间原因及一些连接问题当嵌入到主程序中无法正常调试,所以这两个功能没有实现成功。

相关文档
最新文档