基于8086与Proteus仿真的44键盘计算器的设计.docx

上传人:b****6 文档编号:5089319 上传时间:2022-12-13 格式:DOCX 页数:14 大小:19.86KB
下载 相关 举报
基于8086与Proteus仿真的44键盘计算器的设计.docx_第1页
第1页 / 共14页
基于8086与Proteus仿真的44键盘计算器的设计.docx_第2页
第2页 / 共14页
基于8086与Proteus仿真的44键盘计算器的设计.docx_第3页
第3页 / 共14页
基于8086与Proteus仿真的44键盘计算器的设计.docx_第4页
第4页 / 共14页
基于8086与Proteus仿真的44键盘计算器的设计.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

基于8086与Proteus仿真的44键盘计算器的设计.docx

《基于8086与Proteus仿真的44键盘计算器的设计.docx》由会员分享,可在线阅读,更多相关《基于8086与Proteus仿真的44键盘计算器的设计.docx(14页珍藏版)》请在冰豆网上搜索。

基于8086与Proteus仿真的44键盘计算器的设计.docx

基于8086与Proteus仿真的44键盘计算器的设计

基于8086与Proteus仿真的4*4键盘计算器的设计

一、设计目的

本次课程设计的实验目的是通过该实验掌握较复杂程序的设计。

能够独立完成用程序对8086、8255控制键盘和LED显示的控制,完成计算器加减法的应用。

独立编写程序,明白和掌握程序的原理和实现方式。

为以后的设计提供经验。

学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。

通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。

二、设计内容

设计计算器,要求至少能完成多位数的加减乘除运算。

独立完成用程序对8086、8255控制键盘和LED显示的控制,完成计算器加减乘除的应用。

三、设计原理与硬件电路

设计的思路是:

首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,利用汇编的程序核对输入键的数值,通过调用子程序完成数据的储存或者是加减的运算。

运算完成后将运算的结果储存并显示到LED显示器上。

各部分硬件功能:

可编程并行通信接口芯片8255A8255A内部结构:

1.并行输入/输出端口A,B,C

8255A内部包括三个8位的输入输出端口,分别是端口A、端口B、端口C,相应信号线是PA7~PA0、PB7~PB0、PC7~PC0。

端口都是8位,都可以作为输入或输出。

通常将端口A和端口B定义为输入/输出的数据端口,而端口C则既可以作数据端口,又可以作为端口A和端口B的状态和控制信息的传送端口。

2.A组和B组控制部件

端口A和端口C的高4位(PC7~PC4)构成A组;由A组控制部件实现控制功能。

端口B和端口C的低4位(PC3~PC0)构成B组;由B组控制部件实现控制功能。

A组和B组利用各自的控制单元来接收读写控制部件的命令和CPU通过数据总线(D0~D7)送来的控制字,并根据他们来定义各个端口的操作方式。

3.数据总线缓冲存储器

三态双向8位缓冲器,是8255A与8086CPU之间的数据接口。

与I/O操作有关的数据、控制字和状态信息都是通过该缓冲器进行传送。

4.读/写控制部件

8255A完成读/写控制功能的部件。

能接收CPU的控制命令,并根据控制命令向各个功能部件发出操作指令。

CS片选信号:

由CPU输入,有效时表示该8255A被选中。

RD,WR读、写控制信号:

由CPU输入。

RD有效表示CPU读8255A,WR有效表示CPU写8255A。

RESET复位信号:

由CPU输入。

RESET信号有效,清除8255A中所有控制字寄存器内容,并将各个端口置成输入方式。

定义工作方式控制字:

工作方式0:

8255A中各端口的基本输入/输出方式。

5.键盘输入模块

