简单计算器8086汇编代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【课题5】模拟十进制计算器(加,减)
(一)设计要求
1.通过小键盘输入,做十进制的加、减运算,允许五位数以内的不同数位的2个数相加
或相减,连加与/或连减。

七段数码管显示器的高位作为符号位,其他5位作为输入数据和计算结果的显示。

2.数字用小键盘0~9;功能键为:A,B,C,D。

C———开始运算(包括取消没有完成的运算),六位七段数码管全部显示‘0’。

A———‘+’,加法操作。

B———‘-’,减法操作。

D———‘=’,计算并显示结果。

3.运算规则(按照一般计算器的功能要求):
a.输入第一个数据,显示器跟随显示。

b.按‘+’或‘-’,显示器内容不变。

c.再输入第二个数据,显示器跟随显示。

d.按‘=’,显示器显示计算结果,当超出能显示的最大值时,显示“F”(溢出)。

e.按‘C’,清除显示,重新开始运算。

(二)提示
1.七段数码管显示和键盘可参考软件实验9、10,LED显示实验,以及可参阅教材第9
章有关章节。

2.显示是动态的、要不断刷新,建议把键盘输入与运算作为主程序,动态显示作为子程
序,在主程序中调用显示子程序。

(三)要完成的工作
1.设计出完整的汇编语言程序。

2.上机调试,在实验系统中通过验收。

3.写出课程设计报告,内容包括:设计思想、功能流程图、结果讨论和完整的源程序。

;(1)通过小键盘做十进制的加、减运算,允许不同数位的5个数相加或相减。

七段数码管显示器作输入数据和结果数据的显示。

;(2)数字用小键盘0~9,A、B、C、D作功能键。

;C———开始运算(包括撤销运算),显示‘0’。

;A———‘+’。

;B———‘-’。

;D———‘=’。

;E———退出,返回DOS。

;(3)运算顺序:
;①输入一原始数据,显示器跟随显示。

;②按‘ +’或‘ -’,显示器内容不变。

;③再输入一数据,显示器跟随显示。

;④按‘ =’,显示器显示结果数据,当超出能显示的最大值时,显示“FFFFF”(溢出)。

;⑤按‘C’,重新开始运算。

;⑥按‘E’,结束退出。

