微机模拟计算器运算课设.doc_第1页
微机模拟计算器运算课设.doc_第2页
微机模拟计算器运算课设.doc_第3页
微机模拟计算器运算课设.doc_第4页
微机模拟计算器运算课设.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

此文档收集于网络,如有侵权,请联系网站删除一、设计题目及要求:模拟计算器运算(加,减,乘)设计要求:1通过小键盘做加、减、乘、括号运算。数码管显示输入数据和计算结果数据。2按键规定:(1)数字用小键盘09输入。(2)功能按键设定:“A”“+”“D”“-”“B”“*”“F”“括号”“E”“=”“C”输入过程中撤消当前运算,此时屏幕显示“0”。3其它要求:(1)输入计算数据时,数码管应跟随显示。若超出显示范围则不响应超出部分。(2)按“+”、“-”、“*”或“括号”对应按键时,数码管当前显示内容不变。(3)按“=”时,显示器显示最终计算结果。若结果超出显示范围时,则显示“F”。(4)按“C”时,屏幕显示“0”。(5)需要考虑运算的优先级问题。(6)只考虑正整数运算,不考虑负数和实数运算。二、设计思想:调用键盘扫描子程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,并将输入的数字通过调用显示子程序显示到LED显示器上。利用汇编的程序核对输入键的数值,并把输入的表达式存储为中缀表达式,之后转化为后缀表达式,通过调用加,减,乘,括号,子程序实现后缀表达式的加、减、乘运算。运算完成后将运算的结果储存并显示到LED显示器上。简要流程中五大步骤的具体描述步骤(一):从小键盘输入合法中缀算术表达式,并将其存储到S1中此处用系统功能1号调用,每次从键盘输入一个字符,就将其存入到数组S1中,然后在判断此字符是否为等号,如果不是,则循环,继续输入字符,否则,程序往下执行。步骤(二):调用子程序CHANGE将中缀式转化为后缀式此处最核心的就是中缀表达式转化为后缀表达式的算法。具体思路为:用一个栈来存储与运算符号.先将字符压入栈中,并假设其优先级为0.然后遍历S1中的字符,遇到数字直接存入S2中并且输完数字后向S2中输入一空格以备计算结果时用。遇到运算符则先判断其与栈顶运算符的优先级谁大。如果S1中运算符号优先级大,则此运算符号直接入栈;否则栈顶符号先出栈到S2,待栈顶符号优先级小于S1中符号时,S1中元素入栈。步骤(三)调用子程序CALCULATE对后缀表达式进行有符号数的运算,并将最终结果存放在栈中遍历S2中的字符,遇到空格,则将前面数字字符串转换成的数据压入栈中。遇到加号,从栈中弹出两个数据进行加法运算,并将运算结果压入栈中。遇到减号,从栈中弹出两个数据进行减法运算,并将运算结果压入栈中。遇到乘号,从栈中弹出两个数据进行乘法运算,并将运算结果压入栈中。遇到除号,从栈中弹出两个数据进行除法运算,并将运算结果压入栈中。整个字符串遍历完后,最终计算结果就保存在栈中。步骤(四)POP AX,AX-STORAGE,即用STORAGE 存放最终运算结果将栈中保存的最后运算结果弹出,并保存到STORAGE中。步骤(五)调用子程序OUTPUT将运算结果输出先判断运算结果是否为负数,如果是,将-存入数组N中,并对运算结果求补。然后判断数据所在范围,小于32767大于一万则将运算结果除以一万,并将商赋给数组N;然后将余数除以一千将商赋给数组N;再将余数除以一百并将商赋给数组N;再将余数除以十并将商赋给数组N;最终将余数赋给数组N。如果数据更小,也是如此实现,只是步骤更少些。三、功能流程图:以上为主流程图以上为中缀表达式转化为后缀表达式的流程图。其每次向S2中输入一个字符,DI就会加1。当压入 (后,再压入0作为运算符优先级的判断;当压入+或-后,再压入01作为运算符优先级的判断;当压入*或/后,再压入02作为运算符优先级的判断。以上为计算后缀表达式数值的流程图以上为输出运算结果程序的流程图4、 结果讨论:计算结果举例这次课设分到题目第一反应是比较难的,之后仔细一思考的确没有多大头绪,感觉挺困难的,尤其是实现括号运算一点思路都没有。后来经过网上找相关资料和队友讨论渐渐有了思路,我们利用汇编的程序核对输入键的数值,并把输入的表达式存储为中缀表达式,之后转化为后缀表达式,通过调用加,减,乘,括号,子程序实现后缀表达式的加、减、乘运算。运算完成后将运算的结果储存并显示到LED显示器上。经过一个星期的反复实验终于完成了这次课设,在实验箱上可以完成结果在1024以内加减乘以及括号运算。并且在验收时老师提醒我们计算器显示要从左向右,于是我们又通过移位运算调整了显示顺序,并且在验收的时候我们发现自己没有溢出判断,这是我们需要完善的。这次课设中遇到很多问题,让我看到了自己的很多不足比如汇编能力不足,对芯片了解不深等等。同时这次课设让我巩固了所学的课本知识,提高了动手实践能力和团队合作能力,自己感觉收获还是很大的。附录:实验代码:(完整的源程序).MODEL TINYCOM_8255 EQU 0273HPA_8255 EQU 0270HPB_8255 EQU 0271HPC_8255 EQU 0272H.DATAS1 DB 60 DUP(66H),$;存储输入的中缀表达式子S2 DB 60 DUP(88H),$;存储后缀表达式子STORAGE DW ?,$;存储运算结果N DB 8 DUP(?),$;存储要输出的数字字符串BUF DB PLEASE INPUT EXPRESSION:,0AH,0DH,$BUF1 DB 0AH,0DH,EXPRESSION ERROR!$buffer DB 8 DUP(?);8个字节显示缓冲区signal DB 0;括号判断标志位SIGNAL1 DB 0SEG_TAB DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H;共阳极0到7DB 080H, 90H, 88H, 83H, 0C6H, 0A1H, 86H, 8EH, 0FFH;8到e和消隐.STACK 100.CODESTART: MOV AX,DATA MOV DS,AX MOV ES,AX NOP CLD;0-DF, 地址自动递增 mov al,10h mov cx,8h lea di,N REP STOSB MOV DX,COM_8255 MOV signal , 0;初始化标志位 MOV SIGNAL1 , 0 MOV AL,89H;初始化8255 (10001001) OUT DX,AL;PA、PB输出,PC输入 LEA DI,buffer;取buffer地址 MOV AL,00H stosb MOV AL,10H MOV CX,07H REP STOSB;初始为0010101010101010 CALL DIR ;复位显示 MOV SI,0 lea di,buffer ; mov STORAGE,0LL: call KEYI MOV S1SI,AL INC SI cmp al,09H jle dis ;如果是数字则转跳显示 r: CMP AL,0CH;c JE start;如果是c就复位 CMP AL,0EH ; = JNE LL;如果不是=就返回继续输入 JMP LLL;如果是=就开始计算jstart: jmp startdis: push ax push si CMP SIGNAL1,1 JZ LL1 MOV SIGNAL1,1 LEA DI,buffer;取buffer地址 MOV AL,10H stosb LL1: mov si,6 mov cx,7rr: mov al,buffersi mov buffersi+1,al dec si loop rr POP si POP ax lea di,buffer stosb call DIR jmp r LLL: CALL CHANGE;调用中缀转后缀子程序 CALL CALCULATE;调用计算后缀表达式子程序NEXT0 : POP AX;取出运算结果 CMP AX, JE NEXT1 MOV STORAGE,AX;结果存入STORAGE CALL OUTPUT;调用输出运算结果子程序NEXT1: call DIR call keyi;等待复位按钮 cmp al, 0cH;如果是c就复位 je jstart jmp NEXT1ERROR: LEA DI,buffer MOV AL,0FH MOV CX,08H REP STOSB CALL DIR;如果出错就显示F JMP NEXT1 CHANGE PROC NEAR;中缀表达式转换为后缀表达式的子程序 MOV AH,0 MOV DH,0 MOV SI,0 MOV DI,0 PUSH DICHA: MOV AL,S1SI;顺序取字符 INC SI CMP AL,0EH ; = JE jl8 CMP AL,0FH ; () JE L1 CMP AL,0Ah ; + JE L2 CMP AL,0Dh ; - JE L3 CMP AL,0BH ; * JE L4 CMP AL,0 JGE jl7;数字则转跳 JMP ERROR;非法字符则ERROR L1:;对左括号的处理 CMP signal,01H;右括号则转跳 JE L6 MOV BL,01H MOV signal,BL;标记置1 PUSH AX;左括号直接入栈 MOV AX,0 PUSH AX;优先级置0 JMP CHA L2:;对加法的处理 MOV BP,SP MOV DL,BP CMP DL,01H;如果栈顶符号优先级大于等于1 JGE L21 PUSH AX;否则入栈 MOV DX,0101H;优先级置1 PUSH DX JMP CHAL21: POP DX;优先级出栈 POP BX;符号出栈 MOV S2DI,BL;符号写入S2 INC DI JMP L2;返回L2继续判断jl8: jmp L8;转跳中转 jl7: jmp L7 ;转跳中转jn01: jmp next0;转跳中转L3:;对减法的处理 MOV BP,SP MOV DX,BP CMP DL,01H;如果栈顶符号优先级大于等于1 JGE L31 PUSH AX;否则入栈 MOV DX,0201H;优先级置1 PUSH DX JMP CHAL31: POP DX;优先级出栈 POP BX;符号出栈 MOV S2DI,BL;符号写入S2 INC DI JMP L3;返回L3继续判断L4:;对乘法的处理 MOV BP,SP MOV DX,BP CMP DL,02H;如果栈顶符号优先级大于等于2 JGE L41 PUSH AX;否则入栈 MOV DX,0302H;优先级置2 PUSH DX JMP CHAL41: POP DX;优先级出栈 POP BX;符号出栈 MOV S2DI,BL;符号写入S2 INC DI JMP L4;返回L4继续判断 L6:;对右括号的处理 MOV BL,0 MOV signal,BL;恢复标志位 MOV BP,SP CMP BYTE PTR BP,0;如果栈顶符号优先级不等于0 JNE L61 POP DX;左括号优先级出栈 POP AX;左括号出栈 JMP CHAL61: POP DX;优先级出栈 POP BX;符号出栈 MOV S2DI,BL;符号写入S2 INC DI JMP L6;返回L6继续判断 L7:;对数字的处理 CMP AL,009H;是数字则处理 JLE L71L71: MOV S2DI,AL INC DI CMP BYTE PTR S1SI,09H JLE L72;如果下一个字符是数字 MOV AL, ;否则插入空格 MOV S2DI,AL;保存 INC DI JMP CHA L72:CMP BYTE PTR S1SI,0 JGE L73 ;如果下一个字符是数字L73: MOV AL,S1SI;取下一个数字 INC SI JMP L71 jn00: jmp jn01;转跳中转 L8:;对等号的处理 MOV BP,SP CMP BYTE PTR BP,0;如果栈顶符号优先级大于0 JG L81 POP AX JMP L9L81: POP DX;优先级出栈 POP BX;符号出栈 MOV S2DI,BL;符号写入S2 INC DI JMP L8;返回L8继续判断 L9: MOV S2DI,0EH;存入等号 RETCHANGE ENDPCALCULATE PROC NEAR ;计算后缀表达式子程序 MOV SI,0 MOV DI,0 MOV AH,0 MOV BX, PUSH BX;栈底写入CAL: MOV AL,S2DI INC DI CMP AL,0EH;= JE jn00 CMP AL, JE CAL CMP AL,0AH;+ JE F1 CMP AL,0DH;- JE F2 CMP AL,0BH;* JE F3 CMP AL,09H;数字转跳 JLE F5 JMP ERRORF5: CMP AL,0 JGE F51F51: MOV DL,AL MOV BL,10 MOV AL,0F52:IMUL BL ADD AL,DL CMP BYTE PTR S2DI, JNE F53 PUSH AX;如果是空格则返回取符号计算 JMP CALF53:MOV DL,S2DI INC DI ;AND DL,0FH JMP F52 F3: POP DX;计算乘法 POP AX IMUL DL PUSH AX JMP CALF2: POP DX;计算减法 POP AX SUB AX,DX PUSH AX JMP CALF1: POP AX;计算加法 POP DX ADD AX,DX PUSH AX JMP CAL RETCALCULATE ENDPOUTPUT PROC NEAR;输出运算结果子程序 MOV SI,0 MOV AX,STORAGE CMP AX,0 JGE C1 ;NEG AX ;MOV NSI,- ;INC SIC1: CMP AX,10000 JGE C11 CMP AX,1000 JGE C12 CMP AX,100 JGE C2 CMP AX,10 JGE C3 CMP AX,0 JGE C4C11: MOV DX,0 MOV BX,10000 IDIV BX ;ADD AL,30H MOV DS:NSI,AL;商存入N INC SI MOV AX,DX;余数继续运算 JMP C12C12:MOV DX,0 MOV BX,1000 IDIV BX ; ADD AL,30H MOV DS:NSI,AL;商存入N INC SI MOV AX,DX;余数继续运算 JMP C2C2: MOV CL,100 IDIV CL ; ADD AL,30H MOV DS:NSI,AL;商存入N INC SI MOV AL,AH;余数继续运算 MOV AH,0 JMP C3C3: MOV CL,10 IDIV CL ; ADD AL,30H MOV DS:NSI,AL;商存入N INC SI MOV AL,AH;余数继续运算 MOV AH,0 JMP C4C4: ;ADD AL,30H MOV NSI,AL;商存入N INC SI JMP C0C0: MOV SI,0 MOV DI,0 MOV SI,offset N MOV di,offset buffer mov cx,8 CLD rep movsb;N填入buffer push ax push bx push si push cx mov cx,8 mov si ,0 mov bx,0tt1: mov al,buffersi cmp al ,10H jz tt push ax inc bx tt: inc si loop tt1 mov si,0 tt2: pop ax mov buffersi,al inc si dec bx jnz tt2 pop cx pop si pop bx pop ax call DIR;显示结果 RETOUTPUT ENDPDIR PROC NEAR PUSH AX PUSH BX PUSH DX push SI;保护SI LEA SI,buffer;取buffer地址 MOV AH,0FEH;ah AL OUT DX,AL;段数据-8255 PA口 INC DX;扫描模式-8255 PB口 MOV AL,AH;段选 OUT DX,AL CALL DL1;延迟1ms MOV DX,PB_8255 MOV AL,0FFH;数码管全熄 OUT DX,AL TEST AH,80H;1000000 JZ LD1 ROL AH,01H;循环左移返回显示 JMP LD0 LD1: pop SI POP DX POP BX POP AX RETDIR ENDPDL1 PROC NEAR;延迟子程序 PUSH CX MOV CX,500 LOOP

温馨提示

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

评论

0/150

提交评论