键盘是常用信息输入元件,其实键盘也是由一个个按钮组成,如果是独立按钮的话必须要需要一个I/O口对它进行检测,而键盘往往这需要键盘按钮数一半的I/O口数对它进行检测,也许对一个比较简单的系统I/O口数一般不是问题,但对于一个大型、复杂的系统来说I/O资源就显得非常珍贵了,尽量减少I/O使用是非常利于降低成本,另外一方面键盘比用独立按键要美观,这也是键盘能够长期得到人们青睐的原因,可是硬件上的节省必然导致软件上编程的复杂,那就来看看键盘到底使软件编程有多复杂?

下图是一个4*4键盘的结构图,它是四条I/O线作为行线,四条I/O线作为列线组成的键盘。

在键盘的行线和列线的每一个交点上,设置一个按键,这样键盘中按键的个数是4*4个。

这种行列式键盘结构能够有效地提高单盘及系统中I/O口的利用率。

于是将键盘接8255A的PC口,至于为什么选择PC是有原因的,进行键盘扫描一般要求有一部分的I/O口的工作方式是输入,另一部分I/O是输出,具体到4*4键盘则要求4个I/O口输入,另外4个输出,这一点PC口刚好符合,而PA、PB口要么全部输入或输出,所以只能是PC口接键盘。

4*4键盘结构图

五、设计流程图

六、实验程序

DATASEGMENT

XDB?

?

?

?

;存放数据的每一位

X1DW?

;存放第一个数据值

X2DW?

;存放第二个数据值

YDW?

;存放运算结果

SDB?

;存放运算符号值

EDB?

;按下等号键标记

CCDB?

;存放运算数据位数

HDB0;存放按键行号

LDB0;存放按键列号

DISCODEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;段码表

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVAL,90H;设置为A口输入,B口输出,C口输出

OUT46H,AL

MOVDI,OFFSETX+3;DI指向X的高位KKK:

CALLKEY;扫描按键

JMPKKK

;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号

KEYPROCCHECK:

CALLDISP;等待按键按下的同时进行显示

MOVAL,0F0H;所有行输出低电平

OUT44H,AL

INAL,40H

CMPAL,0FFH;读列值

JZCHECK;若都为高电平则无键按下,等待

MOVCX,50

LOOP$;延时消抖

INAL,DX;重读列值

CMPAL,0FFH

JZCHECK;无键按下一直等待

MOVH,0;有键按下,先把行列号变量清0

MOVL,0

MOVBL,01H

MOVBH,0FEH;扫描法读键值:

从第一行开始测试,即PC0输出低电平

NEXT:

MOVAL,BH

OUT44H,AL

NEXTH:

INAL,40H;读列值,判断是第几列有键按下

TESTAL,BL;从第一列开始判断

JZWAIT0

ROLBL,1

CMPBL,10H;当前行状态下没有任何列有键按下,则转为对下一行的测试

JZNEXTL

INCH;每判断一列,列号加1

JMPNEXTH;再对下一列进行判断NEXTL:

MOVH,0

MOVBL,01H

ROLBH,1;对下一行测试,让下一个PC口输出低电平

CMPBH,0EFH

JZEXIT

INCL

JMPNEXT

WAIT0:

INAL,40H;若有键按下,则等该按键松开后再计算键值

CMPAL,0FFH

JNZWAIT0

MOVCX,50

LOOP$;延时消抖

INAL,40H

CMPAL,0FFH

JNZWAIT0

CALLKEYVALUE;调计算键值子程序

EXIT:

RET

KEYENDP

;以下为计算键值子程序,通过行列号计算键值(键值=列号*4+行号)

;键值存放在DL寄存器中

KEYVALUEPROC

MOVDL,L

MOVDH,H

SHLDL,1

SHLDL,1;列号乘4

ADDDL,DH

CMPDL,9;按下的是数字键

JNGNUM_CALL

CMPDL,14

JLCONT_CALL;按下的是运算键

CMPDL,14

JZOUTP_CALL;按下的是等于键

CMPDL,15

JZCLR_CALL;按下的是清除键

NUM_CALL:

CALLNUMBER;调数字键处理子程序

JMPEXIT1

CONT_CALL:

MOVS,DL;存放运算键的键值

MOVE,0

