基于8086及Proteus仿真的44键盘计算器的设计.docx
- 文档编号:24488842
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:18
- 大小:20.10KB
基于8086及Proteus仿真的44键盘计算器的设计.docx
《基于8086及Proteus仿真的44键盘计算器的设计.docx》由会员分享,可在线阅读,更多相关《基于8086及Proteus仿真的44键盘计算器的设计.docx(18页珍藏版)》请在冰豆网上搜索。
基于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
QIAN:
MOVAH,11100000B;从第4位开场显示
MOVAL,AH
OUT44H,AL
MOVBL,X[0]
MOVAL,[SI+BX]
OUT42H,AL
CALLDELY
MOVAL,0
OUT42H,AL
BAI:
MOVAH,11010000B;从第3位开场显示
MOVAL,AH
OUT44H,AL
MOVBL,X[1]
MOVAL,[SI+BX]
OUT42H,AL
CALLDELY
MOVAL,0
OUT42H,AL
SHI:
MOVAH,10110000B;从第2位开场显示
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硬件仿真构造图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 8086 Proteus 仿真 44 键盘 计算器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)