微机原理实验 简易计算器

微机原理实验 简易计算器
微机原理实验 简易计算器

【实验题目】

简易计算器设计

【实验目的】

综合测试学生微机接口技术及应用能力,包括系统构思设计、电路设计搭建、软件调试等;

结合应用实际,培养学生运用微机技术服务应用、服务实际的能力。

【基本要求】

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关显示

MOV TAG,0

MOV NEGTI,0

CALL SHOW

JMP NEXT2

SJIAF:

CALL JIA

JMP YEAH

SJIANF:

CALL JIAN

JMP YEAH SCHENGF:

CALL CHENG

JMP YEAH

SCHUF:

CALL CHU

JMP YEAH

MOV AH,4CH

INT 21H

JIA PROC NEAR

PUSH AX

PUSH CX

PUSH SI

MOV AX,NUM1

ADD AX,NUM2

JC YC1 ;溢出MOV RESULT,AX

CALL TO_SHOWSHU JMP OVER1

YC1:

LEA SI,BUFF

MOV BYTE PTR[SI],14 INC SI

MOV CX,5

SS0:

MOV BYTE PTR[SI],16 INC SI

LOOP SS0

OVER1:

POP SI

POP CX

POP AX

RET

JIA ENDP

JIAN PROC NEAR PUSH AX

PUSH CX

PUSH SI

MOV AX,NUM1

CMP AX,NUM2

JA POSITIVE

MOV NEGTI,1 ;结果为负数MOV AX,NUM2

SUB AX,NUM1

JC YC2

JMP OV

POSITIVE:

MOV AX,NUM1

SUB AX,NUM2

JC YC2

OV:

MOV RESULT,AX

CALL TO_SHOWSHU

JMP OVER2

YC2:

LEA SI,BUFF

MOV BYTE PTR[SI],14

INC SI

MOV CX,5

SS2:

MOV BYTE PTR[SI],16

INC SI

LOOP SS2

OVER2:

POP SI

POP CX

POP AX

RET

JIAN ENDP

CHENG PROC NEAR

PUSH AX

PUSH CX

PUSH SI

MOV AX,NUM1

MUL NUM2

JC YC3

MOV RESULT,AX

CALL TO_SHOWSHU

JMP OVER3

YC3:

LEA SI,BUFF

MOV BYTE PTR[SI],14

INC SI

MOV CX,5

SS3:

MOV BYTE PTR[SI],16 INC SI

LOOP SS3

OVER3:

POP SI

POP CX

POP AX

RET

CHENG ENDP

CHU PROC NEAR PUSH AX

PUSH CX

PUSH DX

PUSH SI

XOR DX,DX

MOV AX,NUM1

DIV NUM2

PUSH DX

MOV RESULT,AX CALL TO_SHOWSHU MOV POINT,1

LEA SI,BUFF

ADD SI,5

MOV CX,5

PEA:

MOV AL,[SI-1]

MOV [SI],AL

DEC SI

LOOP PEA

POP DX

MOV AX,10

MUL DX

XOR DX,DX

DIV NUM2

MOV [SI],AL

POP SI

POP DX

POP CX

POP AX

RET

CHU ENDP

CHULI PROC NEAR PUSH SI PUSH CX

LEA SI,BUFF

ADD SI,5

XX:

CMP BYTE PTR[SI],0 JNZ NOZERO

MOV BYTE PTR[SI],16 DEC SI

JMP XX NOZERO:

CMP NEGTI,1

JNZ ZHENG

INC SI

MOV BYTE PTR[SI],17 ZHENG:

POP CX

POP SI

CHULI ENDP

TO_DEC PROC NEAR PUSH SI

PUSH AX

PUSH BX

PUSH CX

LEA SI,BUFF

MOV AL,COUNT XOR AH,AH

ADD SI,AX

DEC SI

XOR AX,AX

XOR CH,CH

MOV CL,COUNT AGAIN:

ADD AX,AX

MOV BX,AX

ADD AX,AX

ADD AX,AX

ADD AX,BX

MOV BH,0

MOV BL,[SI]