CALLCOUNT;调运算键处理子程序,计算第一个加数

JMPEXIT1

OUTP_CALL:

CALLOUTP;调等号键处理子程序

JMPEXIT1

CLR_CALL:

CALLCLEAR;调清除键处理子程序

EXIT1:

RET

KEYVALUEENDP

;以下为清除键处理子程序,按下清除键后,X变量全部清0

CLEARPROC

MOVX[3],0

MOVX[2],0

MOVX[1],0

MOVX[0],0

CALLBITP

RET

CLEARENDP

;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量

;并根据运算符号,调用相应的运算子程序

OUTPPROC

PUSHAX

PUSHDX

PUSHBX

INCE

CALLCOUNT;调运算键处理子程序,计算第二个运算数据

CMPS,10

JZADD_CALL;运算符为加号,则调用加法子程序

CMPS,11

JZSUB_CALL;运算符为减号,则调用减法子程序

CMPS,12

JZMUL_CALL;运算符为乘号,则调用乘法子程序

CMPS,13

CALLDIVP;运算符为除号,则调用除法子程序

JMPSTORE1

ADD_CALL:

CALLADDP

JMPSTORE1

SUB_CALL:

CALLSUBP

JMPSTORE1

MUL_CALL:

CALLMULP

STORE1:

MOVAX,Y;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量

MOVDX,0

MOVBX,1000

DIVBX

MOVX[0],AL

MOVAX,DX

MOVBL,100

DIVBL

MOVX[1],AL

MOVAL,AH

MOVAH,0

MOVBL,10

DIVBL

MOVX[2],AL

MOVX[3],AH

POPBX

POPDX

POPAX

RET

OUTPENDP

;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量

;或者将第二个运算数据的数值计算出来并存入X2变量

;将运算符的值存入S变量

COUNTPROC

PUSHAX

PUSHBX

PUSHDX

MOVDX,0

CALLBITP;测试X中的数据是多少位

CMPCC,4;输入的数据是4位数?

JZC4

CMPCC,3;输入的数据是3位数?

JZC3

CMPCC,2;输入的数据是2位数?

JZC2

JMPC1;输入的数据是1位数?

C4:

MOVAX,0

MOVAL,X[0]

MOVBX,1000

MULBX

MOVDX,AX

C3:

MOVAL,X[1]

MOVBL,100

MULBL

ADDDX,AX

C2:

MOVAL,X[2]

MOVBL,10

MULBL

ADDDX,AX

C1:

MOVAL,X[3]

MOVAH,0

ADDDX,AX

CMPE,1

JNZX1_S

MOVX2,DX;按下的是等号,则将第二个运算数据的值存入X2变量

JMPEXIT3

X1_S:

MOVX1,DX;按下的是运算符号,则将第一个运算数据的值存X1变量

MOVX[3],0;清空X变量

MOVX[2],0

MOVX[1],0

MOVX[0],0

EXIT3:

POPDX

POPBX

POPAX

RET

COUNTENDP

;以下为数字键处理子程序

;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数

NUMBERPROC

CMPE,1

JNZCONTINUE

MOVE,0

CALLCLEAR

CONTINUE:

CMPCC,0;目前数据为0位,即没有数据,则转到SSS

JZSSS

;若已有数据,以下程序将X左移8位。

;例如:

先输入“1”,当再输入2时,

;先要将“1”从个位移到十位,然后再将“2”存放到个位

PUSHAX

PUSHDX

MOVAL,X[3]

MOVAH,X[2]

MOVDL,X[1]

MOVDH,X[0]

MOVCX,8

LL:

SHLAX,1

RCLDX,1

LOOPLL

MOVX[3],AL

MOVX[2],AH

MOVX[1],DL

MOVX[0],DH

POPDX

POPAX

SSS:

MOV[DI],DL;将当前键入的数据存放到X的最低位

INCCC;数据位数加1

CMPCC,4;判断数据位数

JNGEXIT2

MOVCC,0;如果数据超过4位,重新从最低位开始存放