;******************************************
; 8086系列微机接口实验系统软件实验项目
; 键盘扫描显示实验
;******************************************
INIT MACRO NAME
mov NAME+0,0ffh
mov NAME+1,0c0h
mov NAME+2,0ffh
mov NAME+3,0ffh
mov NAME+4,0ffh
mov NAME+5,0ffh
ENDM
code segment
assume cs:code
OUTSEG equ 0ffdch ;段控制口
OUTBIT equ 0ffddh ;位控制口/键扫口
IN_KEY equ 0ffdeh ;键盘读入口
LedBuf db 10 dup(?) ;显示缓冲
Store db 10 dup(?) ;存放显示第一组数据
num db 10 dup(?)
Store1 db 10 dup(?) ;用于存放第一组数据
num1 db 10 dup(?) ;用于存放第二组数据
flag db 0 ; 作为标记位,若为1代表加为0代表减temp db 0
jinwei db 0
jiewei db 0
in_flag db 0
Key_Buff db 30 dup(?) ;用于键盘输入的存储
org 1000h
Start:
INIT Store
INIT num
INIT LedBuf
mov si,-1 ;设置数组的下标
mov Store1+0,0
mov Store1+1,0
mov Store1+2,0
mov Store1+3,0
mov Store1+4,0
mov num1+0,0
mov num1+1,0
mov num1+2,0
mov num1+3,0
mov num1+4,0
MLoop:
call Disp ;显示
call GetKey ;扫描键盘并读取键值
cmp al,20h
je LL
jmp LL1
LL: mov temp,0
jmp MLoop
LL1: push dx
mov dl,temp
mov temp,1
cmp al,09h
ja transmit
cmp Key_Buff[si],al
jz inkey_flag
jmp LL2
inkey_flag:
cmp temp,dl
pop dx
jz MLoop
jmp LL2 ;!!注意要加这一句
transmit:jmp SPECIAL ;特殊字符特殊处理
LL2: inc si
mov Key_Buff[si],al;将键盘输入的键盘码放到Key_Buff中
cmp si,5
jae abc
push dx
mov dl,Store1+1
mov Store1+0,dl
mov dl,Store1+2
mov Store1+1,dl
mov dl,Store1+3
mov Store1+2,dl
mov dl,Store1+4
mov Store1+3,dl
mov Store1+4,al
pop dx
jmp bcd
abc: mov di,si
sub di,5
push dx
mov dl,num1+1
mov num1+0,dl
mov dl,num1+2
mov num1+1,dl
mov dl,num1+3
mov num1+2,dl
mov dl,num1+4
mov num1+3,dl
mov num1+4,al
pop dx
jmp bcd
bcd: and al,0fh ;显示键码
mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
cmp si,5
jae next1
mov Store[si+1],al
jmp back1
next1: mov di,si
sub di,5
mov num[di+1],al
jmp start1
back1: push dx ;将Store里的数据放到Led中,方便以后显示 mov dl,Store+1
mov LedBuf+1,dl
mov dl,Store+2
mov LedBuf+2,dl
mov dl,Store+3
mov LedBuf+3,dl
mov dl,Store+4
mov LedBuf+4,dl
mov dl,Store+5
mov LedBuf+5,dl
pop dx
jmp MLoop
start1:
INIT LedBuf
call Disp
;jmp MLoop back2: push dx
mov dl,num+1
mov LedBuf+1,dl mov dl,num+2
mov LedBuf+2,dl mov dl,num+3
mov LedBuf+3,dl mov dl,num+4
mov LedBuf+4,dl mov dl,num+5
mov LedBuf+5,dl pop dx
jmp MLoop
back3: push dx
mov dl,Store+0 mov LedBuf+0,dl mov dl,Store+1 mov LedBuf+1,dl mov dl,Store+2 mov LedBuf+2,dl mov dl,Store+3 mov LedBuf+3,dl mov dl,Store+4 mov LedBuf+4,dl mov dl,Store+5 mov LedBuf+5,dl pop dx
jmp MLoop SPECIAL:
cmp al,0ah
jne decre
mov flag,1
mov si,4
jmp MLoop
decre: cmp al,0bh
jne Restart mov flag,0
mov si,4
jmp MLoop
Restart: cmp al,0ch
jne Exit
mov flag,0
jmp Start
Exit: cmp al,0eh
jne Display
mov Store+0,0Ch ;显示"P"
mov Store+1,0ffh
jmp back1
Display:cmp al,0dh
je print
jmp back3
print: cmp flag,0
je subb
jmp adda
subb:
mov cl,num1+0 ;比较两数大小,如果用小数减大数则交换数据 mov bl,Store1+0
cmp bl,cl
jb jiaoh
mov cl,num1+1
mov bl,Store1+1
cmp bl,cl
jb jiaoh
mov cl,num1+2
mov bl,Store1+2
cmp bl,cl
jb jiaoh
mov cl,num1+3
mov bl,Store1+3
cmp bl,cl
jb jiaoh
mov cl,num1+4
mov bl,Store1+4
cmp bl,cl
jb jiaoh
jmp jianfa
jiaoh: push dx ;交换两个数组中的数值 mov dh,num1+0
mov dl,Store1+0
mov num1+0,dl
mov Store1+0,dh
mov dh,num1+1
mov dl,Store1+1
mov num1+1,dl
mov Store1+1,dh
mov dh,num1+2
mov dl,Store1+2
mov num1+2,dl
mov Store1+2,dh
mov dh,num1+3
mov dl,Store1+3
mov num1+3,dl
mov Store1+3,dh
mov dh,num1+4
mov dl,Store1+4
mov num1+4,dl
mov Store1+4,dh
mov Store[0],0BFh ;最高位显示“-”
pop dx
jianfa: mov cl,num1+4 ;最低位相减
mov bl,Store1+4
cmp bl,cl
jae H1
mov jiewei,1
mov bh,0ah
sub bh,cl
add bl,bh
mov cl,bl
jmp F1
H1:
sub bl,cl
mov cl,bl
jmp F1
F1:
mov al,cl
and al,0fh ;显示键码
mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[5],al
mov cl,num1+3 ;第二位相减
mov bl,Store1+3
sub bl,jiewei
cmp bl,0Fh ;考虑0被借位变成F jz N1
jmp M1
N1: mov bl,09h
jmp M1
M1: mov jiewei,0
cmp bl,cl
jae H2
mov jiewei,1
mov bh,0ah
sub bh,cl
add bl,bh
mov cl,bl
jmp F2
H2:
sub bl,cl
mov cl,bl
jmp F2
F2:
mov al,cl
and al,0fh ;显示键码
mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[4],al
mov cl,num1+2 ;第三位相减
mov bl,Store1+2
sub bl,jiewei
cmp bl,0Fh ;考虑0被借位变成F jz N2
jmp M2
N2: mov bl,09h
jmp M2
M2: mov jiewei,0
cmp bl,cl
jae H3
mov jiewei,1
mov bh,0ah
sub bh,cl
add bl,bh
mov cl,bl
jmp F3
H3:
sub bl,cl
mov cl,bl
jmp F3
F3:
mov al,cl
and al,0fh ;显示键码
mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[3],al
mov cl,num1+1 ;第四位相减
mov bl,Store1+1
sub bl,jiewei
cmp bl,0Fh ;考虑0被借位变成F jz N3
jmp M3
N3: mov bl,09h
jmp M3
M3: mov jiewei,0
cmp bl,cl
jae H4
mov jiewei,1
mov bh,0ah
sub bh,cl
add bl,bh
mov cl,bl
jmp F4
H4:
sub bl,cl
mov cl,bl
jmp F4
F4:
mov al,cl
and al,0fh ;显示键码 mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[2],al
mov cl,num1+0 ;最高位相减 mov bl,Store1+0
sub bl,jiewei
mov jiewei,0
cmp bl,cl
jae H5
mov jiewei,1
sub cl,bl
jmp F5
H5:
sub bl,cl
mov cl,bl
jmp F5
F5:
mov al,cl
and al,0fh ;显示键码 mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[1],al
jmp back3
ADDa:
mov cl,num1+4 ; 最低位执行加法 mov bl,Store1+4
add cl,bl
cmp cl,0ah
jb H
sub cl,0ah
inc jinwei
H:
mov al,cl
and al,0fh ;显示键码 mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[5],al
mov cl,num1+3 ; 第二位加法
mov bl,Store1+3
add cl,bl
add cl,jinwei
mov jinwei,0
cmp cl,0ah
jb HA
sub cl,0ah
inc jinwei
HA:
mov al,cl
and al,0fh ;显示键码 mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[4],al
mov cl,num1+2 ; 第三位执行加法 mov bl,Store1+2
add cl,bl
add cl,jinwei
mov jinwei,0
cmp cl,0ah
jb HB
sub cl,0ah
inc jinwei
HB:
mov al,cl
and al,0fh ;显示键码 mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[3],al
mov cl,num1+1 ; 执行加法
mov bl,Store1+1
add cl,bl
add cl,jinwei
mov jinwei,0
cmp cl,0ah
jb HC
sub cl,0ah
inc jinwei
HC:
mov al,cl
and al,0fh ;显示键码 mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[2],al
mov cl,num1+0 ; 最高位执行加法 mov bl,Store1+0
add cl,bl
add cl,jinwei
mov jinwei,0
cmp cl,0ah
jae continue
mov al,cl
and al,0fh ;显示键码 mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[1],al
jmp back3
continue:
mov Store[0],8Eh
mov Store[1],8Eh
mov Store[2],8Eh
mov Store[3],8Eh
mov Store[4],8Eh
mov Store[5],8Eh
jmp back3
;系统原有的函数直接调用
Disp:
mov bx,offset LEDBuf
mov cl,6 ;共6个八段管 mov ah,00100000b ;从左边开始显示DLoop:
mov dx,OUTBIT
mov al,0
out dx,al ;关所有八段管 mov al,[bx]
mov dx,OUTSEG
out dx,al
mov dx,OUTBIT
mov al,ah
out dx,al ;显示一位八段管
push ax
mov ah,1
call Delay
pop ax
shr ah,1
inc bx
dec cl
jnz DLoop
mov dx,OUTBIT
mov al,0
out dx,al ;关所有八段管 ret
Delay: ;延时子程序
push cx
mov cx,256
loop $
pop cx
ret
GetKey: ;键扫子程序
mov al,0ffh ;关显示口 mov dx,OUTSEG
out dx,al
mov bl,0
mov ah,0feh
mov cx,8
key1: mov al,ah
mov dx,OUTBIT
out dx,al
shl al,1
mov ah,al
nop
nop
nop
nop
nop
nop
mov dx,IN_KEY
in al,dx
not al
nop
nop
and al,0fh
jnz key2
inc bl
loop key1
nkey: mov al,20h
ret
key2: test al,1
je key3
mov al,0
jmp key6
key3: test al,2
je key4
mov al,8
jmp key6
key4: test al,4
je key5
mov al,10h
jmp key6
key5: test al,8
je nkey
mov al,18h
key6: add al,bl
cmp al,10h
jnc fkey
mov bx,offset KeyTable
xlat
fkey: ret
LedMap: ;八段管显示码
db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h db 080h,090h,088h,083h,0c6h,0a1h,086h,08eh
KeyTable: ;键码定义
db 07h,04h,08h,05h,09h,06h,0ah,0bh
db 01h,00h,02h,0fh,03h,0eh,0ch,0dh
code ends
end Start。

相关文档
最新文档