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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于8086与Proteus仿真的4*4键盘计算器的设计一、设计目的本次课程设计的实验目的是通过该实验掌握较复杂程序的设计。能够独立完成用程序对8086、8255控制键盘和LED显示的控制,完成计算器加减法的应用。独立编写程序,明白和掌握程序的原理和实现方式。为以后的设计提供经验。学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。二、设计内容设计计算器,要求至少能完成多位数的加减乘除运算。独立完成用程序对8086、8255控制键盘和LED显示的控制,完成计算器加减乘除的应用。三、设计原理与硬件电路设计的思路是:首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,利用汇编的程序核对输入键的数值,通过调用子程序完成数据的储存或者是加减的运算。运算完成后将运算的结果储存并显示到LED显示器上。各部分硬件功能:可编程并行通信接口芯片8255A8255A内部结构:1.并行输入/输出端口A,B,C8255A内部包括三个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键盘结构图五、设计流程图六、实验程序DATASEGMENTXDB?,?,?,?;存放数据的每一位X1DW?;存放第一个数据值X2DW?;存放第二个数据值YDW?;存放运算结果SDB?;存放运算符号值EDB?;按下等号键标记CCDB?;存放运算数据位数HDB0;存放按键行号LDB0;存放按键列号DISCODEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;段码表DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,90H;设置为A口输入,B口输出,C口输出OUT46H,ALMOVDI,OFFSETX+3;DI指向X的高位KKK:CALLKEY;扫描按键JMPKKK;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号KEYPROCCHECK:CALLDISP;等待按键按下的同时进行显示MOVAL,0F0H;所有行输出低电平OUT44H,ALINAL,40HCMPAL,0FFH;读列值JZCHECK;若都为高电平则无键按下,等待MOVCX,50LOOP$;延时消抖INAL,DX;重读列值CMPAL,0FFHJZCHECK;无键按下一直等待MOVH,0;有键按下,先把行列号变量清0MOVL,0MOVBL,01HMOVBH,0FEH;扫描法读键值:从第一行开始测试,即PC0输出低电平NEXT:MOVAL,BHOUT44H,ALNEXTH:INAL,40H;读列值,判断是第几列有键按下TESTAL,BL;从第一列开始判断JZWAIT0ROLBL,1CMPBL,10H;当前行状态下没有任何列有键按下,则转为对下一行的测试JZNEXTLINCH;每判断一列,列号加1JMPNEXTH;再对下一列进行判断NEXTL:MOVH,0MOVBL,01HROLBH,1;对下一行测试,让下一个PC口输出低电平CMPBH,0EFHJZEXITINCLJMPNEXTWAIT0:INAL,40H;若有键按下,则等该按键松开后再计算键值CMPAL,0FFHJNZWAIT0MOVCX,50LOOP$;延时消抖INAL,40HCMPAL,0FFHJNZWAIT0CALLKEYVALUE;调计算键值子程序EXIT:RETKEYENDP;以下为计算键值子程序,通过行列号计算键值(键值=列号*4+行号);键值存放在DL寄存器中KEYVALUEPROCMOVDL,LMOVDH,HSHLDL,1SHLDL,1;列号乘4ADDDL,DHCMPDL,9;按下的是数字键JNGNUM_CALLCMPDL,14JLCONT_CALL;按下的是运算键CMPDL,14JZOUTP_CALL;按下的是等于键CMPDL,15JZCLR_CALL;按下的是清除键NUM_CALL:CALLNUMBER;调数字键处理子程序JMPEXIT1CONT_CALL:MOVS,DL;存放运算键的键值MOVE,0CALLCOUNT;调运算键处理子程序,计算第一个加数JMPEXIT1OUTP_CALL:CALLOUTP;调等号键处理子程序JMPEXIT1CLR_CALL:CALLCLEAR;调清除键处理子程序EXIT1:RETKEYVALUEENDP;以下为清除键处理子程序,按下清除键后,X变量全部清0CLEARPROCMOVX[3],0MOVX[2],0MOVX[1],0MOVX[0],0CALLBITPRETCLEARENDP;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量;并根据运算符号,调用相应的运算子程序OUTPPROCPUSHAXPUSHDXPUSHBXINCECALLCOUNT;调运算键处理子程序,计算第二个运算数据CMPS,10JZADD_CALL;运算符为加号,则调用加法子程序CMPS,11JZSUB_CALL;运算符为减号,则调用减法子程序CMPS,12JZMUL_CALL;运算符为乘号,则调用乘法子程序CMPS,13CALLDIVP;运算符为除号,则调用除法子程序JMPSTORE1ADD_CALL:CALLADDPJMPSTORE1SUB_CALL:CALLSUBPJMPSTORE1MUL_CALL:CALLMULPSTORE1:MOVAX,Y;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量MOVDX,0MOVBX,1000DIVBXMOVX[0],ALMOVAX,DXMOVBL,100DIVBLMOVX[1],ALMOVAL,AHMOVAH,0MOVBL,10DIVBLMOVX[2],ALMOVX[3],AHPOPBXPOPDXPOPAXRETOUTPENDP;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量;或者将第二个运算数据的数值计算出来并存入X2变量;将运算符的值存入S变量COUNTPROCPUSHAXPUSHBXPUSHDXMOVDX,0CALLBITP;测试X中的数据是多少位CMPCC,4;输入的数据是4位数?JZC4CMPCC,3;输入的数据是3位数?JZC3CMPCC,2;输入的数据是2位数?JZC2JMPC1;输入的数据是1位数?C4:MOVAX,0MOVAL,X[0]MOVBX,1000MULBXMOVDX,AXC3:MOVAL,X[1]MOVBL,100MULBLADDDX,AXC2:MOVAL,X[2]MOVBL,10MULBLADDDX,AXC1:MOVAL,X[3]MOVAH,0ADDDX,AXCMPE,1JNZX1_SMOVX2,DX;按下的是等号,则将第二个运算数据的值存入X2变量JMPEXIT3X1_S:MOVX1,DX;按下的是运算符号,则将第一个运算数据的值存X1变量MOVX[3],0;清空X变量MOVX[2],0MOVX[1],0MOVX[0],0EXIT3:POPDXPOPBXPOPAXRETCOUNTENDP;以下为数字键处理子程序;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数NUMBERPROCCMPE,1JNZCONTINUEMOVE,0CALLCLEARCONTINUE:CMPCC,0;目前数据为0位,即没有数据,则转到SSSJZSSS;若已有数据,以下程序将X左移8位。;例如:先输入“1”,当再输入2时,;先要将“1”从个位移到十位,然后再将“2”存放到个位PUSHAXPUSHDXMOVAL,X[3]MOVAH,X[2]MOVDL,X[1]MOVDH,X[0]MOVCX,8LL:SHLAX,1RCLDX,1LOOPLLMOVX[3],ALMOVX[2],AHMOVX[1],DLMOVX[0],DHPOPDXPOPAXSSS:MOV[DI],DL;将当前键入的数据存放到X的最低位INCCC;数据位数加1CMPCC,4;判断数据位数JNGEXIT2MOVCC,0;如果数据超过4位,重新从最低位开始存放MOVX[2],0MOVX[1],0MOVX[0],0EXIT2:CALLDISP;调显示子程序,显示输入的数据RETNUMBERENDP;加法子程序ADDPPROCPUSHAXMOVAX,X1ADDAX,X2MOVY,AXPOPAXRETADDPENDP;减法子程序SUBPPROCPUSHAXMOVAX,X1SUBAX,X2MOVY,AXPOPAXRETSUBPENDP;乘法子程序MULPPROCPUSHAXPUSHDXMOVAX,X1MOVDX,X2MULDXMOVY,AXPOPDXPOPAXRETMULPENDP;除法子程序DIVPPROCPUSHAXPUSHBXPUSHDXMOVDX,0MOVAX,X1MOVBX,X2DIVBXMOVY,AXPOPDXPOPBXPOPAXRETDIVPENDP;显示子程序,将X中的数值按位显示出来DISPPROCPUSHBXPUSHAXMOVBH,0LEASI,DISCODECALLBITP;测试X位数

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功