一个Proteus制作元件的例子 - 图文 联系客服

发布时间 : 星期六 文章一个Proteus制作元件的例子 - 图文更新完毕开始阅读95d3d3e9551810a6f52486e4

VOID initialize (ICOMPONENT *cpt); //被PROSPICE调用,返回模拟电气模型

ISPICEMODEL *getspicemodel (CHAR *device); //被PROSPICE调用,返回数字电气模型

IDSIMMODEL *getdsimmodel (CHAR *device); //当原理图需要重绘时被调用

VOID plot (ACTIVESTATE state);

//当相应的电气模型产生活动事件时被调用,常用来更新图形 VOID animate (INT element, ACTIVEDATA *newstate); //用来处理键盘和鼠标事件

BOOL actuate (WORD key, INT x, INT y, DWORD flags); private:

IINSTANCE *instance; //PROSPICE仿真原始模型 IDSIMCKT *ckt; //DSIM的数字元件

ICOMPONENT *component; //ISIS内部一个活动组件对象 //引脚定义

IDSIMPIN *di; //D/I IDSIMPIN *rw; //R/W IDSIMPIN *en; //E IDSIMPIN *cs1; //CS1 IDSIMPIN *cs2; //CS2 IDSIMPIN *cs3; //CS3 IDSIMPIN *d[8]; //D0~D7 IBUSPIN *databus; //D[0..7] //LCD参数

BYTE x_addr; //X地址(见手册) BYTE y_addr; //Y地址(见手册) BYTE status; //状态(见手册)

BYTE cur_blk; //当前块号(总共分3块,见手册)

BYTE DDRAM[LCD_BLK_NUM][LCD_BLK_LEN*LCD_WIDTH/8]; //LCD显示RAM

BOOL new_flag; //新数据到达标志 //显示参数

BOX lcdarea; //LCD显示区域

float pix_width, pix_height; //每象素对应矩形的宽和高 };

CODE:

/***************************************************************** * 文件:LCD19264A.CPP * 说明:不支持以下特性 * (1) 不支持显示开关控制 * (2) 不支持设置显示起始行

*****************************************************************/ #i nclude

#i nclude \

//---------------------------------------------------------------------------- //电气模型的实现

//构造数字电气模型实例

extern \IDSIMMODEL __declspec(dllexport) * createdsimmodel (CHAR *device, ILICENCESERVER *ils) {

//授权认证

ils->authorize(0x88888888, 0x69); //版本为6.9 return new LCD19264A; //创建模型实例 }

//析构数字电气模型实例

extern \VOID __declspec(dllexport) deletedsimmodel (IDSIMMODEL *model) {

delete (LCD19264A *)model; //删除模型实例 }

//数字电路总是返回TRUE

INT LCD19264A::isdigital (CHAR *pinname) {

return 1; }

//当创建模型实例时被调用,做初始化工作

VOID LCD19264A::setup (IINSTANCE *inst, IDSIMCKT *dsim) {

instance = inst; //PROSPICE仿真原始模型 ckt = dsim; //DSIM的数字元件 //获取引脚

di = instance->getdsimpin(\true); di->setstate(FLT); //FLOAT

rw = instance->getdsimpin(\true); rw->setstate(FLT);

en = instance->getdsimpin(\true); en->setstate(FLT);

cs1 = instance->getdsimpin(\true); cs1->setstate(FLT);

cs2 = instance->getdsimpin(\true); cs2->setstate(FLT);

cs3 = instance->getdsimpin(\true); cs3->setstate(FLT);

d[0] = instance->getdsimpin(\true); d[0]->setstate(FLT);

d[1] = instance->getdsimpin(\true); d[1]->setstate(FLT);

d[2] = instance->getdsimpin(\true); d[2]->setstate(FLT);

d[3] = instance->getdsimpin(\true); d[3]->setstate(FLT);

d[4] = instance->getdsimpin(\true); d[4]->setstate(FLT);

d[5] = instance->getdsimpin(\true); d[5]->setstate(FLT);

d[6] = instance->getdsimpin(\true); d[6]->setstate(FLT);

d[7] = instance->getdsimpin(\true); d[7]->setstate(FLT);

//为方便操作,将D0~D7映射为8位总线

databus = instance->getbuspin(\d, 8); databus->settiming(100,100,100); //设置时间延迟

databus->setstates(SHI,SLO,FLT); //设置总线逻辑为[1,0,三态]时的驱动状态 //lcd model

x_addr = 0; //X地址(见手册) y_addr = 0; //Y地址(见手册) status = 0; //状态(见手册)

new_flag = TRUE; //新数据到达标志 }

//仿真运行模式控制,交互仿真中每帧开始时被调用 VOID LCD19264A::runctrl (RUNMODES mode) { }

//交互仿真时用户改变按键等的状态时被调用

VOID LCD19264A::actuate (REALTIME time, ACTIVESTATE newstate) { }

//交互仿真时每帧结束时被调用,通过传递ACTIVEDATA数据与绘图模型通信,从而调用animate()进行绘图

BOOL LCD19264A::indicate (REALTIME time, ACTIVEDATA *data) {

if(new_flag){ //有新数据到达

data->type = ADT_REAL; //call back animate() to refresh lcd

data->realval = (float)time*DSIMTICK; }

return TRUE; }

//当引脚状态变化时被调用,主要用来处理数据输入和输出

VOID LCD19264A::simulate (ABSTIME time, DSIMMODES mode) {

BYTE data;

if(en->isnegedge()){ //E的下降沿到达

if((rw->istate()==SLO)||(rw->istate()==WLO)){ //R/W为低表示写 //读块选择

if((cs1->istate()==SLO)||(cs1->istate()==WLO)) cur_blk = 0;

else if((cs2->istate()==SLO)||(cs2->istate()==WLO)) cur_blk = 1;

else if((cs3->istate()==SLO)||(cs3->istate()==WLO)) cur_blk = 2; else

return; //not select block

data = (BYTE)databus->getbusvalue(); //读数据

if((di->istate()==SHI)||(di->istate()==WHI)){ //D/I为高表示数据

DDRAM[cur_blk][x_addr*LCD_BLK_LEN+y_addr] = data; //写入数据 new_flag = TRUE; //新数据到达标志

y_addr = ((y_addr+1)%LCD_BLK_LEN); //y地址自动加1 if(y_addr==0)

x_addr = ((x_addr+1)%LCD_LINE_NUM); //自动换行 }else{ //D/I为低表示命令 switch(data&CMD_MASK) {

case DISP_ONOFF: //开关背光 break;

case SET_STARTLINE: //设置起始行 break;

case SET_XADDRESS: //设置X地址 x_addr = (data&0x07); //bit2~bit0 break;

case SET_YADDRESS: //设置Y地址 y_addr = (data&0x3f); //bit5~bit0 break; default: break; }