




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
仿真器文档仿真器文档仿真器文档仿真器文档这是我毕业设计时做的,主要参考的是ELECTRONICSWORKBENCH这个软件。图标都是偷他的时间有限,我只做了逻辑门,触发器没做。其它储如线性电路,非线性电路。由于我电子学得巨菜,且从小就深恶痛绝中。没办法做。还有,元件的移动,删除,新建,保存,都没时间做了,现在正考研复习中。本程序用VC60开发,界面如图1图1其输出结果真值表如图2图2程序由几个大模块组成元件数据结构模块,电路图编辑模块,元件库模块,计算结果仿真模块。L元件数据结元件数据结元件数据结元件数据结构模块构模块构模块构模块统一的元件数据结构可以提高程序运行速度,方便程序编制。不足是由于元件的不同存储空间上可能会有少许浪费。所有的元件种类共有8种,如图3图3定义数据结构如下TYPEDEFSTRUCTTAGMYNODEMYTYPETYPE/元件类型MYSUBTYPESUBTYPE/元件子类型TAGMYNODEINPUT1/输入端1TAGMYNODEINPUT2/输入端1TAGMYNODEOUTPUT1/输出端1UINTINPUT1VALUE/输入端INPUT1的值UINTINPUT2VALUE/输入端INPUT2的值UINTOUTPUT1VALUE/输出端OUTPUT1的值INTINPUTS/当前已经有几个输入端有值INTNUMBER/对于输入结点的序号CPOINTORGPOINT/记录元件左上角位置INTWIDTH/记录元件宽度INTHEIGHT/记录元件高度MYNODEU元件类型元件类型元件类型元件类型元件类型MYTYPETYPE中MYTYPE是一个枚举类型定义如下ENUMMYTYPENODE,/结点GATE,/门分为两种类型NODE结点和GATE门。U元件子类型元件子类型元件子类型元件子类型元件子类型MYSUBTYPESUBTYPE中MYSUBTYPE也是一个枚举类型,定义如下ENUMMYSUBTYPEINPUT,/输入端OUTPUT,/输出端ANDGATE,/与门ORGATE,/或门NOTGATE,/非门NORGATE,/或非门NANDGATE,/与非门XORGATE,/异或门U指针连接指针连接指针连接指针连接TAGMYNODEINPUT1TAGMYNODEINPUT2TAGMYNODEOUTPUT1是指向此结点的指针。由于元件之间是要相互连接的,于是设置这几个指针用于元件之间的连接。其中特殊情况有非门由于非门只有一个输入端,所以非门不用TAGMYNODEINPUT2输入结点输入结点只有一个链接端这里称之为触点,采用TAGMYNODEOUTPUT1输出结点同输入结点,只有一个触点,采用TAGMYNODEINPUT1U保存触点值保存触点值保存触点值保存触点值由于要进行仿真计算,所以还需保存各个触点的值UINTINPUT1VALUEUINTINPUT2VALUEUINTOUTPUT1VALUE同指针连接,有3种特殊情况非门不用UINTINPUT2VALUE输入结点采用UINTOUTPUT1VALUE输出结点采用UINTINPUT1VALUEU进位标志进位标志进位标志进位标志INTINPUTS在进行仿真计算时,要用进位标志辅助计算。如与门只有在两个输入端都有值时,即INPUTS2时,才能进位。U输入结点序号输入结点序号输入结点序号输入结点序号INTNUMBER每个输入结点都有不同的序号,从1开始递增。U元件位置和大小元件位置和大小元件位置和大小元件位置和大小CPOINTORGPOINTINTWIDTHINTHEIGHTORGPOINT用于记录元件在视图中左上角的坐标WIDTH用于记录元件宽度HEIGHT用于记录元件高度L电路图编辑模块电路图编辑模块电路图编辑模块电路图编辑模块电路图编辑模块又分为两个子模块鼠标放置元件模块,鼠标连接元件模块首先在工具栏中可以选择这两种状态,如图4图4在按钮上单击可以切换状态。定义一个枚举类型MYSTATUS来记录当前状态ENUMMYSTATUSNONE,/鼠标连接元件状态ANDGATE,ORGATE,NOTGATE,NORGATE,NANDGATE,XORGATE,NODEINPUT,NODEOUTPUTMYSTATUSSTATUS其中NONE为鼠标连接状态,其他为鼠标放置状态。U鼠标放置元件模块鼠标放置元件模块鼠标放置元件模块鼠标放置元件模块其算法如图5图5NDRAWOBJECT函数函数函数函数首先根据STATUS的状态,即六个门,两个端结点。共8种来调用DRAWOBJECT函数引入准备好的八张位图六个门,两个端CBITMAPMYBITMAPMYBITMAPLOADBITMAPNID将引入的位图拷贝入窗体窗户区BITMAPBMPINFOMYBITMAPGETBITMAPPOLDBITMAPDCSELECTOBJECTCLIENTDCBITBLTPOINTX,POINTY,BMPINFOBMWIDTH,BMPINFOBMHEIGHT,DCSELECTOBJECTPOLDBITMAP用全局变量BMWIDTH和BMHEIGHT来保存元件的宽度和高度BMWIDTHBMPINFOBMWIDTHBMHEIGHTBMPINFOBMHEIGHTNCREATEMYOBJECT函数函数函数函数函数声明为CREATEMYOBJECTMYTYPETYPE,MYSUBTYPESUBTYPE,CPOINTPOINT初始化元件MYNODEPNODENEWMYNODEPNODETYPETYPEPNODESUBTYPESUBTYPEPNODEINPUT10PNODEINPUT20PNODEOUTPUT10PNODEOUTPUT20PNODEORGPOINTPOINTPNODEWIDTHBMWIDTHPNODEHEIGHTBMHEIGHTPNODEINPUT1VALUE0PNODEINPUT2VALUE0PNODEOUTPUT1VALUE0PNODEINPUTS0如果创建的元件为输入结点,则要创建并画输入结点前的序号,这里采用一个全局数组CARRAYNUMPOINT来记录结点前序号。IFSUBTYPEINPUT/当创建INPUT时加入点到NUMPOINT数组中NUMPOINTADDCPOINTPOINTX15,POINTYPNODENUMBERNUMPOINTGETSIZE/创建时重绘序号REDRAWNUM而REDRAWNUM函数就是将所有输入结点前的序号重绘。最后将元件加入到全局链表CLISTMYLIST中。MYLISTADDTAILPNODEU鼠标连接元件模块鼠标连接元件模块鼠标连接元件模块鼠标连接元件模块鼠标连接元件模块分为三个过程模块鼠标移动模块,鼠标按下模块,鼠标抬起模块。N鼠标移动模块鼠标移动模块鼠标移动模块鼠标移动模块其算法如图6图6代码如下VOIDCMYVIEWONMOUSEMOVEUINTNFLAGS,CPOINTPOINT/TODOADDYOURMESSAGEHANDLERCODEHEREAND/ORCALLDEFAULT/此时必然是非画图状态,所以STATUSNONEIFSTATUSNONE/当前点在某个物件上吗并且/当前点在该物件触点上吗IFISPOINTINOBJECTPOINT/此时鼠标移进触点/当前是连接态吗IFISLINK/连接态画图LINKSTATUSDRAWPOINT/开启画圆圈态ISDRAWCIRCLETRUE/画圆圈DRAWMYCIRCLEELSE/此时鼠标移出触点/如果此时已画圆圈,则要擦除圆圈IFISDRAWCIRCLETRUEERASERMYCIRCLE/关闭画圆圈状态ISDRAWCIRCLEFALSE/重绘连接线MOVEOUTREDRAWLINE/重绘圆圈所在的那个物件,因为擦除圆圈的时候可能擦除了部分物件/REDRAWMYOBJECTPNODENOW/如果此时是连接状态,连接态画图IFISLINK/连接态画图LINKSTATUSDRAWPOINTCVIEWONMOUSEMOVENFLAGS,POINT两个关键状态两个关键状态两个关键状态两个关键状态可连接态ISDRAWCIRCLE和正在连接态ISLINK可连接态可连接态可连接态可连接态ISDRAWCIRCLE当且仅当鼠标移动到某个元件上的某个尚未连接的触点上,才开启可连接态ISDRAWCIRCLE。之所以取名ISDRAWCIRCLE是因为此时会在鼠标停留的尚未连接的触点上画一个黑色小圆圈。当鼠标移动离开触点,可连接态ISDRAWCIRCLE关闭。正在连接态正在连接态正在连接态正在连接态ISLINK当鼠标按下见图5并且此时可连接态ISDRAWCIRCLE开启为TRUE时正在连接态ISLINK开启。判断当前点是否在某个元件函数判断当前点是否在某个元件函数判断当前点是否在某个元件函数判断当前点是否在某个元件函数ISPOINTINOBJECTISPOINTINOBJECT其算法如图7图7判断当前点是否在该元件触点上函数判断当前点是否在该元件触点上函数判断当前点是否在该元件触点上函数判断当前点是否在该元件触点上函数ISPOINTINPUTISPOINTINPUT其算法如图8图8与门与其它5个门有所不同,与门只有一个输入端,所以要分开来判断对于输入结点,则判断当前点是否在第一个输出端触点。对于输出结点,则判断当前点是否在第一个输入端触点。输入结点和输出结点的这样判断,一眼看上去似乎反了,但实际上有利于整个程序的编写。可以简单地这样分类总共只有两种端,一种输入,一种输出。这样,我们就可以将判断触点分为三个函数ISININPUT1ISININPUT2ISINOUTPUT1拿ISININPUT1来分析CENTERPOINTGETCIRCLEPOINTINPUT_1IFISINAREAPOINT/说明此时就在触点INPUT_1,用全局变量PUT记录下来PUTINPUT_1/如果当前点在,则要保存触点中心点CIRCLEPOINTCENTERPOINTRETURNTRUEELSE/如果移出触点,肯定不要再保存中心点RETURNFALSE首先,调用函数GETCIRCLEPOINT来取得当前触点的中心点。然后调用ISINAREAPOINT函数来判断当前点POINT是否在以当前触点中心点为中心的矩形区域内。如果是,则用一个全局枚举变量PUT来记录来前触点是两个输入端和一个输出端中哪一个。我们看这个枚举类型ENUMMYPUTINPUT_1,INPUT_2,OUTPUT_1接下来用一个全局变量CIRCLEPOINT来记录当前触点中心点。再返回真。如果当前点不在以当前触点中心点为中心的矩形区域内,则返回假。这时千万不能记录当前触点中心点。这点不注意会出大错。判断当前触点是否已连接函数判断当前触点是否已连接函数判断当前触点是否已连接函数判断当前触点是否已连接函数ISPUTLINKEDISPUTLINKEDBOOLCMYVIEWISPUTLINKEDSWITCHPUTCASEINPUT_1IFPNODENOWINPUT10RETURNTRUEBREAKCASEINPUT_2IFPNODENOWINPUT20RETURNTRUEBREAKCASEOUTPUT_1IFPNODENOWOUTPUT10RETURNTRUERETURNFALSE这里根据全局变量PUT的类型和全局变量PNODENOW所指向的元件,就可以判断当前元件的当前触点是否已连接。如果连接相应指针不为0。返回真,否则返回假。连接态画图函数连接态画图函数连接态画图函数连接态画图函数LINKSTATUSDRAWLINKSTATUSDRAWVOIDCMYVIEWLINKSTATUSDRAWCPOINTPOINTCCLIENTDCCLIENTDCTHISCPENWHITEPENPS_SOLID,1,RGB255,255,255CPENPOLDPENPOLDPENCLIENTDCSELECTOBJECTCLIENTDCMOVETOSTARTPOINTCLIENTDCLINETOLASTPOINTCLIENTDCSELECTOBJECTPOLDPENCPENREDPENPS_DOT,1,RGB255,0,0POLDPENCLIENTDCSELECTOBJECTCLIENTDCMOVETOSTARTPOINTCLIENTDCLINETOPOINTCLIENTDCSELECTOBJECTPOLDPENLASTPOINTPOINT/重绘所有输入结点前的序号REDRAWNUM/重绘连接线LINKLINEREDRAWSTARTPOINT,POINT/重绘物件LINEREDRAWSTARTPOINT,POINT这里,STARTPOINT是鼠标按下开始连接时起始元件触点中心点坐标,LASTPOINT是上一次鼠标移动所停留的点。为了实在连接时鼠标移动的动画效果,我们要先擦除上一次移动画的线用白笔,然后再从STARTPOINT到当前点POINT画线。移动时由于不信的擦除重画,可能将先前已画的元件,输入结点前的序号,和已经连接好的线擦除。于是我们需要重绘。重绘所有输入结点前的序号重绘所有输入结点前的序号重绘所有输入结点前的序号重绘所有输入结点前的序号REDRAWNUMVOIDCMYVIEWREDRAWNUMCCLIENTDCDCTHISCHARBUFFER20CPOINTPOINT/重绘所有INPUT前的序号FORINTI0INUMPOINT而数组的下标加1就为序号。所以每次重绘为了方便,将所有序号都重绘。重绘连接线重绘连接线重绘连接线重绘连接线VOIDCMYVIEWLINKLINEREDRAWCPOINTSTARTPOINT,CPOINTPOINT/将起点STARTPOINT到终点POINT扩充成一个矩形DRAWRECTCRECTDRAWRECTSTARTPOINT,POINT/RECT用于产生连接线最大矩形CRECTRECT/RECTINTER用于计算两个矩形的相交区域CRECTRECTINTER/POINT1和POINT2用于产生连接线最大矩形CPOINTPOINT1CPOINTPOINT2DRAWRECTNORMALIZERECTDRAWRECTINFLATERECT1,1/遍历MYPOINTLIST链表POSITIONPOSMYPOINTLISTGETHEADPOSITIONWHILEPOS0/PPOINTARRAY用于指向点数组对象首址CARRAYPPOINTARRAYMYPOINTLISTGETNEXTPOSPOINT1PPOINTARRAYGETAT0SWITCHPPOINTARRAYGETSIZE/分两种情况2个点和4,5个点的情况CASE2/2个点时POINT2PPOINTARRAYGETAT1BREAKDEFAULT/4,5个点时POINT2PPOINTARRAYGETAT3/用POINT1和POINT2设置矩形RECTRECTLEFTPOINT1XRECTTOPPOINT1YRECTRIGHTPOINT2XRECTBOTTOMPOINT2YRECTNORMALIZERECTRECTINFLATERECT1,1/如果两个矩形相交,则要重绘IFRECTINTERINTERSECTRECT主要的算法思想是将起点STARTPOINT到当前点POINT扩充成一个矩形DRAWRECT,然后遍历连接线链表,将每根连接线扩充成一个矩形RECT,再判断这两个矩形是否相交,若相交,则需要重绘这根连接线。连接线链表声明如下CLIST,CARRAYMYPOINTLIST链表中每个结点是一个数组对象的地址,而这个数组中每个元素是一个点。这样一个数组就表示了一根连接线,而一个链表可以遍历所以连接线。画提示连接的小圆圈函数画提示连接的小圆圈函数画提示连接的小圆圈函数画提示连接的小圆圈函数DRAWMYCIRCLEDRAWMYCIRCLEVOIDCMYVIEWDRAWMYCIRCLE/此时全局变量CIRCLEPOINT记录了要画圆圈的/而PNODENOW指向了当前的物件/将物件坐标中的CIRCLEPOINT转换成VIEW中的坐标INTX,YXPNODENOWORGPOINTXCIRCLEPOINTXYPNODENOWORGPOINTYCIRCLEPOINTYCCLIENTDCDCTHIS/创建一个黑色的画刷CBRUSHBRUSHRGB0,0,0/创建指针POLDBRUSH用于保存原来的画刷CBRUSHPOLDBRUSH/将黑色的画刷选进设备装置DC,并用POLDBRUSH保存原来的画刷POLDBRUSHDCSELECTOBJECT/画一个圆圈,圆心是X,Y/半径是4DCELLIPSEX4,Y4,X4,Y4/将原来的画刷选回DCSELECTOBJECTPOLDBRUSH由于全局变量CIRCLEPOINT保存的是元件内部的相对坐标,需要将它转换成视图中的坐标XPNODENOWORGPOINTXCIRCLEPOINTXYPNODENOWORGPOINTYCIRCLEPOINTY以上两句完成坐标的转换。然后以X,Y为圆心,4为半径,画一个黑色小圆圈DCELLIPSEX4,Y4,X4,Y4擦除小圆圈函数擦除小圆圈函数擦除小圆圈函数擦除小圆圈函数ERASERMYCIRCLEERASERMYCIRCLEVOIDCMYVIEWERASERMYCIRCLEINTX,YXPNODENOWORGPOINTXCIRCLEPOINTXYPNODENOWORGPOINTYCIRCLEPOINTYCCLIENTDCDCTHISCPENWHITEPENPS_SOLID,1,RGB255,255,255CPENPOLDPENPOLDPENDCSELECTOBJECTDCELLIPSEX4,Y4,X4,Y4DCSELECTOBJECTPOLDPEN与画小圆圈不同的是,擦除时要选择白色的笔和白色的画刷默认CPENWHITEPENPS_SOLID,1,RGB255,255,255CPENPOLDPENPOLDPENDCSELECTOBJECT以上3句选择白色的笔。鼠标移开触点重绘连接线函数鼠标移开触点重绘连接线函数鼠标移开触点重绘连接线函数鼠标移开触点重绘连接线函数MOVEOUMOVEOUTREDRAWLINE为什么需要这个函数,原因是在鼠标称出触点后,此时要擦除刚才画的小圆圈,而如果此时已经生成了连接线,则会擦除掉连接线的一小部分。于是需要这个函数。VOIDCMYVIEWMOVEOUTREDRAWLINEINTX,YXPNODENOWORGPOINTXCIRCLEPOINTXYPNODENOWORGPOINTYCIRCLEPOINTYCPOINTPOINT1CPOINTPOINT2POINT1XX4POINT1YY4POINT2XX4POINT2YY4LINKLINEREDRAWPOINT1,POINT2此时PNODENOW指向刚擦除小圆圈的元件,而CIRCLEPOINT则记录着触点中心。于是只要将以CICLEPOINT为中心的半径为4的矩形的左上角点和右下角点为参数调用LINKLINEREDRAW即可。重绘元件函数重绘元件函数重绘元件函数重绘元件函数REDRAWMYOBJECTREDRAWMYOBJECTVOIDCMYVIEWREDRAWMYOBJECTMYNODEPNODESWITCHPNODESUBTYPECASEANDGATEDRAWOBJECTPNODEORGPOINT,IDB_ANDGATEBREAKCASEORGATEDRAWOBJECTPNODEORGPOINT,IDB_ORGATEBREAKCASENOTGATEDRAWOBJECTPNODEORGPOINT,IDB_NOTGATEBREAKCASENORGATEDRAWOBJECTPNODEORGPOINT,IDB_NORGATEBREAKCASENANDGATEDRAWOBJECTPNODEORGPOINT,IDB_NANDGATEBREAKCASEXORGATEDRAWOBJECTPNODEORGPOINT,IDB_XORGATEBREAKCASEINPUTDRAWOBJECTPNODEORGPOINT,IDB_NODEINPUTBREAKCASEOUTPUTDRAWOBJECTPNODEORGPOINT,IDB_NODEOUTPUTBREAK该函数参数为指向元件的指针,用于重绘所指向的元件。N鼠标按下模块鼠标按下模块鼠标按下模块鼠标按下模块如图5图5前面已经分析了放置元件状态,现在看连接元件状态中的判断“当前点是否在某个元件未连接的触点上”其实就是判断“可连接态”ISDRAWCIRCLE是否为真。代码如下IFISDRAWCIRCLE/当前点在某个元件未连接的触点上/全局变量ISLINK表示开始连接状态ISLINKTRUE/全局变量PNODESTART记录当前物件PNODESTARTPNODENOW/全局变量STARTPOINT记录当前触点中心坐标注,此时要进行坐标转换STARTPOINTXPNODENOWORGPOINTXCIRCLEPOINTXSTARTPOINTYPNODENOWORGPOINTYCIRCLEPOINTY/全局变量STARTPUT记录当前触点类别INPUT_1,INPUT_2,OUTPUT_1STARTPUTPUT/LASTPOINT用于鼠标移动时擦除线效果LASTPOINTSTARTPOINT进行连接初始化首先开启开始连接状态ISLINKTRUE然后用全局变量PNODESTART指向当前元件PNODESTARTPNODENOW全局变量STARTPOINT记录当前触点中心坐标这时要进行坐标的转换STARTPOINTXPNODENOWORGPOINTXCIRCLEPOINTXSTARTPOINTYPNODENOWORGPOINTYCIRCLEPOINTY全局变量STARTPUT记录当前触点类别STARTPUTPUT最后LASTPOINT用于鼠标移动时擦除线效果LASTPOINTSTARTPOINTN鼠标抬起模块鼠标抬起模块鼠标抬起模块鼠标抬起模块其算法如图9图9代码如下VOIDCMYVIEWONLBUTTONUPUINTNFLAGS,CPOINTPOINT/TODOADDYOURMESSAGEHANDLERCODEHEREAND/ORCALLDEFAULTIFISLINK/首先擦除从STARTPOINT到POINTCCLIENTDCCLIENTDCTHISCCLIENTDCPDCCPENWHITEPENPS_SOLID,1,RGB255,255,255CPENPOLDPENPOLDPENCLIENTDCSELECTOBJECTCLIENTDCMOVETOSTARTPOINTCLIENTDCLINETOPOINTCLIENTDCSELECTOBJECTPOLDPEN/重绘所有输入结点前的序号REDRAWNUM/重绘连接线LINKLINEREDRAWSTARTPOINT,POINT/重绘物件LINEREDRAWSTARTPOINT,POINTIFISDRAWCIRCLE/用全局变量PNODECURRENT记录终点连接的物体PNODECURRENTPNODENOW/用全局变量CURRENTPUT记录终点连接的触点CURRENTPUTPUT/用全局变量CURRENTPOINT记录终点触点的中心坐标CURRENTPOINTXPNODENOWORGPOINTXCIRCLEPOINTXCURRENTPOINTYPNODENOWORGPOINTYCIRCLEPOINTY/ISTWOOBJECTSCANLINK函数判断两个物件是否能连接IFISTWOOBJECTSCANLINK/先擦除圆圈/ERASERMYCIRCLE没有必要,只要鼠标移开时重绘连接线就可/开始两个物件的画图连接LINELINK/开始真正连接指针连接REALLINK/关闭连接状态ISLINKFALSECVIEWONLBUTTONUPNFLAGS,POINTN判断两个元件是否可以连接判断两个元件是否可以连接判断两个元件是否可以连接判断两个元件是否可以连接BOOLCMYVIEWISTWOOBJECTSCANLINK/判断两个物件是否能连接/这两个物件分别由PNODESTART和PNODECURRENT指向/两个触点分别由STARTPUT和CURRENTPUT标识/若所指同一物件IFPNODESTARTPNODECURRENTMESSAGEBOX“连接错误自身物件不能相互连接“RETURNFALSE/输出直接结输出IFSTARTPUTOUTPUT_1RETURNFALSE/输入直接连接输入IFSTARTPUTINPUT_1|STARTPUTINPUT_2RETURNFALSE/循环连接IFSTARTPUTOUTPUT_1RETURNFALSEIFSTARTPUTINPUT_1|STARTPUTINPUT_2RETURNFALSE/如果以上情况都不发生,表示可以连接RETURNTRUE用图来表示上述几种错误同一元件不能连接同一元件不能连接同一元件不能连接同一元件不能连接图10输出端不能连接输出端输出端不能连接输出端输出端不能连接输出端输出端不能连接输出端图11输入端不能连输入端不能连输入端不能连输入端不能连接输入端接输入端接输入端接输入端图12两个元件不能循环连接两个元件不能循环连接两个元件不能循环连接两个元件不能循环连接图13N两个元件的画图连接两个元件的画图连接两个元件的画图连接两个元件的画图连接LINELINK该函数调用了RECORDLINE代码如下VOIDCMYVIEWRECORDLINE/记录两个物件之间的连接线经过的关键点/先动态生成一个数组CARRAY之对象/记录下连接线的关键点,然后将这个数组对象之地址加入到/CLIST,CARRAYMYPOINTLIST中INTX0,Y0,X1,Y1,DELTA_X,DELTA_Y/X0,Y0用于记录输出端起始点坐标/X1,Y1用于记录输入端终点坐标/DELTA_X,DELTA_Y用于记录X和Y的偏移量/一定是从输出端向输入端画线IFSTARTPUTOUTPUT_1X0STARTPOINTXY0STARTPOINTYX1CURRENTPOINTXY1CURRENTPOINTYELSEX1STARTPOINTXY1STARTPOINTYX0CURRENTPOINTXY0CURRENTPOINTYDELTA_X5/动态生成数组对象CARRAYPPOINTARRAYNEWCARRAY/根据点的位置分为三种情况2个点,4个点,5个点IFX0ADDCPOINTX0,Y0PPOINTARRAYADDCPOINTX1,Y1ELSE/4个点情况PPOINTARRAYADDCPOINTX0,Y0PPOINTARRAYADDCPOINTX0DELTA_X,Y0PPOINTARRAYADDCPOINTX0DELTA_X,Y1PPOINTARRAYADDCPOINTX1,Y1ELSEIFX0X1/两个点情况PPOINTARRAYADDCPOINTX0,Y0PPOINTARRAYADDCPOINTX1,Y1ELSE/X0X1/5个点情况IFY0ADDCPOINTX0,Y0PPOINTARRAYADDCPOINTX0,Y0DELTA_YPPOINTARRAYADDCPOINTX1DELTA_X,Y0DELTA_YPPOINTARRAYADDCPOINTX1DELTA_X,Y1PPOINTARRAYADDCPOINTX1,Y1/加入当前数组对象地址到MYPOINTLISTMYPOINTLISTADDTAILPPOINTARRAY/用数组中的点画线DRAWLINKLINEPPOINTARRAY首先保证从输出端向输入端画线,这样可以统一画线操作。然后动态生成数组CARRAYPPOINTARRAYNEWCARRAY用指针PPOINTARRAY指向该数组,用于存储连接线的关键点。连接线根据位置总共有三种线型,如下图所示1两个关键点的连接线图1424个关键点的连接线图1535个关键点的连接线图16N两个元件的指针连接两个元件的指针连接两个元件的指针连接两个元件的指针连接REALLINK其代码如下VOIDCMYVIEWREALLINK/一定是输入连接输出或输出连接输入IFSTARTPUTINPUT_1|STARTPUTINPUT_2/输入连接输出IFSTARTPUTINPUT_1PNODESTARTINPUT1PNODECURRENTELSEPNODESTARTINPUT2PNODECURRENTPNODECURRENTOUTPUT1PNODESTARTELSE/STARTPUTOUTPUT_1/输出连接输入PNODESTARTOUTPUT1PNODECURRENTIFCURRENTPUTINPUT_1PNODECURRENTINPUT1PNODESTARTELSEPNODECURRENTINPUT2PNODESTART指针连接只有两种情况输入连接输出和输出连接输入。可以用下图来表示输入端连接输输入端连接输输入端连接输输入端连接输出端出端出端出端图17输出端连接输入端输出端连接输入端输出端连接输入端输出端连接输入端图18L元件库模块元件库模块元件库模块元件库模块代码如下UINTCMYVIEWGATEFUNCTIONMYNODEPNODEUINTRESULTSWITCHPNODESUBTYPECASEANDGATERESULTPNODEINPUT1VALUEBREAKCASEORGATERESULTPNODEINPUT1VALUE|PNODEINPUT2VALUEBREAKCASENOTGATERESULTPNODEINPUT1VALUERESULT1RESULTBREAKCASENORGATERESULTPNODEINPUT1VALUE|PNODEINPUT2VALUERESULT1RESULTBREAKCASENANDGATERESULTPNODEINPUT1VALUERESULT1RESULTBREAKCASEXORGATERESULTPNODEINPUT1VALUEPNODEINPUT2VALUERETURNRESULT这里PNODE是指向当前元件的指针,根据当前元件的类型,及当前元件的输入端的值INPUT1VALUE和INPUT2VALUE注非门只有一个输入端来返回元件的输出端的值。各个门真值表如下表所示1与门输入端1输入端2输出端000010100110表12或门输入端1输入端2输出端000011101111表23非门输入端输出端0110表34与非门输入端1输入端2输出端001011101110表45或非门输入端1输入端2输出端000011101111表56异或门输入端1输入端2输出端000011101110表6L计算结果计算结果计算结果计算结果仿真仿真仿真仿真模块模块模块模块仿真模块在整个仿真器中占有最重要的作用。当在视图窗体上放置元件,连接元件后。接下工具栏开始按钮开始计算结果,进行仿真。其主要算法如图19图19代码如下VOIDCMYVIEWONBEGIN/开始计算,输出真值表/TODOADDYOURCOMMANDHANDLERCODEHERE/判断是否能够连接IFCALCULATERESULT1MESSAGEBOX“连接线路失败请检查线路“ELSE/可以连接/调用函数计算BEGINCALCULATE/生成对话框对象CMYDIALOGMYDIALOGMYDIALOGDOMODAL其中判断线路是否正确调用了CALCULATERESULT,这是仿真中最重要的函数。它的返回值是最终输出结点的值。如果返回1,说明线路有误。其具体的算法如图20CALCULATERESULT图20代码如下INTCMYVIEWCALCULATERESULT/用于从输入端开始计算输出端结果/遍历所有输入结点MYNODEPNODEMYNODEPNODENEXTPOSITIONPOSMYLISTGETHEADPOSITIONWHILEPOS0PNODEMYLISTGETNEXTPOS/判断当前结点是否是输入结点IFPNODESUBTYPEINPUTFOR/判断当前的输入结点的输出端指向的结点是否为空/如果为空,表示连接失败IFPNODEOUTPUT10/连接失败,返回1RETURN1/否则不为空/输出到它指向结点的输入端/此时要判断输入到哪个输入端INPUT1ORINPUT2PNODENEXTPNODEOUTPUT1IFPNODENEXTINPUT1PNODE/如果是输入到INPUT1PNODENEXTINPUT1VALUEPNODEOUTPUT1VALUE/输入的值,如果到了2,就可以计算进位了PNODENEXTINPUTSELSE/如果是输入到INPUT2PNODENEXTINPUT2VALUEPNODEOUTPUT1VALUEPNODENEXTINPUTS/指针跳向下一个结点PNODEPNODENEXT/判断此时是否是输出结点,如果是返回输出结点的值INPUT1VALUEIFPNODESUBTYPEOUTPUTRETURNPNODEINPUT1VALUE/判断是否可以进位,对于非门,只要有一个输入值即可INPUTS1/对于其他门,要两个输入值INPUTS2IFPNODESUBTYPENOTGATE/非门IFPNODEINPUTS1/可以进位PNODEOUTPUT1VALUEGATEFUNCTIONPNODEELSE/不能进位BREAK/跳出FORELSE/其他门IFPNODEINPUTS2PNODEOUTPUT1VALUEGATEFUNCTIONPNODEELSE/不能进位BREAK/跳出FOR/请空输入值个数INPUTS,以便下次计算PNODEINPUTS0/FOR/判断当前结点是否是输入结点/WHILEPOS0/遍历完后若没有返回,说明连接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 酒楼行政总厨聘用协议5篇
- 商场复工复产安全培训课件
- 国家事业单位招聘2025中国人民大学书院建设与管理中心招聘1人笔试历年参考题库附带答案详解
- 南部县2025上半年四川南充市南部县事业单位考调10人笔试历年参考题库附带答案详解
- 北海市2025广西互联网舆情中心招(实名编制)8人(截止5月27日)笔试历年参考题库附带答案详解
- 包河区2025年合肥包河区事业单位招聘劳务派遣人员29名笔试历年参考题库附带答案详解
- 云南省2025云南省教育后勤协会招聘1人笔试历年参考题库附带答案详解
- 上海市2025上海申康医疗卫生建设工程公共服务中心工作人员招聘1人笔试历年参考题库附带答案详解
- 2025重庆紫光国际化工有限责任公司招聘16人笔试参考题库附带答案详解
- 2025贵州茅台酒股份有限公司招聘158人笔试参考题库附带答案详解
- 2025年大学生英语六级必考词汇表全部汇编(带音标)
- 土木工程生产实习日记50篇
- GB/T 5993-2003电子设备用固定电容器第4部分:分规范固体和非固体电解质铝电容器
- FZ/T 52059-2021抗菌粘胶短纤维
- 医学课件-护理评估课件
- 幼儿园大班安全教育:《暴力玩具不能玩》 课件
- 26个英文字母大小写描红
- 养老院预算及成本管理制度
- 研学旅行基地评估认定评分表
- DL∕T 1867-2018 电力需求响应信息交换规范
- 版良性前列腺增生诊疗指南PPT
评论
0/150
提交评论