ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:1.03MB ,
资源ID:25979900      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25979900.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(8086实现计算器实验报告.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、8086实现计算器实验报告实验报告一、题目:数字计算器的汇编语言实现二、设计任务:利用8086微处理器,可编程并行通信接口芯片 8255A等相关器件在proteus中设计仿真一个简单数字计算器,利用8086汇编语言编写完成加、减、乘、除、幂运算、阶乘运算、求余运算等功能,能实现键盘十进制运算表达式的输入和显示,按“=”后输出十进制表示的运算结果。三、需求分析:(一)根据数据的输入要求对键盘(本实验中用4X5按钮阵来代替键盘)的数据读取及运算符号读取进行定义,根据8255A的相关性质对其进行编程实现,使每一个按钮对应一个十以内的整数或者某一个运算符号。(二)根据8255A的输出性质,选择输出端口

2、,对其进行编程,8255A为8086微处理器与外部设备之间提供并行输入/输出的通道。不用附加外部电路,并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。(三)数据的显示有LED数码管显示,LED数码管有7个字符段和一个小数点段组成,每段对应一个二极管,当二极管点亮时,相应的的字符段点亮,可以进行数据的显示。四、总体方案首先利用程序不断扫描所设的按钮键盘是不是有输入,如果没有就一直扫描,如果有就调用子程序进行判断,是数值则进行存储并同时进行显示,是运算符号等就调用相应的子程序进行操作,操作后则继续利用程序不断扫描键盘是不是有输入,从而实现部分十进制数的加、减、乘、除、幂运算、阶乘运算

3、、求最大公约数的运算。运算完成后根据程序将运算的结果储存到锁存器中并显示到LED显示器上。五、硬件设计本次实验需要的元器件有:8086微处理器、可编程并行通信接口芯片8255A、输入输出锁存器74LS373、LED数码显示管、若干按钮组成的4X5矩阵按键、若干电阻、总线等。1、8086微处理器当引脚接高电平时,CPU工作于最小模式。此时,引脚信号2431的含义及其功能如下: (1)IO/M:存储器、I/O端口选择控制信号。信号指明当前CPU是选择访问存储器还是访问I/O端口。为高电平时访问存储器,表示当前要进行CPU与存储器之间的数据传送。为低电平时,访问I/O端口,表示当前要进行CPU与I/

4、O端口之间的数据传送。 (2)WR:写信号,输出,低电平有效。信号有效时,表明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。(3)INTA:可屏蔽中断响应信号,输出,低电平有效。 CPU通过信号对外设提出的可屏蔽中断请求做出响应。为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。 (4)ALE:地址锁存允许信号,输出,高电平有效。 CPU利用ALE信号可以把AD15 AD0地址/数据、A19/S6A16/S3地址/状态线上的地址信息锁存在地址锁存器中。 (5)DT:数据发送/接收信号,输出,三态。DT/信号用来控制数据传送的方向。DT/为高电平

5、时,CPU发送数据到存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。 (6)DEN:数据允许控制信号,输出,三态,低电平有效。信号用作总线收发器的选通控制信号。当为低电平时,表明CPU进行数据的读/写操作。 (7)HOLD:总线保持请求信号,输入,高电平有效。在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。 (8)HLDA:总线保持响应信号,输出,高电平有效。HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空

6、状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。 2、可编程并行通信接口芯片8255A8255A可为8086微处理器与外部设备之间提供并行输入/输出的通道。通过编程可以设置芯片的工作方式,因此,用8255A连接外部设备时,通常不用再附加外部电路。并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。 在输入过程中,输入设备把数据送给接口,并且使状态线“输入准备好”有效。接口把数据存放在“输入缓冲寄存器”中,同时使“输入回答”线有效,作为对外设的响应。外设在收到这个回答信号后,就撤消数

7、据和“输入准备好”信号。数据到达接口中后,接口会在“状态寄存器”中设置输入准备好标志,或者向CPU发一个中断请求。CPU可用查询方式或中断方式从接口中读取数据。接口中的数据被读取后,接口会自动清除状态寄存器中的标志,且撤消对CPU的中断请求。 在输出过程中,每当输出寄存器可以接收数据,接口就会将状态寄存器中“输出准备好”状态置1或向CPU发一个中断请求,CPU可用查询或中断方式向接口输出数据。当CPU输出的数据到达接口后,接口会清除“输出准备好”状态,把数据送往外设,并向外设发一个“数据输出准备好”信号。外设受到驱动后,便接收数据,并向接口电路发一个“输出回答”信号,接口收到该回答信号后,又将

8、状态寄存器中“输出准备好”置位,以便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、45矩阵

9、按键因为45矩阵键盘有9个管脚,于是将键盘的行接口接到8255A的PC口,列接口接到8255A的列接口。行键盘扫描一般要求有一部分的I/O口的工作方式是输入,另一部分I/O是输出,具体到45键盘则要求4个I/O口输入,另外4个输出,所以PC口接行。而PA、PB口要么全部输入或输出,所以PA 口接列接口,而所对应的键值=行数*5+列数,我们定义当键值在09之间时输入数据,当键值在1017之间是分别实现加、减、乘、除、幂运算、阶乘、求余、求最大公约数的运算,当键值为18时为等号,键值为19时为清零号。 六、软件设计(1)键盘输入数据或者符号的流程图 (2)计算器运算流程图 (3)源代码 DATA

10、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,5EH,79H,71H ;段码表 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX

11、,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

12、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

13、;再对下一列进行判断 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+列号) ;键值存放在D

