📄 userguide.cpp
字号:
#include "stdafx.h"
#include "NEWUG.h"
#include "USERGUIDE.h"
#include "shellapi.h"
#include "WinDef.h"
#include "atlstr.h"
IMPLEMENT_DYNAMIC(USERGUIDE, CWnd)
extern "C" IDSIMMODEL __declspec(dllexport) * createdsimmodel (CHAR *device, ILICENCESERVER *ils)
{
ils->authorize(0x10000A00,0x72);//授权码
return new USERGUIDE;//数字模型器件必须这么输出,USERGUIDE和器件的名字必须一致
}
extern "C" VOID __declspec(dllexport) deletedsimmodel (IDSIMMODEL *model)
{
delete (USERGUIDE *)model;//停止仿真时删除对象
}
extern "C" IACTIVEMODEL __declspec(dllexport) * createactivemodel (CHAR *device, ILICENCESERVER *ils)
{
ils->authorize(0x10000A00,0x72);
return new USERGUIDE;//凡是需要交互操作动态显示的都要这么干
}
extern "C" VOID __declspec(dllexport) deleteactivemodel (IACTIVEMODEL *model)
{
delete (USERGUIDE *)model;
}
USERGUIDE::USERGUIDE()
{
m_Tip=new CTip;//在proteus仿真开始的时候,构造器件,然后我们在最初的
//构造函数中显示那个向导对话框,但必须是无模式对话框,有模式对话框程序就停在
//那里了,等你操作,除非按下OK
//上面这个语句只是在内存中构造无模式对话框对象
m_Tip->Create(IDD_DIALOG1);//现在是要创建出来,符合IDD_DIALOG1那个模板的样子
m_Tip->ShowWindow(SW_SHOW);//最后显示
}
USERGUIDE::~USERGUIDE()
{
//正常情况下,仿真结束自动调用析构函数(就是销毁,释放内存,做一些清理工作)
CString WindowName("“51开发板典藏版”集成调试器");//如果那个Wizard还在运行,找到它的句柄
HWND handle=::FindWindow(NULL,WindowName);
if(handle!=NULL)
{
::PostMessage(handle,WM_CLOSE,NULL,NULL);//关掉
}
m_Tip->DestroyWindow();//删除向导对话框,必须的,否则那个对话框没有根了,windows马上给你颜色看
}
BEGIN_MESSAGE_MAP(USERGUIDE, CWnd)
END_MESSAGE_MAP()
// USERGUIDE 消息处理程序
INT USERGUIDE::isdigital (CHAR *pinname)
{
return 1;//数字器件返回1,必须这么写
}
VOID USERGUIDE::setup (IINSTANCE *inst, IDSIMCKT *dsim)
{
//proteus会调用这些函数(其实还应该说得更明白点,是Proteus的哪个部分调用,是ISIS)
//还是Prospice,原谅,现在思维混乱
instance=inst;//inst是调用时给你的"实例",这个"实例"代表器件对象,你要把它保存起来
//在别的地方用,它是指针,指向器件的内存空间
PINCLK=instance->getdsimpin("CLK",0);//找到CLK引脚
PINDATA[0]=instance->getdsimpin("D0",0);//找到DO引脚
PINDATA[1]=instance->getdsimpin("D1",0);
PINDATA[2]=instance->getdsimpin("D2",0);
PINDATA[3]=instance->getdsimpin("D3",0);
PINDATA[4]=instance->getdsimpin("D4",0);
PINDATA[5]=instance->getdsimpin("D5",0);
PINDATA[6]=instance->getdsimpin("D6",0);
PINDATA[7]=instance->getdsimpin("D7",0);
PINOUT[0]=instance->getdsimpin("Q0",0);//找到Q0引脚,引脚名称是造器件时自己定的
PINOUT[1]=instance->getdsimpin("Q1",0);
PINOUT[2]=instance->getdsimpin("Q2",0);
PINOUT[3]=instance->getdsimpin("Q3",0);
PINOUT[4]=instance->getdsimpin("Q4",0);
PINOUT[5]=instance->getdsimpin("Q5",0);
PINOUT[6]=instance->getdsimpin("Q6",0);
PINOUT[7]=instance->getdsimpin("Q7",0);
ckt=dsim;//dsim代表器件的数字模型,保存
}
VOID USERGUIDE::runctrl (RUNMODES mode)
{
}
VOID USERGUIDE::actuate (REALTIME time, ACTIVESTATE newstate)
{
}
BOOL USERGUIDE::indicate (REALTIME time, ACTIVEDATA *data)
{
return TRUE;
}
VOID USERGUIDE::simulate (ABSTIME time, DSIMMODES mode)
{
//proteus会不断地调用这些函数,来完成电气功能
if((PINCLK->isposedge())==TRUE)//判断上升沿来了没有。来了执行代码,否则白了一趟
{
int i;
int out[8]={1,1,1,1,1,1,1,1};
STATE state;
RELTIME tg=1000;
data=255;
unsigned char mask[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
for(i=0;i<8;i++)
{
state=PINDATA[i]->istate();//执行循环,取得8个输入的状态
if(islow(state))
{
data=data&mask[i];//如果是低电平,就屏蔽那一位,否则不变
//看看前面的初始值算算就明白了
out[i]=0;//out代表8个输出
}
}
for(i=0;i<8;i++)
{
if(out[i]==1)
{
PINOUT[i]->setstate(time,tg,SHI);//循环8次,输出数据
//我实现的这个器件就是74374,只是没有OE的功能
//这个循环可以和上面的合并
//我写代码的时候,思维混乱了,给分家了
}
else
{
PINOUT[i]->setstate(time,tg,SLO);
}
}
CString WindowName("“51开发板典藏版”集成调试器");
HWND handle=::FindWindow(NULL,WindowName);//查找是否有Wizard在运行,有的
//话handle不是NULL,否则是NULL。留着handle以后用
CString Operation("open");
CString ProgramName("Wizard.exe");
CString Wizardparameter("-Run by Proteus");
int ret=0;
HINSTANCE hInst;
//以下就是根据8051传来的数据来做不同的事情
switch (data)
{
case 0x80://命令80什么都不作
break;
case 0x81:
instance->message("欢迎欢迎,热烈欢迎!欢迎欢迎,热烈欢迎!");
break;
case 0x82:
ExitProcess(0);//关闭Proteus
//本来不想这么野蛮,硬关的。
//本想停下仿真就可以的,试验了没能成功。
//我可以让Proteus暂停,但是不能让它停
break;
case 0x83:
if(handle!=NULL)
{
break;//如果刚才找的wizard存在的话,那么让它继续存在
}
//不存在的话打开一个
hInst=ShellExecute(NULL,Operation,ProgramName,Wizardparameter,NULL,SW_SHOW);
break;
case 0x84:
break;
case 0x85:
break;
case 0xC0:
//m_Tip是那个向导类的内存地址,根据不同的命令以不同参数调用SetTip,SetTip
//根据不同的参数显示不同字符串
m_Tip->SetTip(0);
break;
case 0xC1:
m_Tip->SetTip(1);
break;
case 0xC2:
m_Tip->SetTip(2);
break;
case 0xC3:
m_Tip->SetTip(3);
break;
case 0xC4:
m_Tip->SetTip(4);
break;
case 0xC5:
m_Tip->SetTip(5);
break;
case 0xC6:
m_Tip->SetTip(6);
break;
case 0xC7:
m_Tip->SetTip(7);
break;
case 0xC8:
m_Tip->SetTip(8);
break;
case 0xC9:
m_Tip->SetTip(9);
break;
case 0xCA:
m_Tip->SetTip(10);
break;
case 0xCB:
m_Tip->SetTip(11);
break;
case 0xCC:
m_Tip->SetTip(12);
break;
case 0xCD:
m_Tip->SetTip(13);
break;
case 0xCE:
break;
case 0xCF:
m_Tip->SetTip(-1);
break;
case 0xFD:
CTip::RESET=FALSE;
m_Tip->MySetText();//如果选择从动的话简单地刷新向导窗口的颜色
break;
case 0xFE:
if(handle!=NULL)
{
::PostMessage(handle,WM_CLOSE,NULL,NULL);
//如果意外复位之后选择的是主动模式,关掉Wizard
break;
}
CTip::RESET=FALSE;//并恢复为非复位状态
m_Tip->MySetText();//刷新向导窗口的颜色
break;
case 0xFF://如果复位,就会弹出这个
//复位之后,8051传0xFF
MessageBox(_T("警告!AT89C52进入复位状态!\
\n此复位很可能是程序设计缺陷造成。如果Wizard程序仍在运行,\
\n不要按任何按钮。请先按电路图上的键盘选择运行模式。如果选\
\n择的不是从动模式,自动关闭Wizard程序!"),NULL,MB_OK);
CTip::RESET=TRUE;
m_Tip->MySetText();
break;
default:
break;
}
}
}
VOID USERGUIDE::callback (ABSTIME time, EVENTID eventid)
{
}
VOID USERGUIDE::initialize (ICOMPONENT *cpt)
{
component = cpt;
component->getsymbolarea(0,&Drawarea);
}
ISPICEMODEL *USERGUIDE::getspicemodel (CHAR *)
{
return NULL;
}
IDSIMMODEL *USERGUIDE::getdsimmodel (CHAR *)
{
return this;
}
VOID USERGUIDE::plot (ACTIVESTATE state)
{
component->drawsymbol(0);
}
VOID USERGUIDE::animate (INT element, ACTIVEDATA *data)
{
component->drawsymbol(0);
}
BOOL USERGUIDE::actuate (WORD key, INT x, INT y, DWORD flags)
{
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -