微机原理实验 简易计算器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【实验题目】
简易计算器设计
【实验目的】
综合测试学生微机接口技术及应用能力,包括系统构思设计、电路设计搭建、软件调试等;
结合应用实际,培养学生运用微机技术服务应用、服务实际的能力。
【基本要求】
1)利用实验箱上的4x4键盘及6位数码管,实现两个16位宽的非负整数(0~65535)进行+、-、×运算,计算结果限制在范围-65535~65535,超过范围在数码管最低位显示E;
2) 16个按键的分配可以自行指定;
【扩展要求】
1)按基本要求保持输入的范围不变(16位宽),扩展计算结果的范围到用足6位数码管,当计算结果超过-65535~999999时,显示E;
2)增加÷的功能,有小数显示;
【实验程序】
;该程序实现了基本要求及扩展要求的2)
DSEG SEGMENT
BUFF DB 6 DUP(?)
LED_7 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH, 39H,5EH,79H,71H,00H,40H
POSITION DB 0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
UNIT10 DW 10000,1000,100,10,1
NEWNUM DB 0
COUNT DB 0
FLAG DB 0 ;是否有键按下的标志
NEGTI DB 0 ;是否为负数的标志
NUM DW 0
NUM1 DW 0
NUM2 DW 0
TAG DB 0 ;运算种类标志
POINT DB 0 ;除法结果添加小数点标志
RESULT DW 0
DSEG ENDS
CSEG SEGMENT
ASSUME DS:DSEG,CS:CSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV DX,300CH ;8255初始化
MOV AL,81H
OUT DX,AL
LEA SI,BUFF MOV CX,6
NEXT:
MOV BYTE PTR[SI],16
INC SI
LOOP NEXT
CALL SHOW ;将显示缓冲区中内容在LED上一次显示出来
MOV COUNT,0 ;记按下了几位数
NEXT2:
CALL SHOW
CALL SCAN ;判断是否有按键按下
CMP FLAG,1
JZ OK
JMP NEXT2
OK:
MOV FLAG,0
MOV POINT,0
MOV DX,3000H ;判断是哪一个键被按下
MOV AL,0FFH
OUT DX,AL
MOV CH,-1 ;CH用于保存当前被扫描的列号MOV CL,07FH
XL:
ROL CL,1
INC CH
MOV DX,3000H
MOV AL,CL
1/ 7
OUT DX,AL
MOV DX,3008H
IN AL,DX
AND AL,0FH
CMP AL,0FH
JZ XL ;选中下一列被扫描
CMP AL,0EH
JNZ FOUR
MOV CL,0 ;CL保存行号
JMP FREE
FOUR:
CMP AL,0DH
JNZ BA
MOV CL,4
JMP FREE
BA:
CMP AL,0BH
JNZ SHIER
MOV CL,8
JMP FREE
SHIER:
CMP AL,07H
JNZ XL
MOV CL,12
FREE:
ADD CH,CL ;行列值相加为按键代表的值
CMP CH,9
JBE SHUZI
CMP CH,12 ;加法
JZ JIAFA
CMP CH,13 ;减法
JZ JIANFA
CMP CH,14 ;乘法
JZ CHENGFA
CMP CH,15 ;除法
JZ CHUFA
CMP CH,11 ;等号时进行运算
JZ YUNSUAN
CMP CH,10 ;此键清屏重新输入
JZ CLEAR
SHUZI:
INC COUNT
MOV NEWNUM,CH
CALL COPY ;将新输入的按键值送入显示缓冲区的最末位
MOV DX,3000H ;将LED关显示MOV AL,0FFH
OUT DX,AL
CALL DELAY2
JMP NEXT2
JIAFA:
MOV TAG,1 ;置加法标志
CALL TO_DEC ;将输入的数转化为十进制数保存MOV AX,NUM
MOV NUM1,AX
JMP START ;继续输入第二个按键数JIANFA:
MOV TAG,2
CALL TO_DEC
MOV AX,NUM
MOV NUM1,AX
JMP START
CHENGFA:
MOV TAG,3
CALL TO_DEC
MOV AX,NUM
MOV NUM1,AX
JMP START
CHUFA:
MOV TAG,4
CALL TO_DEC
MOV AX,NUM
MOV NUM1,AX
JMP START
CLEAR:
JMP START
YUNSUAN:
CALL TO_DEC ;将第二次输入的数转化为十进制数保存
MOV AX,NUM
MOV NUM2,AX
CMP TAG,1
JZ SJIAF
CMP TAG,2
JZ SJIANF
CMP TAG,3
JZ SCHENGF
CMP TAG,4
JZ SCHUF
YEAH:
CALL CHULI ;将结果中零的位置16关显示