MOVX[2],0

MOVX[1],0

MOVX[0],0

EXIT2:

CALLDISP;调显示子程序,显示输入的数据

RET

NUMBERENDP

;加法子程序

ADDPPROC

PUSHAX

MOVAX,X1

ADDAX,X2

MOVY,AX

POPAX

RET

ADDPENDP

;减法子程序

SUBPPROC

PUSHAX

MOVAX,X1

SUBAX,X2

MOVY,AX

POPAX

RET

SUBPENDP

;乘法子程序

MULPPROC

PUSHAX

PUSHDX

MOVAX,X1

MOVDX,X2

MULDX

MOVY,AX

POPDX

POPAX

RET

MULPENDP

;除法子程序

DIVPPROC

PUSHAX

PUSHBX

PUSHDX

MOVDX,0

MOVAX,X1

MOVBX,X2

DIVBX

MOVY,AX

POPDX

POPBX

POPAX

RET

DIVPENDP

;显示子程序,将X中的数值按位显示出来

DISPPROC

PUSHBX

PUSHAX

MOVBH,0

LEASI,DISCODE

CALLBITP;测试X位数

CMPCC,4

JZQIAN

CMPCC,3

JZBAI

CMPCC,2

JZSHI

CMPCC,1

JMPG

JMPNONE

MOVAL,AH

OUT44H,AL

MOVBL,X[0]

MOVAL,[SI+BX]

OUT42H,AL

CALLDELY

MOVAL,0

OUT42H,AL

MOVAL,AH

OUT44H,AL

MOVBL,X[1]

MOVAL,[SI+BX]

OUT42H,AL

CALLDELY

MOVAL,0

OUT42H,AL

MOVAL,AH

OUT44H,AL

MOVBL,X[2]

MOVAL,[SI+BX]

OUT42H,AL

CALLDELY

MOVAL,0

OUT42H,AL

G:

MOVAH,01110000B;从第1位开始显示

MOVAL,AH

OUT44H,AL

MOVBL,X[3]

MOVAL,[SI+BX]

OUT42H,AL

CALLDELY

JMPEXIT4

NONE:

MOVAL,0;X中没有数据,不显示

OUT42H,AL

EXIT4:

POPAX

POPBX

RET

DISPENDP

;分析数据位数子程序

BITPPROC

CMPX[0],0;如果X[0]不为0,则数据为4位数

JNZFOURBIT

CMPX[1],0;如果X[1]不为0,则数据为3位数

JNZTHREEBIT

CMPX[2],0;如果X[2]不为0,则数据为2位数

JNZTOWBIT

CMPX[3],0;如果X[3]不为0,则数据为1位数

JNZONEBIT

JMPZER0BIT;否则,没有数据

FOURBIT:

MOVCC,4

JMPEXIT5

THREEBIT:

MOVCC,3

JMPEXIT5

TOWBIT:

MOVCC,2

JMPEXIT5

ONEBIT:

MOVCC,1

JMPEXIT5

ZER0BIT:

MOVCC,0

EXIT5:

RET

BITPENDP

;延时子程序

DELYPROC

PUSHCX

MOVCX,100

LOOP$

POPCX

RET

DELYENDP

CODEENDS

ENDSTART

七、课程设计心得与体会

通过本次综合设计,我们组分工负责不同的部分,实现不同的功能,并且将最近所学的内容复习了一遍,对课程内容的理解也有所加深。

本次实验的代码大部分来源于网络,但是我们对其中部分代码进行了修改,使其得到了优化。

并且认真把代码分析了一遍理解了每一步的设计思路和方法。

总的来说我们完成了本次综合设计全部内容。

希望以后可以有更多的机会,有更大的平台,提供给我起使我在短短的有限的大学生活中学习更多更有用的知识,收获更多实践性的技巧,可以为将来的工作打下良好的基础,可以为自己以后的未来铺下更好的台阶

八、Protuse硬件仿真结构图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 书信模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1