您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 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、可编程并行通信接口芯片8255A8255A可为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键扫描保存键值按键键释结束键闭YYYNNN‘’求幂’’?‘’阶乘’’?‘’求余’’?扫描计算键值判断?运算‘’=’’?‘’+’’?‘’--’’?‘’/’’?清零乘法运算加法运算加法运算除法运算幂运算阶乘运算求余运算存储显示‘’*’’?(3)源代码DATASEGMENTXDB?,?,?,?;存放数据的每一位X1DW?;存放第一个数据值X2DW?;存放第二个数据值YDW?;存放运算结果SDB?;存放运算符号值EDB?;按下等号键标记CCDB?;存放运算数据位数HDB0;存放按键行号LDB0;存放按键列号DISCODEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;段码表DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,90H;设置为A口输入,B口输出,C口输出OUT46H,ALMOVDI,OFFSETX+3;DI指向X的高位KKK:CALLKEY;扫描按键JMPKKK;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号KEYPROCCHECK:CALLDISP;等待按键按下的同时进行显示MOVAL,0F0H;所有行输出低电平OUT44H,ALINAL,40HCMPAL,0FFH;读列值JZCHECK;若都为高电平则无键按下,等待MOVCX,50LOOP$;延时消抖INAL,DX;重读列值CMPAL,0FFHJZCHECK;无键按下一直等待MOVH,0;有键按下,先把行列号变量清0MOVL,0MOVBL,01HMOVBH,0FEH;扫描法读键值:从第一行开始测试,即PC0输出低电平NEXT:MOVAL,BHOUT44H,ALNEXTH:INAL,40H;读列值,判断是第几列有键按下TESTAL,BL;从第一列开始判断JZWAIT0ROLBL,1CMPBL,20H;当前行状态下没有任何列有键按下,则转为对下一行的测试JZNEXTLINCH;每判断一列,列号加1JMPNEXTH;再对下一列进行判断NEXTL:MOVH,0MOVBL,01HROLBH,1;对下一行测试,让下一个PC口输出低电平CMPBH,0EFHJZEXITINCLJMPNEXTWAIT0:INAL,40H;若有键按下,则等该按键松开后再计算键值CMPAL,0FFHJNZWAIT0MOVCX,50LOOP$;延时消抖INAL,40HCMPAL,0FFHJNZWAIT0CALLKEYVALUE;调计算键值子程序EXIT:RETKEYENDP;以下为计算键值子程序,通过行列号计算键值(键值=行号*5+列号);键值存放在DL寄存器中KEYVALUEPROCMOVDL,LMOVDH,HXORAX,AXMOVAL,5MULDLMOVDL,AL;行号乘5ADDDL,DHCMPDL,9;按下的是数字键JNGNUM_CALLCMPDL,18JLCONT_CALL;按下的是运算键CMPDL,18JZOUTP_CALL;按下的是等于键CMPDL,19JZCLR_CALL;按下的是清除键NUM_CALL:CALLNUMBER;调数字键处理子程序JMPEXIT1CONT_CALL:MOVS,DL;存放运算键的键值MOVE,0CALLCOUNT;调运算键处理子程序,计算第一个加数JMPEXIT1OUTP_CALL:CALLOUTP;调等号键处理子程序JMPEXIT1CLR_CALL:CALLCLEAR;调清除键处理子程序EXIT1:RETKEYVALUEENDP;以下为清除键处理子程序,按下清除键后,X变量全部清0CLEARPROCMOVX[3],0MOVX[2],0MOVX[1],0MOVX[0],0CALLBITPRETCLEARENDP;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量;并根据运算符号,调用相应的运算子程序OUTPPROCPUSHAXPUSHDXPUSHBXINCECALLCOUNT;调运算键处理子程序,计算第二个运算数据CMPS,10JZADD_CALL;运算符为加号,则调用加法子程序CMPS,11JZSUB_CALL;运算符为减号,则调用减法子程序CMPS,12JZMUL_CALL;运算符为乘号,则调用乘法子程序CMPS,13JZDIVP_CALL;运算符为除号,则调用除法子程序CMPS,14JZPF_CALL;运算符为求幂,则调用求幂子程序CMPS,15JZJC_CALL;运算符为阶乘,则调用阶乘子程序CMPS,16CALLQYP;运算符为求余,则调用求余子程序ADD_CALL:CALLADDPJMPSTORE1SUB_CALL:CALLSUBPJMPSTORE1MUL_CALL:CALLMULPJMPSTORE1DIVP_CALL:CALLDIVPJMPSTORE1PF_CALL:CALLPFJMPSTORE1JC_CALL:CALLJCPSTORE1:MOVAX,Y;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量CMPAX,0JLCCCMOVDX,0MOVBX,1000DIVBXMOVX[0],ALMOVAX,DXJMPDDDCCC:MOVX[0],73HMOVAX,YNEGAXDDD:MOVBL,100DIVBLMOVCX,YCMPCX,0JNLEEECMPAL,0JZFFFEEE:MOVX[1],ALJMPGGGFFF:MOVX[1],85HGGG:MOVAL,
本文标题:8086实现计算器实验报告
链接地址:https://www.777doc.com/doc-6488835 .html