⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 userguide.cpp

📁 proteus实例集锦
💻 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 + -