有简易计算器到复杂计算器的设计.doc_第1页
有简易计算器到复杂计算器的设计.doc_第2页
有简易计算器到复杂计算器的设计.doc_第3页
有简易计算器到复杂计算器的设计.doc_第4页
有简易计算器到复杂计算器的设计.doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机原理实验报告1.设计任务:根据微机原理课程所学相关知识及实验教程相关内容,在基于proteus平台,使用汇编语言,以8086为核心的情况下,配合可编程并行接口器件8255A,LED数码管等器件实现可进行简单四位数加减乘除法及清零、乘方、对数、二进制转换等扩展功能的十进制计算器。2.需求分析:操控核心为微处理器8086芯片,可编程并行接口芯片8255A对输入扫描的矩阵按键,显示模块LED数码管,其他辅助器件如74LS138译码器、74LS373等。3.总体方案(选择与论证)流程:第一步,确定键盘是否有输入(使用程序不断进行扫描)。第二步,如果有输入就调用子程序进行判断,是数值则进行存储并同时进行显示,是运算符号等就调用相应的子程序进行操作。第三步,继续扫描键盘是否有输入,从而实现4位十进制数以内的加减乘除法或者扩展功能运算。第四步,运算完成后将运算的结果储存并显示到LED显示器上。4.硬件设计实验中根据需求需以下器件:微处理器8086芯片当引脚接高电平时,CPU工作于最小模式。此时,引脚信号2431的含义及其功能如下: (1)IO/M/(memory I/O select):存储器、I/O端口选择控制信号。 信号指明当前CPU是选择访问存储器还是访问I/O端口。为高电平时访问存储器,表示当前要进行CPU与存储器之间的数据传送。为低电平时,访问I/O端口,表示当前要进行CPU与I/O端口之间的数据传送。 (2)WR/(write):写信号,输出,低电平有效。 信号有效时,表明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。(3)INTA/(interrupt acknowledge):可屏蔽中断响应信号,输出,低电平有效。 CPU通过信号对外设提出的可屏蔽中断请求做出响应。为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。 (4)ALE(address lock enable):地址锁存允许信号,输出,高电平有效。 CPU利用ALE信号可以把AD15 AD0地址/数据、A19/S6A16/S3地址/状态线上的地址信息锁存在地址锁存器中。 (5)DT/(data transmit or receive):数据发送/接收信号,输出,三态。 DT/信号用来控制数据传送的方向。DT/为高电平时,CPU发送数据到存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。 (6)DEN/(data enable):数据允许控制信号,输出,三态,低电平有效。信号用作总线收发器的选通控制信号。当为低电平时,表明CPU进行数据的读/写操作。 (7)HOLD(bus hold request):总线保持请求信号,输入,高电平有效。在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。 (8)HLDA(hold acknowledge):总线保持响应信号,输出,高电平有效。HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。 可编程并行接口芯片8255A微机系统的信息交换有两种方式:并行通信接口方式和串行通信接口方式。接口电路在CPU和I/O设备之间起着信号的变换和传输的作用。8255A可为86系列CPU与外部设备之间提供并行输入/输出的通道。由于它是可编程的,可以通过软件来设置芯片的工作方式,因此,用8255A连接外部设备时,通常不用再附加外部电路,使用教方便。并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。在输入过程中,输入设备把数据送给接口,并且使状态线“输入准备好”有效。接口把数据存放在“输入缓冲寄存器”中,同时使“输入回答”线有效,作为对外设的响应。外设在收到这个回答信号后,就撤消数据和“输入准备好”信号。数据到达接口中后,接口会在“状态寄存器”中设置输入准备好标志,或者向CPU发一个中断请求。CPU可用查询方式或中断方式从接口中读取数据。接口中的数据被读取后,接口会自动清除状态寄存器中的标志,且撤消对CPU的中断请求。在输出过程中,每当输出寄存器可以接收数据,接口就会将状态寄存器中“输出准备好”状态置1或向CPU发一个中断请求,CPU可用查询或中断方式向接口输出数据。当CPU输出的数据到达接口后,接口会清除“输出准备好”状态,把数据送往外设,并向外设发一个“数据输出准备好”信号。外设受到驱动后,便接收数据,并向接口电路发一个“输出回答”信号,接口收到该回答信号后,又将状态寄存器中“输出准备好”置位,以便CPU输出下一个数据。定义工作方式控制字: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口送入低电平是相应的段才被点亮。5.软件设计程序流程图:(1)总程序流程图:计算键值扫描加法运算减法运算显示乘法运算存储除法运算数值?运算符?“ = ” ?清零“ + ” ?“ - ” ?“ * ” ?(2)键盘扫描程序流程图:开始初始化延时12ms键扫描保存键值键闭合?键释放?结束键闭合?YYYNNN6.具体代码实现 DATA SEGMENT X DB ?,?,?,? ;存放数据的每一位 X1 DW ? ;存放第一个数据值 X2 DW ? ;存放第二个数据值 Y DW ? ;存放运算结果 S DB ? ;存放运算符号值 E DB ? ;按下等号键标记 CC DB ? ;存放运算数据位数 H DB 0 ;存放按键行号 L DB 0 ;存放按键列号Z1 DB ?Z2 DB ?Z3 DB ?Z4 DB ? 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,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,100 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,80H ;当前行状态下没有任何列有键按下,则转为对下一行的测试 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,100 LOOP $ ;延时消抖 IN AL,40H CMP AL,0FFH JNZ WAIT0 CALL KEYVALUE ;调计算键值子程序 EXIT: RET KEY ENDP ;以下为计算键值子程序,通过行列号计算键值(键值=列号*4+行号) ;键值存放在DL寄存器中 KEYVALUE PROC MOV DL,L MOV DH,H SHL DL,1 SHL DL,1 ;列号乘4 ADD DL,DH CMP DL,9 ;按下的是数字键 JNG NUM_CALL CMP DL,16 JL CONT_CALL ;按下的是运算键 CMP DL,16 JZ OUTP_CALL ;按下的是等于键 CMP DL,17 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 X3,0 MOV X2,0 MOV X1,0 MOV X0,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 LOG_CALL ;运算符为对数,则调用对数子程序 CMP S,12 JZ JCE_CALL ;运算符为阶乘号,则调用阶乘子程序 CMP S,13 JZ DIVP_CALL ;运算符为除号,则调用除法子程序 CMP S,14JZ K_CALL CMP S,15CALL ER JMP STORE1 ADD_CALL: CALL ADDP JMP STORE1 LOG_CALL: CALL LOG JMP STORE1 JCE_CALL: CALL JCE JMP STORE1 DIVP_CALL: CALL DIVP JMP STORE1K_CALL:CALL K STORE1: MOV AX,Y ;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量 MOV DX,0 MOV BX,1000 DIV BX MOV X0, AL MOV AX,DX MOV BL,100 DIV BL MOV X1,AL MOV AL,AH MOV AH,0 MOV BL,10 DIV BL MOV X2,AL MOV X3,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,X0 MOV 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 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 CX,8 LL: SHL AX, 1 RCL DX,1 LOOP LL MOV X3,AL MOV X2,AHMOV Z3,AH MOV X1,DLMOV Z2,DL MOV X0,DHMOV Z1,DH POP DX POP AX SSS: MOV DI,DL ;将当前键入的数据存放到X的最低位MOV Z4,DL 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 AX,X1 ADD AX,X2 MOV Y,AX POP AX RET ADDP ENDP ;对数子程序 LOG PROCPUSH AXPUSH BXPUSH CXPUSH DXMOV AX,X1MOV BX,0MOV CX,2MOV DX,0LO:DIV CXCMP AX,0JZ G2INC BXJMP LOG2:MOV Y,BXPOP DXPOP CXPOP BXPOP AXRETLOG ENDP;阶乘子程序 JCE PROCPUSH AXPUSH BXPUSH CXPUSH DXMOV AX,X1MOV DX,AXSUB DX,1MOV CX,DXMOV BX,DXCHENG:MUL DXDEC BXMOV DX,BXLOOP CHENGMOV Y,AXPOP DXPOP CXPOP BXPOP AXRETJCE 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;次方子程序 K PROC PUSH AX PUSH DX PUSH CX MOV AX,X1 MOV DX,AX MOV CX,X2DEC CX N:MUL DXMOV DX,X1 LOOP N MOV Y,AX POP CX POP DX POP AX RET K ENDP;二进制转换成十进制子程序ER PROC PUSH AXPUSH BXPUSH CXMOV BL,8MOV AL,Z1MUL BLMOV CX,AXMOV BL,4MOV AL,Z2MUL BLADD CX,AXMOV BL,2MOV AL,Z3MUL BLADD CX,AXMOV AL,Z4MOV BL,1MUL BLADD CX,AXMOV Y,CXPOP CXPOP BXPOP AXRETER 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,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,AL SHI: MOV AH,10110000B ;从第2位开始显示 MOV AL,AH OUT 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 EXIT4 NONE: MOV AL,0 ;X中没有数据,不显示 OUT 42H,AL EXIT4: POP AX POP BX RET DISP ENDP;分析数据位数子程序 BITP PROC CMP X0,0 ;如果X0不为0,则数据为4位数 JNZ FOURBIT 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 PROC PUSH CX MOV CX,100 LOOP $ POP CX RET DELY ENDP CODE ENDS END START7.调试与测试第一步,进行数码管显示的仿真。编写一段直接赋值送到数码管显示的程序,进行数码管显示的仿真。编写程序,输入使数码管显示“HELO”的程序,进行仿真,通过多次修改,最终可得结果如图:第二步,进行键盘扫描的仿真。编写代码,将扫描到的键值送到数码管显示。编写程序,使数码管显示所扫描到的键值,进行仿真,通过多次修改可得结果。测试步骤为:首先选取任意keypad键盘,连接好电路,按下键盘上数字的8,如图可见,电路线的颜色变化说明产生了脉冲。松开鼠标后,此时数码管显示为所扫描到的键值:再换其他案件,并使数码管显示相应扫描到的键值。第三步,在数码管显示和键盘扫描程序都正确的基础上,逐步增加代码,增加功能,逐步实现按键值的存储与显示、清零、加法、减法、乘法、除法等功能的仿真。第四步,在确立好了之前的计算器基础应有程序都正确后,又加入了几个扩展模块,再次模拟仿真,将调试不通过的扩展部分删去,只留下可执行的模块。1.实现二进制与十进制转换功能:输入二进制111b:按下二进制转换键:再按下=号键,可见数码管显示转换后的十进制数:2.实现求阶乘功能:1.按下要求的数,数码管开始显示:2.按下求阶乘按键,可见产生了脉冲:3.再按下=号键,可见数码管显示结果:计算器扩展后还有其他扩展功能,在此不作赘述。8.关键技术一、键盘扫描根据如上键盘及电路,可以先扫描列,再扫描行,先给出PC0为低电平,PC1、PC2、PC3均为高电平。若不按键盘,则PA0、PA1、PA2、PA3、PA4、PA5均为高电平,然后转入下一行测试,给下一行提供低电平、依次类推。若其中有键按下,则其对应位应显示低电平。这样,就把按下的键给定位了。根据以上键盘,通过计算按键的值来定位该位按键。键值=行*4+列,而行、列值可通过循环来实现。二、数据存储与显示首先定义X0、X1、X2、X3四个变量,分别存放按下数据的每一位的值,若为数字键,首先按下的数字存放在X3中,然后可以通过移位将输入的数据依次存放于X0、X1、X2、X3中,要将它的十进制的值,则只要分别乘以1000、100、10、1然后相乘后保存到原先定义好的变量X1中即可。同理,当输入第二个数据后,将其显示并保存于X2变量。为了能在数码管中显示,首先应定义一个数据段,这个数据段存放的二进制数做位数码管的输入,从而控制数码管的值,十进制数0到15对应的输入分别为 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H。因此,我们就将这一连串的数据存放到以变量名为DISCODE为地址的数据段中,并让DI指向DISCODE,要想输出一个数的话,只要让DI的地址加上这个数的值即可。联系上述所说的X0 、X1、X2、X3、要输出它们的值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论