ADD AX,BX

DEC SI

LOOP AGAIN

MOV NUM,AX

POP CX

POP BX

POP AX

POP SI

RET

TO_DEC ENDP

TO_SHOWSHU PROC NEAR

PUSH SI

PUSH DI

PUSH AX

PUSH BX

PUSH CX

LEA DI,BUFF

ADD DI,5

LEA SI,UNIT10

MOV AX,RESULT

MOV BYTE PTR[DI],0

DEC DI

LOP0:

XOR CL,CL

MOV BX,[SI]

LOP1:

SUB AX,BX

JB LOP3

INC CL

JMP LOP1

LOP3:

ADD AX,BX

MOV [DI],CL

INC SI

INC SI

DEC DI

CMP BX,1

JNZ LOP0

POP CX

POP BX

POP AX

POP DI

POP SI

RET

TO_SHOWSHU ENDP

SHOW PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH SI

PUSH DI

CMP POINT,1 ;是否需添加小数点JNZ NOPOINT

MOV CH,0FFH

AA3:

LEA SI,BUFF

LEA DI,POSITION

MOV AL,[SI]

LEA BX,LED_7

XLAT

MOV DX,3004H

OUT DX,AL

MOV DX,3000H

MOV AL,[DI]

OUT DX,AL

CALL DELAY ;延时,使一位稳定显示INC SI

INC DI

MOV AL,[SI]

LEA BX,LED_7

XLAT

OR AL,80H ;填小数点

MOV DX,3004H

OUT DX,AL

MOV DX,3000H

MOV AL,[DI]

OUT DX,AL

CALL DELAY ;延时,使一位稳定显示INC SI

INC DI

MOV CL,4

AA2:

MOV AL,[SI]

LEA BX,LED_7

XLAT

MOV DX,3004H

OUT DX,AL

MOV DX,3000H

MOV AL,[DI]

OUT DX,AL

CALL DELAY ;延时,使一位稳定显示INC SI

INC DI

DEC CH

JZ REALSTOP

DEC CL

JNZ AA2

JMP AA3

NOPOINT:

MOV CH,0FFH

AA1:

LEA SI,BUFF

LEA DI,POSITION

MOV CL,6

AA:

MOV AL,[SI]

LEA BX,LED_7

XLAT

MOV DX,3004H

OUT DX,AL

MOV DX,3000H

MOV AL,[DI]

OUT DX,AL

CALL DELAY ;延时,使一位稳定显示INC SI

INC DI

DEC CH

JZ REALSTOP

DEC CL

JNZ AA

JMP AA1

REALSTOP:

POP DI

POP SI

POP DX

POP CX

POP BX

POP AX

RET

SHOW ENDP

DELAY PROC NEAR

PUSH BX

PUSH CX

MOV BX,3FFH

DEL1:

MOV CX,0FFFH

DEL2:

LOOP DEL2

DEC BX

JNZ DEL1

POP CX

POP BX

RET

DELAY ENDP DELAY2 PROC NEAR

PUSH BX

PUSH CX

MOV BX,3FH

DEL3:

MOV CX,0FFH

DEL4:

LOOP DEL4

DEC BX

JNZ DEL3

POP CX

POP BX

RET

DELAY2 ENDP

SCAN PROC NEAR

PUSH AX

PUSH DX

KS:

MOV DX,3000H

MOV AL,0

OUT DX,AL

MOV DX,3008H

IN AL,DX

AND AL,0FH ;屏蔽高四位CMP AL,0FH

JZ JIESHU

MOV FLAG,1

JIESHU:

POP DX

POP AX

RET

SCAN ENDP

COPY PROC NEAR

PUSH SI

PUSH CX

PUSH AX

MOV CX,5

LEA SI,BUFF

ADD SI,5

NEXT1:

MOV AL,[SI-1]

MOV [SI],AL

DEC SI

LOOP NEXT1

MOV AL,NEWNUM MOV [SI],AL

POP AX

POP CX

POP SI RET COPY ENDP

CSEG ENDS END START

相关主题
相关文档
最新文档