14、L寄存器中 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 CAL

15、L COUNT ;调运算键处理子程序,计算第一个加数 JMP EXIT1 OUTP_CALL: CALL OUTP ;调等号键处理子程序 JMP EXIT1 CLR_CALL: CALL CLEAR ;调清除键处理子程序 EXIT1: RET KEYVALUE ENDP;以下为清除键处理子程序,按下清除键后,X变量全部清0 CLEAR PROC MOV X3,0 MOV X2,0 MOV X1,0 MOV X0,0 CALL BITP RET CLEAR ENDP;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量;并根据运算符号,调用相应的运算子程序 OUTP P

16、ROC 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 ;运算符为求幂,则调用求幂子程序 CMP S,15 JZ JC_CALL ;运算符为阶乘,则调用阶乘子程序 CMP S,1

17、6 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 JCPSTORE1: MOV AX,Y ;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量 CMP AX,0 JL CCC MOV DX,0 MOV BX,1000 DIV BX MOV X0, AL

18、 MOV AX,DX JMP DDD CCC: MOV X0,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 X1,AL JMP GGG FFF: MOV X1,85H GGG: MOV AL,AH MOV AH,0 MOV BL,10 DIV BL MOV CX,Y CMP CX,0 JNL HHH CMP AL,0 JZ III HHH: MOV X2,AL JMP JJJ III: MOV X2,85H JJJ: MOV X3,AH POP BX P

19、OP 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,X0 MOV

20、BX,1000 MUL BX MOV DX,AX C3: MOV AL,X1 MOV BL,100 MUL BL ADD DX,AX C2: MOV AL,X2 MOV BL,10 MUL BL ADD DX,AX C1: MOV AL,X3 MOV AH,0 ADD DX,AX CMP E,1 JNZ X1_S MOV X2,DX ;按下的是等号,则将第二个运算数据的值存入X2变量 JMP EXIT3 X1_S: MOV X1,DX ;按下的是运算符号,则将第一个运算数据的值存X1变量 MOV X3,0 ;清空X变量 MOV X2,0 MOV X1,0 MOV X0,0 EXIT3: POP

21、 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,X3 MOV AH,X2 MOV DL,X1 MOV DH,X0 MOV

22、CX,8 LL: SHL AX, 1 RCL DX,1 LOOP LL MOV X3,AL MOV X2,AH MOV X1,DL MOV X0,DH POP DX POP AX SSS: MOV DI,DL ;将当前键入的数据存放到X的最低位 INC CC ;数据位数加1 CMP CC,4 ;判断数据位数 JNG EXIT2 MOV CC,0 ;如果数据超过4位,重新从最低位开始存放 MOV X2,0 MOV X1,0 MOV X0,0 EXIT2: CALL DISP ;调显示子程序,显示输入的数据 RET NUMBER ENDP;加法子程序 ADDP PROC PUSH AX MOV A

23、X,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

24、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 MO

25、V 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

26、CC,1 JMP G JMP NONE QIAN: MOV AH,11100000B ;从第4位开始显示 MOV AL,AH OUT 44H,AL MOV BL,X0 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,X1 MOV AL,SI+BX OUT 42H,AL CALL DELY MOV AL,0 OUT 42H,ALSHI: MOV AH,10110000B ;从第2位开始显示 MOV AL,AH OUT

27、44H,AL MOV BL,X2 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,X3 MOV AL,SI+BX OUT 42H,AL CALL DELY JMP EXIT4NONE: MOV AL,0 ;X中没有数据,不显示 OUT 42H,AL EXIT4: POP AX POP BX RET DISP ENDP;分析数据位数子程序 BITP PROC CMP X0,0 ;如果X0不为0,则数据为4位数 JNZ FO

28、URBIT CMP X1,0 ;如果X1不为0,则数据为3位数 JNZ THREEBIT CMP X2,0 ;如果X2不为0,则数据为2位数 JNZ TOWBIT CMP X3,0 ;如果X3不为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

29、 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)、在完成各项功能时应确保各个子程序模块的协调调用,互不影响;

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

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