微机基础原理课程教学设计(用8255A实现4位十进制计算器).doc
-/ 课程设计报告( 2012- 2013年度第 1 学期)名 称:微型计算机原理及应用 题 目:用8255A实现四位十进制数简单计算器院 系:控制与计算机工程学院班 级:自动化1003班学 号:1101190302学生姓名:范 昌指导教师:王震宇 设计周数:一周成 绩: 同 组 人:贾旭 郭欢 刘玉婷日期:2013 年 1 月 5 日-/一、 课程设计的目的与要求课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。通过课程设计,要求学生熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,使学生得到微机开发应用方面的初步训练。让学生独立或集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题,真正做到理论联系实际,提高动手能力和分析问题、解决问题的能力,实现由学习知识到应用知识的初步过渡。通过本次课程设计使学生熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法。我组根据微机原理课程所学相关知识及实验教程相关内容,在基于proteus平台,使用汇编语言,以8086为核心的情况下,配合可编程并行接口器件8255A,LED数码管等器件实现可进行简单四位数加减乘除法功能的十进制计算器。在课程设计实践中,我们不仅锻炼了实际动手能力,培养了团队精神和严肃认真的工作态度,更增强了自己在实际的工程设计中查阅资料,撰写设计报告表达设计思想和结果的能力。二、 课程设计进度及任务分工课设进度:1.选择课程设计题目,查阅相关资料。(全体组员) 2.需求分析及总体设计。(全体组员)3.软硬件设计。(范昌负责主程序的框架与整体调试、LED数码显示部分及硬件构架,贾旭负责键盘管理部分,郭欢、刘玉婷负责算法及相关程序) 4.仿真调试。(范昌、贾旭) 5.总结及撰写设计报告。(郭欢、刘玉婷) 6.个人总结(全体组员)三、设计正文1 需求分析l 操控核心微处理器8086芯片l 可编程并行接口芯片8255Al 可编程定时/计数器8253Al 对输入扫描的矩阵键盘l 显示模块LED数码管l 辅助器件如74LS138译码器、74LS373等2 总体设计l 确定键盘是否有输入(使用程序不断进行扫描)l 若有输入就调用子程序进行判断,是数值则进行存储并同时进行显示,是运算符号等就调用相应的子程序进行操作l 继续扫描键盘是否有输入,从而实现4位十进制数以内的加减乘除法或者扩展功能运算l 运算完成后将运算的结果储存并显示到LED显示器上3 硬件设计见附录。4 软件设计见附录。四、课程设计总结或结论(1)个人总结 本次课程设计我们做的课题是用8255A实现4位十进制数简易计算器,四人一组,我负责主程序的框架与整体调试、LED数码显示部分及硬件构架。对于主程序的框架,是整个计算器的核心,通过与其他组员的商量我们最终确定了我们的主要算法:通过一个4*4键盘,输入数据,实现加减乘除操作,将输入的数据和运算符分别存储,接收到“=”时进行运算,并将结果输出。 看起来简单的算法,由于涉及到十进制和十六进制的转换,其中就需要很多中间的转换程序。经过反复修改与查阅资料,我们的程序最终能够完成部分预期功能。我还负责LED数码管显示部分的程序,四位七段数码管的显示,原理看起来简单,但是实际操作时却有各种各样的毛病,按照原理写好程序,往往不能达到预期效果,数码管又是不显示,有时会显示乱码,有时会闪烁,所有这些,都要一步一步调试,加入合适的延时程序是关键,延时过长、过短都不好。显示乱码是程序方面出了问题,经过一次次调试,终于得到了稳定的显示,我对数码管的应用也更熟练了。由于我之前有接触过proteus仿真软件,所以我负责硬件的搭建,熟悉使用proteus软件对我们专业来说是一项基本技能,通过一次次摸索与百度,我对这个软件的使用也越来越熟悉,学会了怎么连总线,怎么仿真,怎么快速连线,以及常用元件的搜索。其中最让我满足的是键盘的设计,如果用16个按钮排列当然可以实现我们的要求,但是每次按按钮有很不方便,所以我在网上查询资料,学会了用proteus自身的模型制作自己的元件,上图左边是普通矩阵键盘,右图是我利用proteus自身模型制作的的键盘,感觉很满意。整个硬件仿真的搭建,由于对软件的不熟悉,本身设计的问题,花了我很长时间,而且重复连接了很多次,最后我们成功仿真出了我们的计算器。通过本次课程设计,就我本身来说我学会了很多东西,无论是软件上汇编语言程序的编写与调试,还是硬件的搭建技巧与相关软件的应用的能力都得到了很大提高,同时也锻炼了我的自我学习能力与交流合作能力,相关软件的学习使用,相关芯片与元件的使用与选择能力都在一定程度上有了很大进步。同时,软硬件的结合,也体现了我们自动化专业的特点。最后,有一点遗憾的就是做好了四位的简易计算器,我们想进一步扩展做成八位的计算器,但是难度有所加大,不是想象中的那么简单,数码管显示部分就花了很大精力去调试。最后由于时间关系没有完成8位计算器的制作。(2)团队总结 本次课程设计,我们是四人一组,团队合作的要求就比较高。因为选题的关系,需要更多的人合作,所以决定四人组队,各自发挥特长。 在设计过程中,我们配合得很好,初期的查阅资料共享,极大地体现了我们人数上的优势。对于整个设计的交流更让我们在大方向上走上了正确的道路,少走了很多弯路。我们的课题看起来简单,其实不然,仔细分析,涉及的知识面很广,很考验我们的基本功和自学能力。软件方面的算法由于是大家一起讨论后决定的,一般都是可行的,也有很多难点,比如说十进制与十六进制的转换,数据的输出与存储等,但是在我们的通力合作下一一解决了我们面临的很多难题。硬件方面用的是proteus软件仿真,硬件电路的设计也是一个难点,但是通过查阅资料与相互交流,我们的电路最终是可行的,虽然之前失败了好几次。软件和硬件的结合再一次考验了我们的合作精神,软件是建立在硬件上的,硬件体现软件的功能,主要负责硬件和组要负责软件的同学建立了很好的默契,相互学习,圆满的完成了任务。本次课程设计我们对自己的成果相对比较满意,在设计的过程中,大家相互学习,相互帮助,都收获很多。但是我们也有很多不足的地方,比如四位的计算器位数太少,不能进行小数运算等,这些都是对我们能力的极大挑战,为了解决这些问题我们也进行了积极探索,设计了一个八位的简单计算器,但是由于时间有限,没能完成设计。 五、参考文献1清华大学TPC2003A实验指导书,2006版 2新编16/32位微型计算机原理及应用,李继灿主编,清华大学出版社,2008版,第四版3 陈继红.微机原理及应用M.北京:高等教育出版社,2011年,276-283页4 周明德.微型计算机系统原理及应用M.北京:清华大学出版社,2007年附录一、 软件设计扫描计算键值数值?运算符?“=”?“+”?“-”?“*”?除法运算加法运算清零减法运算乘法运算存储显示1. 总程序流程图 2. 扫描程序流程图开始初始化延时12ms按键扫描保存键值按键闭合按键释放按键闭合YYYNNN结束3. 程序代码;8255A端口地址:A口:40H,B口:44H,C口:42H,控制端口:46HDATA SEGMENTXDB? , ? , ? , ?;存放数据的每一位X1DW ?;存放第一个数据值X2DW?;存放第二个数据值YDW?;存放运算结果SDB? ;存放运算符号值EDB? ;按下等号键标记CC DB? ;存放运算数据位数HDB0 ;存放按键行号LDB0 ;存放按键列号DISCODEDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;段码表DATA ENDSCODE SEGMENTASSUMECS:CODEDS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,90H ;设置为A口输入,B口输出,C口输出OUT46H,ALMOVDI,OFFSET X+3;DI指向X的高位KKK:CALLKEY ;扫描按键JMPKKK;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号KEY PROCCHECK:CALLDISP ;等待按键按下的同时进行显示MOVAL,0F0H ;所有行输出低电平OUT44H,ALINAL,40HCMPAL,0FFH ;读列值JZ CHECK ;若都为高电平则无键按下,等待MOVCX,50LOOP$ ;延时消抖INAL,DX ;重读列值CMPAL,0FFHJZCHECK ;无键按下一直等待MOVH,0 ;有键按下,先把行列号变量清0MOVL,0MOVBL,01HMOVBH,0FEH ;扫描法读键值:从第一行开始测试,即PC0输出低电平NEXT:MOVAL,BHOUT 44H,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:RETKEY ENDP;以下为计算键值子程序,通过行列号计算键值(键值=行号*4+列号)键值存放在DL寄存器中KEYVALUE PROCMOVDL,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:RETKEYVALUE ENDP;以下为清除键处理子程序,按下清除键后,X变量全部清0CLEAR PROCMOVX3,0MOVX2,0MOVX1,0MOVX0,0CALLBITPRETCLEAR ENDP;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量;并根据运算符号,调用相应的运算子程序OUTP PROCPUSHAXPUSHDXPUSHBXINCECALLCOUNT ;调运算键处理子程序,计算第二个运算数据CMPS,10JZADD_CALL ;运算符为加号,则调用加法子程序CMPS,11JZSUB_CALL ;运算符为减号,则调用减法子程序CMPS,12JZMUL_CALL ;运算符为乘号,则调用乘法子程序CMPS,13CALLDIVP ;运算符为除号,则调用除法子程序JMPSTORE1ADD_CALL:CALLADDPJMPSTORE1SUB_CALL:CALLSUBPJMPSTORE1MUL_CALL:CALLMULPSTORE1:MOVAX,Y;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量MOVDX,0MOVBX,1000DIVBXMOVX0, ALMOVAX,DXMOVBL,100DIVBLMOVX1,ALMOVAL,AHMOVAH,0MOVBL,10DIVBLMOVX2,ALMOVX3,AHPOPBXPOPDXPOPAXRETOUTP ENDP;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量;或者将第二个运算数据的数值计算出来并存入X2变量;将运算符的值存入S变量COUNT PROCPUSHAXPUSHBXPUSHDXMOVDX,0CALLBITP ;测试X中的数据是多少位CMPCC,4 ;输入的数据是4位数 ?JZC4CMPCC,3 ;输入的数据是3位数 ?JZ C3CMPCC,2 ;输入的数据是2位数 ?JZC2JMPC1 ;输入的数据是1位数 ?C4:MOVAX,0MOVAL,X0MOV BX,1000MUL BXMOV DX,AXC3:MOVAL,X1MOV BL,100MUL BLADD DX,AXC2:MOV AL,X2MOVBL,10MULBLADDDX,AXC1:MOVAL,X3MOVAH,0ADDDX,AXCMPE,1JNZX1_SMOVX2,DX ;按下的是等号,则将第二个运算数据的值存入X2变量JMPEXIT3X1_S:MOVX1,DX ;按下的是运算符号,则将第一个运算数据的值存X1变量MOVX3,0 ;清空X变量MOVX2,0MOVX1,0MOV X0,0EXIT3: POP DXPOPBXPOPAXRETCOUNT ENDP;以下为数字键处理子程序;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数NUMBER PROCCMPE,1JNZCONTINUEMOVE,0CALLCLEARCONTINUE:CMPCC,0 ;目前数据为0位,即没有数据,则转到SSSJZSSSPUSHAXPUSHDXMOVAL,X3MOVAH,X2MOVDL,X1MOVDH,X0MOV CX,8LL:SHLAX, 1RCLDX,1LOOPLLMOVX3,ALMOVX2,AHMOVX1,DLMOVX0,DHPOPDXPOPAXSSS:MOV DI,DL ;将当前键入的数据存放到X的最低位INCCC ;数据位数加1CMPCC,4 ;判断数据位数JNGEXIT2MOVCC,0 ;如果数据超过4位,重新从最低位开始存放MOVX2,0MOVX1,0MOV X0,0EXIT2: CALL DISP ;调显示子程序,显示输入的数据RETNUMBER ENDP;加法子程序ADDP PROCPUSHAXMOVAX,X1ADDAX,X2MOVY,AXPOPAXRETADDP ENDP;减法子程序SUBP PROCPUSHAXMOVAX,X1SUBAX,X2MOV Y,AXPOP AXRETSUBP ENDP;乘法子程序MULP PROCPUSHAXPUSHDXMOV AX,X1MOVDX,X2MULDXMOVY,AXPOPDXPOPAXRETMULP ENDP;除法子程序DIVP PROCPUSHAXPUSHBXPUSHDXMOVDX,0MOV AX,X1MOVBX,X2DIV BXMOVY,AXPOP DXPOP BXPOP AXRETDIVP ENDP;显示子程序 ,将X中的数值按位显示出来DISP PROCPUSHBXPUSH AXMOVBH,0LEA SI,DISCODECALLBITP ;测试X位数CMP CC,4JZ QIANCMP CC,3JZ BAICMP CC,2JZ SHICMP CC,1JMP GJMP NONEQIAN:MOVAH,11100000B ;从第4位开始显示MOVAL,AHOUT 44H,ALMOV BL,X0MOV AL,SI+BXOUT 42H,ALCALL DELYMOV AL,0OUT 42H,ALBAI:MOVAH,11010000B ;从第3位开始显示MOV AL,AHOUT44H,ALMOV BL,X1MOV AL,SI+BXOUT 42H,ALCALL DELYMOV AL,0OUT 42H,ALSHI:MOV AH,10110000B ;从第2位开始显示MOV AL,AHOUT 44H,ALMOV BL,X2MOV AL,SI+BXOUT 42H,ALCALL DELYMOV AL,0OUT 42H,ALG:MOV AH,01110000B ;从第1位开始显示MOVAL,AHOUT 44H,ALMOV BL,X3MOV AL,SI+BXOUT 42H,ALCALL DELYJMP EXIT4NONE: MOVAL,0 ;X中没有数据,不显示OUT42H,ALEXIT4: POP AXPOP BXRETDISP ENDP;分析数据位数子程序BITP PROCCMP X0,0 ;如果X0不为0,则数据为4位数JNZ FOURBITCMP X1,0 ;如果X1不为0,则数据为3位数JNZ THREEBITCMP X2,0 ;如果X2不为0,则数据为2位数JNZ TOWBITCMP X3,0 ;如果X3不为0,则数据为1位数JNZ ONEBITJMP ZER0BIT ;否则,没有数据FOURBIT:MOVCC,4JMPEXIT5THREEBIT: MOVCC,3JMP EXIT5TOWBIT: MOV CC,2JMP EXIT5ONEBIT: MOV CC,1JMP EXIT5ZER0BIT: MOV CC,0EXIT5: RETBITP ENDP;延时子程序DELY PROCPUSHCXMOV CX,100LOOP $POP CXRETDELY ENDPCODE ENDSEND START二、 硬件设计1.微处理器8086当引脚接高电平时,CPU工作于最小模式。此时,引脚信号2431的含义及其功能如下: (1)INTA/(interrupt acknowledge):可屏蔽中断响应信号,输出,低电平有效。 CPU通过信号对外设提出的可屏蔽中断请求做出响应。为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。(2)ALE(address lock enable):地址锁存允许信号,输出,高电平有效。 CPU利用ALE信号可以把AD15 AD0地址/数据、A19/S6A16/S3地址/状态线上的地址信息锁存在地址锁存器中。 (3)DEN/(data enable):数据允许控制信号,输出,三态,低电平有效。信号用作总线收发器的选通控制信号。当为低电平时,表明CPU进行数据的读/写操作。 (4)DT/(data transmit or receive):数据发送/接收信号,输出,三态。 DT/信号用来控制数据传送的方向。DT/为高电平时,CPU发送数据到存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。(5)IO/M/(memory I/O select):存储器、I/O端口选择控制信号。 信号指明当前CPU是选择访问存储器还是访问I/O端口。为高电平时访问存储器,表示当前要进行CPU与存储器之间的数据传送。为低电平时,访问I/O端口,表示当前要进行CPU与I/O端口之间的数据传送。 (6)WR/(write):写信号,输出,低电平有效。 信号有效时,表明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。(7)HLDA(hold acknowledge):总线保持响应信号,输出,高电平有效。HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。(8)HOLD(bus hold request):总线保持请求信号,输入,高电平有效。在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。 2. 可编程并行接口芯片8255ARESET:复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O 口均被置成输入方式。PA0PA7:端口A 输入输出线,一个8 位的数据输出锁存器/缓冲器, 一个 8 位的数据输入锁存器。PB0PB7:端口B 输入输出线,一个8 位的I/O 锁存器, 一个 8 位的输入输出缓冲器。PC0PC7:端口C 输入输出线,一个8 位的数据输出锁存器/缓冲器, 一个 8 位的数据输入缓冲器。端口C 可以通过工作方式设定而分成2 个4 位的端口, 每个 4 位的端口包含一个4 位的锁存器,分别与端口A 和端口B 配合使用,可作为控制信号输出或状态信号输入端口。CS:片选信号线,当这个输入引脚为低电平时,表示芯片被选中,允许8255 与CPU 进行通讯。RD:读信号线,当这个输入引脚为低电平时,允许8255 通过数据总线向CPU 发送数据或状态信息,即CPU 从8255 读取信息或数据。WR:写入信号,当这个输入引脚为低电平时,允许CPU 将数据或控制字写8255。D0D7:三态双向数据总线,8255 与CPU 数据传送的通道,当CPU 执行输入输出指令时,通过它实现8 位数据的读/写操作,控制字和状态信息也通过数据总线传送。8255 的读写控制:8255 的读/写控制逻辑电路接受CPU 发来的控制口号RD、WR、RESET 和地址信号A1A0。然后根据命令端口,控制信号的要求,将端口的数据读出选信CPU 或者将CPU送来的数据写入端口,各端口的工作状态。通过用输出指令对8255A 的控制字寄存器编程,写入设定工作方式的控制字,可以让3个数据口以不同的方式工作,端口A 可工作于3 种方式的任一种,端口B 只能工作于方式0 和方式1,端口C 除了用于输入输出端口外,还能配合A 口和B 口工作,为这两个端口的输入输出操作提供联系信号。 3.可编程定时/计数器8253A8253A的引脚可以分为两部分:与CPU的接口引脚和与外设的接口引脚。(1) 与CPU的接口引脚 D0D7:三态双向数据线,和CPU数据总线相连,用于传输CPU与8253之间的数据信息、控制信息和状态信息。CS:片选信息,输入、低电平有效。A1、A0:用来对8253A片内三个计数通道和控制字寄存器进行寻址。RD:读信号,输入,低电平有效。WR:写信号,输入,低电平有效。(2) 与外设的接口引脚CLK:时钟输入引脚,用于输入定时脉冲或计数脉冲信号。计数器对这个引脚输入的脉冲进行计数。GATE:门控输入端。用于外部控制计数器的启动计数和停止计数的操作。两个或两个以上计数器连用时,可以用此信号来同步,也可用于与外部某信号的同步。OUT:计数输出端。不管8253以何种方式工作,当计数器计数到0时,在OUT引脚上必定有输出。在不同模式下,可输出不同形式的信号。4.LED数码管LED为发光二极管构成的显示器件,亦称数码管。由7个字符段和一个小数点段组成,每段对应一个发光二极管,当发光二极管点亮时,相应的字符段点亮。LED有共阴极和共阳极两种供应状态。共阴极显示时,将LED显示的COM接地,将八个字符段端a、b、c、d、e、f、g、dp依次与一个8位I/O口的最低到最高位连接,当I/O给LED的哪个字符段送入一个高电平时,该段就被点亮,从而可从这7个字符段中被点亮的构成相应的字符显示出来。同理,COM阳极即将COM端接Vcc,其显示原理与COM阴极的基本相同,但I/O口送入低电平是相应的段才被点亮。 5.44矩阵按键键盘是信息输入元件,由一个个按钮组成,如果是独立按钮的话必须要需要一个I/O口对它进行检测。因为44矩阵键盘有8个管脚,于是将键盘接8255A的PC口。因为进行键盘扫描一般要求有一部分的I/O口的工作方式是输入,另一部分I/O是输出,具体到44键盘则要求4个I/O口输入,另外4个输出,这一点PC口刚好符合,而PA、PB口要么全部输入或输出,所以只能是PC口接键盘。4x4矩阵按键面板6.74L138译码器当一个选通端(E1)为高电平,另两个选通端((/E2)和/(E3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。比如:A2A1A0=110时,则Y6输出端输出低电平信号。 利用 E1、E2和E3可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。 若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。 可用在8086的译码电路中,扩展内存。7.74LS373D 锁存器 373为三态输出的八 D 透明锁存器,共有 54S373 和 74LS373 两种线路。当三态允许控制端 OE 为低电平时,Q0Q7为正常逻辑状态,可用来驱动负载或总线。当 OE 为高电平时,Q0Q7 呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。 当锁存允许端 LE 为高电平时,Q 随数据 D 而变。当 LE 为低电平时,D 被锁存在已建立的数据电平。当 LE 端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善 400mV。 引出端符号:D0D7 数据输入端 OE 三态允许控制端(低电平有效) LE 锁存允许端 Q0Q7 输出端 三、设计原理图
收藏
- 资源描述:
-
-/
课程设计报告
( 2012-- 2013年度第 1 学期)
名 称:微型计算机原理及应用
题 目:用8255A实现四位十进制数简单计算器
院 系:控制与计算机工程学院
班 级:自动化1003班
学 号:1101190302
学生姓名:范 昌
指导教师:王震宇
设计周数:一周
成 绩:
同 组 人:贾旭 郭欢 刘玉婷
日期:2013 年 1 月 5 日
-/
一、 课程设计的目的与要求
课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力的重要教学环节。它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一个重要教学环节。
通过课程设计,要求学生熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,使学生得到微机开发应用方面的初步训练。让学生独立或集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题,真正做到理论联系实际,提高动手能力和分析问题、解决问题的能力,实现由学习知识到应用知识的初步过渡。通过本次课程设计使学生熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法。
我组根据微机原理课程所学相关知识及实验教程相关内容,在基于proteus平台,使用汇编语言,以8086为核心的情况下,配合可编程并行接口器件8255A,LED数码管等器件实现可进行简单四位数加减乘除法功能的十进制计算器。在课程设计实践中,我们不仅锻炼了实际动手能力,培养了团队精神和严肃认真的工作态度,更增强了自己在实际的工程设计中查阅资料,撰写设计报告表达设计思想和结果的能力。
二、 课程设计进度及任务分工
课设进度:1.选择课程设计题目,查阅相关资料。(全体组员)
2.需求分析及总体设计。(全体组员)
3.软硬件设计。(范昌负责主程序的框架与整体调试、LED数码显示部分及硬件构架,贾旭负责键盘管理部分,郭欢、刘玉婷负责算法及相关程序)
4.仿真调试。(范昌、贾旭)
5.总结及撰写设计报告。(郭欢、刘玉婷)
6.个人总结(全体组员)
三、设计正文
1. 需求分析
l 操控核心微处理器8086芯片
l 可编程并行接口芯片8255A
l 可编程定时/计数器8253A
l 对输入扫描的矩阵键盘
l 显示模块LED数码管
l 辅助器件如74LS138译码器、74LS373等
2. 总体设计
l 确定键盘是否有输入(使用程序不断进行扫描)
l 若有输入就调用子程序进行判断,是数值则进行存储并同时进行显示,是运算符号等就调用相应的子程序进行操作
l 继续扫描键盘是否有输入,从而实现4位十进制数以内的加减乘除法或者扩展功能运算
l 运算完成后将运算的结果储存并显示到LED显示器上
3. 硬件设计
见附录。
4. 软件设计
见附录。
四、课程设计总结或结论
(1)个人总结
本次课程设计我们做的课题是用8255A实现4位十进制数简易计算器,四人一组,我负责主程序的框架与整体调试、LED数码显示部分及硬件构架。对于主程序的框架,是整个计算器的核心,通过与其他组员的商量我们最终确定了我们的主要算法:通过一个4*4键盘,输入数据,实现加减乘除操作,将输入的数据和运算符分别存储,接收到“=”时进行运算,并将结果输出。
看起来简单的算法,由于涉及到十进制和十六进制的转换,其中就需要很多中间的转换程序。经过反复修改与查阅资料,我们的程序最终能够完成部分预期功能。
我还负责LED数码管显示部分的程序,四位七段数码管的显示,原理看起来简单,但是实际操作时却有各种各样的毛病,按照原理写好程序,往往不能达到预期效果,数码管又是不显示,有时会显示乱码,有时会闪烁,所有这些,都要一步一步调试,加入合适的延时程序是关键,延时过长、过短都不好。显示乱码是程序方面出了问题,经过一次次调试,终于得到了稳定的显示,
我对数码管的应用也更熟练了。
由于我之前有接触过proteus仿真软件,所以我负责硬件的搭建,熟悉使用proteus软件对我们专业来说是一项基本技能,通过一次次摸索与百度,我对这个软件的使用也越来越熟悉,学会了怎么连总线,怎么仿真,怎么快速连线,以及常用元件的搜索。其中最让我满足的是键盘的设计,如果用16个按钮排列当然可以实现我们的要求,但是每次按按钮有很不方便,所以我在网上查询资料,学会了用proteus自身的模型制作自己的元件,上图左边是普通矩阵键盘,右图是我利用proteus自身模型制作的的键盘,感觉很满意。整个硬件仿真的搭建,由于对软件的不熟悉,本身设计的问题,花了我很长时间,而且重复连接了很多次,最后我们成功仿真出了我们的计算器。
通过本次课程设计,就我本身来说我学会了很多东西,无论是软件上汇编语言程序的编写与调试,还是硬件的搭建技巧与相关软件的应用的能力都得到了很大提高,同时也锻炼了我的自我学习能力与交流合作能力,相关软件的学习使用,相关芯片与元件的使用与选择能力都在一定程度上有了很大进步。同时,软硬件的结合,也体现了我们自动化专业的特点。
最后,有一点遗憾的就是做好了四位的简易计算器,我们想进一步扩展做成八位的计算器,但是难度有所加大,不是想象中的那么简单,数码管显示部分就花了很大精力去调试。最后由于时间关系没有完成8位计算器的制作。
(2)团队总结
本次课程设计,我们是四人一组,团队合作的要求就比较高。因为选题的关系,需要更多的人合作,所以决定四人组队,各自发挥特长。
在设计过程中,我们配合得很好,初期的查阅资料共享,极大地体现了我们人数上的优势。对于整个设计的交流更让我们在大方向上走上了正确的道路,少走了很多弯路。我们的课题看起来简单,其实不然,仔细分析,涉及的知识面很广,很考验我们的基本功和自学能力。软件方面的算法由于是大家一起讨论后决定的,一般都是可行的,也有很多难点,比如说十进制与十六进制的转换,数据的输出与存储等,但是在我们的通力合作下一一解决了我们面临的很多难题。硬件方面用的是proteus软件仿真,硬件电路的设计也是一个难点,但是通过查阅资料与相互交流,我们的电路最终是可行的,虽然之前失败了好几次。软件和硬件的结合再一次考验了我们的合作精神,软件是建立在硬件上的,硬件体现软件的功能,主要负责硬件和组要负责软件的同学建立了很好的默契,相互学习,圆满的完成了任务。
本次课程设计我们对自己的成果相对比较满意,在设计的过程中,大家相互学习,相互帮助,都收获很多。但是我们也有很多不足的地方,比如四位的计算器位数太少,不能进行小数运算等,这些都是对我们能力的极大挑战,为了解决这些问题我们也进行了积极探索,设计了一个八位的简单计算器,但是由于时间有限,没能完成设计。
五、参考文献
[1]《清华大学TPC—2003A实验指导书》,2006版
[2]《新编16/32位微型计算机原理及应用》,李继灿主编,清华大学出版社,2008版,第四版
[3] 陈继红.微机原理及应用[M].北京:高等教育出版社,2011年,276-283页
[4] 周明德.微型计算机系统原理及应用[M].北京:清华大学出版社,2007年
附录
一、 软件设计
扫描
计算键值
数值?
运算符?
“=”?
“+”?
“-”?
“*”?
除法运算
加法运算
清零
减法运算
乘法运算
存储
显示
1. 总程序流程图
2. 扫描程序流程图
开始
初始化
延时12ms
按键扫描
保存键值
按键闭合
按键释放
按键闭合
Y
Y
Y
N
N
N
结束
3. 程序代码
;8255A端口地址:A口:40H,B口:44H,C口:42H,控制端口:46H
DATA SEGMENT
X DB ? , ? , ? , ? ;存放数据的每一位
X1 DW ? ;存放第一个数据值
X2 DW ? ;存放第二个数据值
Y DW ? ;存放运算结果
S DB ? ;存放运算符号值
E DB ? ;按下等号键标记
CC DB ? ;存放运算数据位数
H DB 0 ;存放按键行号
L DB 0 ;存放按键列号
DISCODE DB 3FH,06H,5BH,4FH,
66H,6DH,7DH,07H,
7FH,6FH,77H,7CH,
39H,5EH,79H,71H ;段码表
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE
DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,90H ;设置为A口输入,B口输出,C口输出
OUT 46H,AL
MOV DI,OFFSET X+3 ;DI指向X的高位
KKK: CALL KEY ;扫描按键
JMP KKK
;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号
KEY PROC
CHECK: CALL DISP ;等待按键按下的同时进行显示
MOV AL,0F0H ;所有行输出低电平
OUT 44H,AL
IN AL,40H
CMP AL,0FFH ;读列值
JZ CHECK ;若都为高电平则无键按下,等待
MOV CX,50
LOOP $ ;延时消抖
IN AL,DX ;重读列值
CMP AL,0FFH
JZ CHECK ;无键按下一直等待
MOV H,0 ;有键按下,先把行列号变量清0
MOV L,0
MOV BL,01H
MOV BH,0FEH ;扫描法读键值:从第一行开始测试,即PC0输出低电平
NEXT: MOV AL,BH
OUT 44H,AL
NEXTH: IN AL,40H ;读列值,判断是第几列有键按下
TEST AL,BL ;从第一列开始判断
JZ WAIT0
ROL BL,1
CMP BL,10H ;当前行状态下没有列有键按下,则转为对下一行的测试
JZ NEXTL
INC H ;每判断一列,列号加1
JMP NEXTH ;再对下一列进行判断
NEXTL: MOV H,0
MOV BL,01H
ROL BH,1 ;对下一行测试,让下一个PC口输出低电平
CMP BH,0EFH
JZ EXIT
INC L
JMP NEXT
WAIT0: IN AL,40H ;若有键按下,则等该按键松开后再计算键值
CMP AL,0FFH
JNZ WAIT0
MOV CX,50
LOOP $ ;延时消抖
IN AL,40H
CMP AL,0FFH
JNZ WAIT0
CALL KEYVALUE ;调计算键值子程序
EXIT: RET
KEY ENDP
;以下为计算键值子程序,通过行列号计算键值(键值=行号*4+列号)键值存放在DL寄存器中
KEYVALUE PROC
MOV DL,L
MOV DH,H
SHL DL,1
SHL DL,1 ;列号乘4
ADD DL,DH
CMP DL,9 ;按下的是数字键
JNG NUM_CALL
CMP DL,14
JL CONT_CALL ;按下的是运算键
CMP DL,14
JZ OUTP_CALL ;按下的是等于键
CMP DL,15
JZ CLR_CALL ;按下的是清除键
NUM_CALL: CALL NUMBER ;调数字键处理子程序
JMP EXIT1
CONT_CALL: MOV S,DL ;存放运算键的键值
MOV E,0
CALL COUNT 调运算键处理子程序,计算第一个加数
JMP EXIT1
OUTP_CALL: CALL OUTP ;调等号键处理子程序
JMP EXIT1
CLR_CALL: CALL CLEAR ;调清除键处理子程序
EXIT1: RET
KEYVALUE ENDP
;以下为清除键处理子程序,按下清除键后,X变量全部清0
CLEAR PROC
MOV X[3],0
MOV X[2],0
MOV X[1],0
MOV X[0],0
CALL BITP
RET
CLEAR ENDP
;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量
;并根据运算符号,调用相应的运算子程序
OUTP PROC
PUSH AX
PUSH DX
PUSH BX
INC E
CALL COUNT ;调运算键处理子程序,计算第二个运算数据
CMP S,10
JZ ADD_CALL ;运算符为加号,则调用加法子程序
CMP S,11
JZ SUB_CALL ;运算符为减号,则调用减法子程序
CMP S,12
JZ MUL_CALL ;运算符为乘号,则调用乘法子程序
CMP S,13
CALL DIVP ;运算符为除号,则调用除法子程序
JMP STORE1
ADD_CALL: CALL ADDP
JMP STORE1
SUB_CALL: CALL SUBP
JMP STORE1
MUL_CALL: CALL MULP
STORE1: MOV AX,Y
;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量
MOV DX,0
MOV BX,1000
DIV BX
MOV X[0], AL
MOV AX,DX
MOV BL,100
DIV BL
MOV X[1],AL
MOV AL,AH
MOV AH,0
MOV BL,10
DIV BL
MOV X[2],AL
MOV X[3],AH
POP BX
POP DX
POP AX
RET
OUTP ENDP
;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量
;或者将第二个运算数据的数值计算出来并存入X2变量
;将运算符的值存入S变量
COUNT PROC
PUSH AX
PUSH BX
PUSH DX
MOV DX,0
CALL BITP ;测试X中的数据是多少位
CMP CC,4 ;输入的数据是4位数 ?
JZ C4
CMP CC,3 ;输入的数据是3位数 ?
JZ C3
CMP CC,2 ;输入的数据是2位数 ?
JZ C2
JMP C1 ;输入的数据是1位数 ?
C4: MOV AX,0
MOV AL,X[0]
MOV BX,1000
MUL BX
MOV DX,AX
C3: MOV AL,X[1]
MOV BL,100
MUL BL
ADD DX,AX
C2: MOV AL,X[2]
MOV BL,10
MUL BL
ADD DX,AX
C1: MOV AL,X[3]
MOV AH,0
ADD DX,AX
CMP E,1
JNZ X1_S
MOV X2,DX ;按下的是等号,则将第二个运算数据的值存入X2变量
JMP EXIT3
X1_S: MOV X1,DX ;按下的是运算符号,则将第一个运算数据的值存X1变量
MOV X[3],0 ;清空X变量
MOV X[2],0
MOV X[1],0
MOV X[0],0
EXIT3: POP DX
POP BX
POP AX
RET
COUNT ENDP
;以下为数字键处理子程序
;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数
NUMBER PROC
CMP E,1
JNZ CONTINUE
MOV E,0
CALL CLEAR
CONTINUE:CMP CC,0 ;目前数据为0位,即没有数据,则转到SSS
JZ SSS
PUSH AX
PUSH DX
MOV AL,X[3]
MOV AH,X[2]
MOV DL,X[1]
MOV DH,X[0]
MOV CX,8
LL: SHL AX, 1
RCL DX,1
LOOP LL
MOV X[3],AL
MOV X[2],AH
MOV X[1],DL
MOV X[0],DH
POP DX
POP AX
SSS: MOV [DI],DL ;将当前键入的数据存放到X的最低位
INC CC ;数据位数加1
CMP CC,4 ;判断数据位数
JNG EXIT2
MOV CC,0 ;如果数据超过4位,重新从最低位开始存放
MOV X[2],0
MOV X[1],0
MOV X[0],0
EXIT2: CALL DISP ;调显示子程序,显示输入的数据
RET
NUMBER ENDP
;加法子程序
ADDP PROC
PUSH AX
MOV AX,X1
ADD AX,X2
MOV Y,AX
POP AX
RET
ADDP ENDP
;减法子程序
SUBP PROC
PUSH AX
MOV AX,X1
SUB AX,X2
MOV Y,AX
POP AX
RET
SUBP ENDP
;乘法子程序
MULP PROC
PUSH AX
PUSH DX
MOV AX,X1
MOV DX,X2
MUL DX
MOV Y,AX
POP DX
POP AX
RET
MULP ENDP
;除法子程序
DIVP PROC
PUSH AX
PUSH BX
PUSH DX
MOV DX,0
MOV AX,X1
MOV BX,X2
DIV BX
MOV Y,AX
POP DX
POP BX
POP AX
RET
DIVP ENDP
;显示子程序 ,将X中的数值按位显示出来
DISP PROC
PUSH BX
PUSH AX
MOV BH,0
LEA SI,DISCODE
CALL BITP ;测试X位数
CMP CC,4
JZ QIAN
CMP CC,3
JZ BAI
CMP CC,2
JZ SHI
CMP CC,1
JMP G
JMP NONE
QIAN: MOV AH,11100000B ;从第4位开始显示
MOV AL,AH
OUT 44H,AL
MOV BL,X[0]
MOV AL,[SI+BX]
OUT 42H,AL
CALL DELY
MOV AL,0
OUT 42H,AL
BAI: MOV AH,11010000B ;从第3位开始显示
MOV AL,AH
OUT 44H,AL
MOV BL,X[1]
MOV AL,[SI+BX]
OUT 42H,AL
CALL DELY
MOV AL,0
OUT 42H,AL
SHI: MOV AH,10110000B ;从第2位开始显示
MOV AL,AH
OUT 44H,AL
MOV BL,X[2]
MOV AL,[SI+BX]
OUT 42H,AL
CALL DELY
MOV AL,0
OUT 42H,AL
G: MOV AH,01110000B ;从第1位开始显示
MOV AL,AH
OUT 44H,AL
MOV BL,X[3]
MOV AL,[SI+BX]
OUT 42H,AL
CALL DELY
JMP EXIT4
NONE: MOV AL,0 ;X中没有数据,不显示
OUT 42H,AL
EXIT4: POP AX
POP BX
RET
DISP ENDP
;分析数据位数子程序
BITP PROC
CMP X[0],0 ;如果X[0]不为0,则数据为4位数
JNZ FOURBIT
CMP X[1],0 ;如果X[1]不为0,则数据为3位数
JNZ THREEBIT
CMP X[2],0 ;如果X[2]不为0,则数据为2位数
JNZ TOWBIT
CMP X[3],0 ;如果X[3]不为0,则数据为1位数
JNZ ONEBIT
JMP ZER0BIT ;否则,没有数据
FOURBIT: MOV CC,4
JMP EXIT5
THREEBIT: MOV CC,3
JMP EXIT5
TOWBIT: MOV CC,2
JMP EXIT5
ONEBIT: MOV CC,1
JMP EXIT5
ZER0BIT: MOV CC,0
EXIT5: RET
BITP ENDP
;延时子程序
DELY PROC
PUSH CX
MOV CX,100
LOOP $
POP CX
RET
DELY ENDP
CODE ENDS
END START
二、 硬件设计
1.微处理器8086
当引脚接高电平时,CPU工作于最小模式。此时,引脚信号24~31的含义及其功能如下:
(1)INTA/(interrupt acknowledge):可屏蔽中断响应信号,输出,低电平有效。 CPU通过信号对外设提出的可屏蔽中断请求做出响应。为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。
(2)ALE(address lock enable):地址锁存允许信号,输出,高电平有效。 CPU利用ALE信号可以把AD15 ~AD0地址/数据、A19/S6~A16/S3地址/状态线上的地址信息锁存在地址锁存器中。
(3)DEN/(data enable):数据允许控制信号,输出,三态,低电平有效。信号用作总线收发器的选通控制信号。当为低电平时,表明CPU进行数据的读/写操作。
(4)DT/(data transmit or receive):数据发送/接收信号,输出,三态。 DT/信号用来控制数据传送的方向。DT/为高电平时,CPU发送数据到存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。
(5)IO/M/(memory I/O select):存储器、I/O端口选择控制信号。 信号指明当前CPU是选择访问存储器还是访问I/O端口。为高电平时访问存储器,表示当前要进行CPU与存储器之间的数据传送。为低电平时,访问I/O端口,表示当前要进行CPU与I/O端口之间的数据传送。
(6)WR/(write):写信号,输出,低电平有效。 信号有效时,表明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。
(7)HLDA(hold acknowledge):总线保持响应信号,输出,高电平有效。HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。
(8)HOLD(bus hold request):总线保持请求信号,输入,高电平有效。在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。
2. 可编程并行接口芯片8255A
RESET:复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O 口均被置成输入方式。
PA0~PA7:端口A 输入输出线,一个8 位的数据输出锁存器/缓冲器, 一个 8 位的数据输入锁存器。
PB0~PB7:端口B 输入输出线,一个8 位的I/O 锁存器, 一个 8 位的输入输出缓冲器。
PC0~PC7:端口C 输入输出线,一个8 位的数据输出锁存器/缓冲器, 一个 8 位的数据输入缓冲器。端口C 可以通过工作方式设定而分成2 个4 位的端口, 每个 4 位的端口包含一个4 位的锁存器,分别与端口A 和端口B 配合使用,可作为控制信号输出或状态信号输入端口。
CS:片选信号线,当这个输入引脚为低电平时,表示芯片被选中,允许8255 与CPU 进行通讯。
RD:读信号线,当这个输入引脚为低电平时,允许8255 通过数据总线向CPU 发送数据或状态信息,即CPU 从8255 读取信息或数据。
WR:写入信号,当这个输入引脚为低电平时,允许CPU 将数据或控制字写8255。
D0~D7:三态双向数据总线,8255 与CPU 数据传送的通道,当CPU 执行输入输出指令时,通过它实现8 位数据的读/写操作,控制字和状态信息也通过数据总线传送。
8255 的读写控制:
8255 的读/写控制逻辑电路接受CPU 发来的控制口号RD、WR、RESET 和地址信号A1~A0。然后根据命令端口,控制信号的要求,将端口的数据读出选信CPU 或者将CPU送来的数据写入端口,各端口的工作状态。通过用输出指令对8255A 的控制字寄存器编程,写入设定工作方式的控制字,可以让3个数据口以不同的方式工作,端口A 可工作于3 种方式的任一种,端口B 只能工作于方式0 和方式1,端口C 除了用于输入输出端口外,还能配合A 口和B 口工作,为这两个端口的输入输出操作提供联系信号。
3.可编程定时/计数器8253A
8253A的引脚可以分为两部分:与CPU的接口引脚和与外设的接口引脚。
(1) 与CPU的接口引脚
D0~D7:三态双向数据线,和CPU数据总线相连,用于传输CPU与8253之间的数据信息、控制信息和状态信息。
CS:片选信息,输入、低电平有效。
A1、A0:用来对8253A片内三个计数通道和控制字寄存器进行寻址。
RD:读信号,输入,低电平有效。
WR:写信号,输入,低电平有效。
(2) 与外设的接口引脚
CLK:时钟输入引脚,用于输入定时脉冲或计数脉冲信号。计数器对这个引脚输入的脉冲进行计数。
GATE:门控输入端。用于外部控制计数器的启动计数和停止计数的操作。两个或两个以上计数器连用时,可以用此信号来同步,也可用于与外部某信号的同步。
OUT:计数输出端。不管8253以何种方式工作,当计数器计数到0时,在OUT引脚上必定有输出。在不同模式下,可输出不同形式的信号。
4.LED数码管
LED为发光二极管构成的显示器件,亦称数码管。由7个字符段和一个小数点段组成,每段对应一个发光二极管,当发光二极管点亮时,相应的字符段点亮。LED有共阴极和共阳极两种供应状态。共阴极显示时,将LED显示的COM接地,将八个字符段端a、b、c、d、e、f、g、dp依次与一个8位I/O口的最低到最高位连接,当I/O给LED的哪个字符段送入一个高电平时,该段就被点亮,从而可从这7个字符段中被点亮的构成相应的字符显示出来。同理,COM阳极即将COM端接Vcc,其显示原理与COM阴极的基本相同,但I/O口送入低电平是相应的段才被点亮。
5.44矩阵按键
键盘是信息输入元件,由一个个按钮组成,如果是独立按钮的话必须要需要一个I/O口对它进行检测。因为44矩阵键盘有8个管脚,于是将键盘接8255A的PC口。因为进行键盘扫描一般要求有一部分的I/O口的工作方式是输入,另一部分I/O是输出,具体到44键盘则要求4个I/O口输入,另外4个输出,这一点PC口刚好符合,而PA、PB口要么全部输入或输出,所以只能是PC口接键盘。
4x4矩阵按键面板
6.74L138译码器
①当一个选通端(E1)为高电平,另两个选通端((/E2))和/(E3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。比如:A2A1A0=110时,则Y6输出端输出低电平信号。
②利用 E1、E2和E3可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。
③若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
④可用在8086的译码电路中,扩展内存。
7.74LS373D 锁存器
373为三态输出的八 D 透明锁存器,共有 54S373 和 74LS373 两种线路。
①当三态允许控制端 OE 为低电平时,Q0~Q7为正常逻辑状态,可用来驱动负载或总线。当 OE 为高电平时,Q0~Q7 呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。
②当锁存允许端 LE 为高电平时,Q 随数据 D 而变。当 LE 为低电平时,D 被锁存在已建立的数据电平。当 LE 端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善 400mV。
③引出端符号:
D0~D7 数据输入端
OE 三态允许控制端(低电平有效)
LE 锁存允许端
Q0~Q7 输出端
三、设计原理图
展开阅读全文