Proteus自定义元件库开发实战:从零构建TG19264A液晶仿真模型

发布时间:2026/6/5 19:40:48

Proteus自定义元件库开发实战:从零构建TG19264A液晶仿真模型 1. 项目概述为什么我们需要自建Proteus元件库在嵌入式开发尤其是单片机系统的学习和项目前期验证阶段Proteus 的电路仿真功能堪称神器。它能让我们在没有物理硬件的情况下完成从原理图设计、程序调试到系统联调的绝大部分工作极大地降低了学习门槛和项目风险。然而用久了就会发现一个痛点官方库和网络上的第三方库虽然丰富但总有覆盖不到的地方。特别是当你使用一些新型号的芯片、特定功能的模块或者一些非标准的显示器件时常常会陷入“巧妇难为无米之炊”的境地——电路逻辑都设计好了程序也写完了但仿真就是跑不起来因为找不到对应的仿真模型。这时候掌握自建 Proteus 元件库的能力就从“锦上添花”变成了“雪中送炭”。它意味着你不再受限于软件自带的资源能够将任何你需要的电子元件“搬进”虚拟世界。无论是为了验证一个冷门传感器驱动还是为了教学演示一个自定义的逻辑模块自建库都能让你彻底掌控仿真环境。本文将以一个经典的实例——为 TG19264A 点阵液晶显示器创建仿真模型——带你深入 Proteus VSM 模型开发的内核。这不是一个简单的“点击下一步”的向导而是一次从图形绘制、引脚定义到 C 代码编写、编译调试的完整旅程。我会结合自己多次“踩坑”的经验把那些官方文档语焉不详的细节、编译环境的配置陷阱、以及模型调试的实用技巧毫无保留地分享出来。无论你是正在做毕业设计的学生还是需要快速验证方案的工程师相信这篇近万字的实战记录都能为你提供一条清晰的路径。2. Proteus VSM 模型架构深度解析在动手画图写代码之前我们必须先理解 Proteus 仿真模型的运行机制。这就像盖房子要先看蓝图理解了框架后续的每一步才能知其然更知其所以然遇到问题也才知道从哪里排查。2.1 模型的双重身份电气与绘图Proteus VSM 模型的核心思想是“解耦”。它将一个元件的仿真行为拆分为两个相对独立的部分电气模型和绘图模型。这种设计非常巧妙使得模型的逻辑更加清晰也便于复用。电气模型顾名思义负责定义元件的“电学灵魂”。它决定了元件在仿真电路中的行为引脚是高电平还是低电平输入一个信号会输出什么内部有没有状态机对于数字元件它处理的是逻辑状态0、1、高阻态对于模拟元件它则要处理电压、电流和复杂的微分方程。电气模型在后台由 Proteus 的仿真引擎PROSPICE调用用户是看不见其运算过程的只能通过仿真结果如电压探针、逻辑分析仪来感知。绘图模型则负责元件的“视觉肉身”和“人机交互”。它定义了元件在 ISIS 原理图编辑器中的外观更重要的是在交互式仿真运行时它能将电气模型内部的状态比如液晶屏的显存数据、LED 的亮灭、数码管的段码实时地、图形化地展示出来。没有绘图模型元件也能仿真但你就成了一个“盲人”只能通过冰冷的数字信号来判断系统是否工作失去了仿真的直观性。一个完整的自定义元件可以只实现电气模型比如一个简单的与非门也可以两者都实现比如我们即将要做的液晶屏。TG19264A 就是一个典型的“混合信号”元件其驱动接口是数字逻辑电气模型但其最终输出是图形化显示绘图模型。2.2 通信桥梁抽象类与 DLL 导出函数那么Proteus 的仿真引擎如何与我们自己写的模型代码打交道呢答案是通过一套预先定义好的 C抽象类接口和必须实现的DLL 导出函数。抽象类接口是我们编码的“合同”。Proteus 在头文件如VSM.HPP中声明了这些纯虚类。我们要做的就是创建自己的类例如class LCD19264A并公开继承public这些抽象类然后实现里面所有纯虚函数。对于 TG19264A我们需要同时继承IACTIVEMODEL绘图模型接口和IDSIMMODEL数字电气模型接口。注意这里有一个关键选择。如果你的元件是纯模拟的如运放应继承ISPICEMODEL如果是纯数字的如 74 系列逻辑芯片应继承IDSIMMODEL如果是数模混合的如带数字控制的 DAC则应继承IMIXEDMODEL。继承错误会导致仿真引擎无法正确识别和调用你的模型。DLL 导出函数是模型 DLL 的“大门”。Proteus 在加载我们的模型 DLL 时并不会直接去实例化我们的 C 类对象因为它不知道我们的类名。它只会寻找几个特定名称的 C 风格函数。因此我们必须显式地编写这些函数并在函数内部进行“授权认证”和“创建实例”的工作。以数字模型为例必须实现以下两个函数extern C IDSIMMODEL __declspec(dllexport) * createdsimmodel (CHAR *device, ILICENCESERVER *ils) { ils-authorize(0x88888888, 0x69); // 授权码可自定义 return new MyCustomModel; // 创建你的模型类实例 } extern C VOID __declspec(dllexport) deletedsimmodel (IDSIMMODEL *model) { delete (MyCustomModel *)model; // 删除实例 }__declspec(dllexport)是 Windows 下 DLL 导出函数的关键字确保函数能被外部调用。extern “C”是为了防止 C 编译器对函数名进行修饰Name Mangling保证 Proteus 能找到名称正确的函数。授权函数ils-authorize()的第一个参数是自定义的密钥第二个是版本号这个机制可以用于商业模型的保护对于我们自用可以随意设置但务必保持创建和析构函数中的密钥一致。2.3 核心接口类功能速览理解每个接口类中关键函数的作用是编写正确模型代码的基础。下面这个表格梳理了在开发 TG19264A 这类数字绘图模型时最常用到的几个函数及其调用时机和我们的任务接口类关键函数调用时机与核心任务IDSIMMODELsetup(IINSTANCE*, IDSIMCKT*)模型生命起点。在此获取仿真引擎提供的IINSTANCE和IDSIMCKT接口指针并通过它们获取所有引脚的定义进行模型内部状态如寄存器、内存的初始化。simulate(ABSTIME, DSIMMODES)仿真的心脏。每当模型的任何输入引脚状态发生变化时此函数被调用。我们需要在这里编写核心逻辑判断使能信号、读写信号、片选信号根据时序读取输入总线数据或驱动输出总线更新内部状态如 LCD 的显存。indicate(REALTIME, ACTIVEDATA*)通信信使。在交互式仿真中每帧结束时被调用。如果电气模型有新的状态需要通知绘图模型如显存被更新了就在这里设置ACTIVEDATA数据返回TRUE从而触发绘图模型的animate()函数。IACTIVEMODELinitialize(ICOMPONENT*)绘图初始化。在此获取ICOMPONENT接口指针用于后续绘图。可以在此计算绘图区域、设置画笔颜色等。对于 LCD需要计算每个像素点在原理图上对应的实际矩形大小。animate(INT, ACTIVEDATA*)图形刷新。当indicate()函数触发后或原理图重绘时此函数被调用。在这里我们根据电气模型的最新状态如显存数据调用ICOMPONENT的绘图函数如drawbox来更新屏幕显示。plot(ACTIVESTATE)静态绘制。当元件被放置到原理图或原理图需要刷新如缩放、移动时调用。通常在这里绘制元件静态的、不随仿真变化的部分比如 LCD 的外框。理清了这些概念我们就从“纸上谈兵”进入了“实战演练”。接下来我们将严格按照开发流程一步步把 TG19264A 液晶模型从无到有构建出来。3. 从零开始创建 TG19264A 液晶元件符号在编写一行代码之前我们需要先在 Proteus 的 ISIS 环境中创建元件的“外壳”——即它的原理图符号、引脚定义和属性。这一步是为后续的模型代码提供视觉载体和电气连接点。3.1 绘制元件外形与引脚打开 Proteus ISIS首先进行绘图准备选择菜单View-Snap建议设置为10th或50th这样可以让图形和引脚对齐网格看起来更规整。绘制主体轮廓在左侧工具栏选择2D Graphics Box工具。我们需要绘制三个矩形框分别代表整体外框代表 LCD 的物理边界。显示区域框代表实际的点阵显示区域。背光区域框可选代表背光效果通常用浅色表示。 先画最大的外框再在内部画显示区域框。注意保持对齐。画完后可以右键点击图形选择Edit Properties来调整边框粗细、颜色和填充色。通常外框用黑色细线显示区域用黑色粗线无填充背光区域用浅灰色填充。标记原点这是至关重要的一步在左侧工具栏找到Markers for component origin通常是一个带十字的图标。在每个刚刚绘制的图形中心附近点击一下放置一个红色的原点标记。这个原点决定了该图形作为“符号”被调用时的参考点。在我们的代码中drawsymbol(-1)会绘制第一个原点对应的图形drawsymbol(0)和drawsymbol(1)则对应后续的原点。放置并定义引脚选择Device Pin模式在元件轮廓的侧面放置 20 个引脚。TG19264A 的典型引脚包括VCC, GND, V0对比度调节, Vee负压, LED背光阳极, D/I数据/指令选择, R/W读写选择, E使能信号, CS1/CS2/CS3三个片选对应屏幕左、中、右三块, D0-D78位数据总线。放置时可以使用旋转按钮调整引脚方向。引脚电气类型的设置是仿真正确的关键VCC, GND, V0, Vee, LED这些是电源或模拟引脚。在引脚属性中将Electrical Type设置为PP(Passive Pin在早期版本或某些情况下显示为 Power Pin)。对于纯数字仿真Proteus 可能不会处理这些引脚的模拟特性但设置正确有助于原理图检查。D/I, R/W, E, CS1, CS2, CS3这些是控制输入引脚。将Electrical Type设置为IP(Input)。D0-D7这是8位双向数据总线。将Electrical Type设置为IO(Bidirectional)。实操心得引脚名称最好与数据手册和后续代码中getdsimpin函数里使用的名称完全一致并考虑大小写兼容。例如代码中写getdsimpin(“D/I,d/i”, true)那么引脚名可以设为D/I这样无论原理图中引脚标签是D/I还是d/i模型都能正确识别。true参数表示不区分大小写。3.2 制作元件符号与器件图形和引脚都准备好后我们需要将它们打包成 Proteus 能识别的库元件。制作符号用右键拖拽框选第一个图形比如整体外框及其原点标记。然后选择菜单Library-Make Symbol。在弹出的对话框中为符号命名例如LCD19264A_CC 代表 Common公共部分。点击确定。同理框选显示区域图形及其原点制作名为LCD19264A_1的符号框选背光区域图形及其原点制作名为LCD19264A_0的符号。这样我们就有了三个可被代码调用的图形符号。制作元件框选包含所有引脚和第一个符号LCD19264A_C的完整图形。选择菜单Library-Make Device。Device Properties在Device Name中输入LCD19264A在Reference Prefix中输入LCD。其他如Device Description可以酌情填写。PCB Package如果不需要关联 PCB 封装可以直接点击 Next 跳过。Component Properties Definitions这是建立引脚名称与内部网络标签映射的关键步骤。在左侧Properties列表中添加属性。最重要的属性是MODFILE其值应设置为我们将要生成的 DLL 文件名例如LCD19264A.DLL。这样 Proteus 在仿真时才知道去加载哪个模型文件。点击Add/Edit按钮进入引脚映射界面。将原理图上的每个引脚如D/I与一个“引脚名称”关联起来。这个“引脚名称”就是代码中getdsimpin函数第一个参数使用的字符串。为了健壮性可以设置主名称和别名用逗号隔开如D/I, d/i。完成后选择一个目标器件库如USERDVC用户库保存。至此元件的“外壳”就创建好了。接下来我们要为这个外壳注入“灵魂”——用 C 编写仿真模型 DLL。4. 核心代码实现C 模型开发详解这是整个自建库过程中最具技术含量的一步。我们将基于提供的代码框架深入每一处细节解释其作用并补充关键注意事项。4.1 工程创建与环境配置首先使用 Visual Studio 以 VS2010/2015 为例创建一个新的 DLL 工程。打开 VS文件-新建-项目。选择Win32 项目给项目起名如LCD19264A。在应用程序向导中选择DLL类型并勾选空项目。环境配置关键步骤添加头文件从 Proteus 的安装目录例如C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\INCLUDE下找到VSM.HPP和VSMAPI.HPP等头文件复制到你的项目目录下。包含目录在项目属性中C/C-常规-附加包含目录添加 Proteus 的INCLUDE目录路径。这样编译器才能找到vsm.hpp。运行时库在C/C-代码生成-运行时库选择多线程 DLL (/MD)。这与 Proteus 主程序的运行时库保持一致避免冲突。导出函数确保你的创建/析构函数正确定义为导出函数如前文所述使用__declspec(dllexport)。4.2 模型类定义与成员变量在LCD19264A.h头文件中我们定义了模型类。除了继承必要的接口类成员变量的设计直接关系到模型的功能和效率。class LCD19264A : public IACTIVEMODEL, public IDSIMMODEL { private: // 接口指针 IINSTANCE *instance; // 用于访问属性、引脚 IDSIMCKT *ckt; // 数字仿真电路上下文 ICOMPONENT *component; // 用于绘图 // 引脚接口指针 IDSIMPIN *di, *rw, *en, *cs1, *cs2, *cs3; IDSIMPIN *d[8]; IBUSPIN *databus; // 将8个独立引脚映射为总线方便操作 // LCD 内部状态 BYTE x_addr, y_addr; // 当前显示RAM地址 BYTE status; // 状态寄存器本例未完全实现 BYTE cur_blk; // 当前操作的块号 (0,1,2) BYTE DDRAM[LCD_BLK_NUM][LCD_BLK_LEN * LCD_WIDTH / 8]; // 显示数据RAM BOOL new_flag; // 显示数据更新标志 // 绘图参数 BOX lcdarea; // LCD显示区域在原理图上的坐标框 float pix_width, pix_height; // 一个像素对应的绘图尺寸 };关键点解析IBUSPIN *databus这是一个非常实用的技巧。TG19264A 的数据接口 D0-D7 是8位并行总线。在simulate函数中如果每次都要单独读取8个引脚的状态再组合成字节代码会显得冗长。通过getbuspin将其映射为一个总线引脚可以直接使用getbusvalue()读取一个整数值用drivebusvalue()驱动总线输出极大简化了代码。DDRAM数组这是液晶显示内容的核心存储区。TG19264A 的显示区域被分为3块由 CS1/2/3 选择每块有 64 列Y地址和 8 行X地址对应8页每页8行像素。数组维度[3][64*64/8]正好对应了 192x64 个像素点每个BYTE存储一列中8个像素的状态1亮0灭。new_flag和BOX/pix这是连接电气模型和绘图模型的桥梁。当simulate函数向DDRAM写入新数据后设置new_flag TRUE。随后在indicate()中如果发现此标志则设置ACTIVEDATA并返回TRUE触发绘图模型的animate()函数。在animate()中根据DDRAM数据和预先计算好的pix_width/height将每个像素点绘制到原理图对应的lcdarea矩形内。4.3 电气模型核心函数实现simulate函数是数字模型的大脑它根据引脚信号的变化模拟真实芯片的时序逻辑。VOID LCD19264A::simulate(ABSTIME time, DSIMMODES mode) { BYTE data; // 1. 检测使能信号 E 的下降沿写操作结束或读操作开始 if(en-isnegedge()) { // 2. 判断是读还是写操作 if((rw-istate()SLO)||(rw-istate()WLO)) { // R/W为低写操作 // 3. 根据片选信号CS1/CS2/CS3确定当前操作的是哪一块屏幕 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; // 没有片选被激活直接返回 // 4. 从数据总线上读取当前的数据值 data (BYTE)databus-getbusvalue(); // 5. 判断是数据还是命令 if((di-istate()SHI)||(di-istate()WHI)) { // D/I为高是数据 // 6. 将数据写入当前块的DDRAM对应地址 DDRAM[cur_blk][x_addr * LCD_BLK_LEN y_addr] data; new_flag TRUE; // 标记数据已更新需要刷新显示 // 7. 自动更新地址计数器根据TG19264A数据手册 y_addr ((y_addr 1) % LCD_BLK_LEN); if(y_addr 0) { x_addr ((x_addr 1) % LCD_LINE_NUM); } } else { // D/I为低是命令 // 8. 解析命令此处简化仅处理设置地址命令 switch(data CMD_MASK) { case SET_XADDRESS: x_addr (data 0x07); // 取低3位作为X地址 break; case SET_YADDRESS: y_addr (data 0x3f); // 取低6位作为Y地址 break; // 其他命令如 DISP_ONOFF, SET_STARTLINE 本例未实现 default: break; } } } else { // R/W为高且E下降沿表示读操作结束应释放总线 databus-drivetristate(time); // 将总线驱动为高阻态 } } // 9. 检测使能信号 E 的上升沿读操作开始 else if(en-isposedge() ((rw-istate()SHI)||(rw-istate()WHI))) { // 10. 判断是读数据还是读状态 if((di-istate()SHI)||(di-istate()WHI)) { // 读数据 // ... 片选判断同上 ... // 11. 从DDRAM中读取数据到总线 data DDRAM[cur_blk][x_addr * LCD_BLK_LEN y_addr]; databus-drivebusvalue(time, data); // ... 地址自动递增 ... } else { // 读状态 databus-drivebusvalue(time, status); // 输出状态寄存器值 } } }注意事项时序逻辑是模型正确与否的生命线。isnegedge()和isposedge()用于检测边沿这模拟了单片机操作液晶时常用的“使能信号下降沿锁存数据”的时序。务必参考真实器件的数据手册来编写这部分逻辑。例如TG19264A 可能是在 E 的下降沿写入数据在 E 的高电平期间读取数据。一个错误的边沿判断会导致整个仿真行为异常。4.4 绘图模型核心函数实现animate函数负责将DDRAM中的数据“画”到屏幕上。VOID LCD19264A::animate(INT element, ACTIVEDATA *data) { BOX pix; BYTE dat, block, line, byte_off, bit_off; if(new_flag) { new_flag FALSE; component-begincache(lcdarea); // 开始图形缓存避免闪烁 // 先绘制LCD的静态背景如边框、背光效果 component-drawsymbol(1); // 绘制符号 LCD19264A_1 // 遍历所有块、所有行、所有字节、所有位 for(block 0; block LCD_BLK_NUM; block) { for(line 0; line LCD_LINE_NUM; line) { for(byte_off 0; byte_off LCD_BLK_LEN; byte_off) { dat DDRAM[block][line * LCD_BLK_LEN byte_off]; for(bit_off 0; bit_off 8; bit_off) { // 如果该位为1点亮则绘制一个矩形像素点 if(dat (1 bit_off)) { // 计算这个像素点在原理图上的精确坐标矩形 pix.x1 (int)(BLANK_WIDTH (block * LCD_BLK_LEN byte_off) * pix_width 0.5); pix.y1 -(int)(BLANK_WIDTH (line * 8 bit_off) * pix_height 0.5); // Y坐标取反 pix.x2 pix.x1 (int)(pix_width 0.5); pix.y2 pix.y1 - (int)(pix_height 0.5); // Y坐标取反 component-drawbox(pix); } } } } } component-endcache(); // 结束缓存一次性更新图形 } }坐标计算详解 这是绘图中最容易出错的部分。lcdarea是我们在initialize中通过getsymbolarea(0, lcdarea)获取的、符号LCD19264A_0所占据的矩形区域。pix_width和pix_height是每个像素的宽和高计算方式为pix_width (显示区域宽度) / LCD_LENGTHpix_height (显示区域高度) / LCD_WIDTH显示区域宽度需要减去左右空白边距BLANK_WIDTH*2和可能存在的边框线宽SYM_LINEWIDTH*2。注意ISIS 的坐标系Y轴是向下的而我们的 DDRAM 数据通常认为第一行在顶部。因此在计算pix.y1和pix.y2时我们用了负号-来进行垂直翻转或者通过调整line和bit_off的映射关系来实现确保屏幕上显示的画面与程序设定的数据一致。5. 编译、部署与仿真测试全流程代码编写完成后距离成功还差关键的“临门一脚”——编译生成 DLL 并让 Proteus 正确加载和运行。5.1 编译生成与部署编译在 Visual Studio 中按F7生成解决方案。确保编译模式是Release而不是Debug以获得更小的 DLL 文件和更好的性能。在项目输出目录通常是项目名\Release\下找到生成的LCD19264A.DLL文件。部署将生成的LCD19264A.DLL文件复制到 Proteus 的模型库目录下。这个目录通常是 Proteus 安装目录下的MODELS文件夹。例如C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\MODELS。你也可以放在自定义目录但需要确保 Proteus 能搜索到可通过系统环境变量PXLSPATH设置附加模型路径。关联确保之前在制作元件时设置的MODFILE属性值LCD19264A.DLL与复制过来的 DLL 文件名完全一致不包括路径。5.2 搭建测试电路与编写测试程序绘制测试电路在 ISIS 中新建一个原理图。从我们自建的库USERDVC中找到LCD19264A元件放置到图纸上。连接单片机添加一个单片机如 AT89C51。按照 TG19264A 的数据手册将单片机的 I/O 口与液晶的引脚正确连接P1.0-D/IP1.1-R/WP1.2-EP1.3-CS1P1.4-CS2P1.5-CS3P2口 -D0-D78位数据总线连接VCC,GNDV0可接电位器调节对比度仿真中可能不体现效果。编写测试固件使用 Keil C 新建一个工程编写针对 AT89C51 的液晶驱动代码。代码应包括初始化函数发送一系列命令设置液晶的工作模式、显示开关、起始行等。写命令/写数据函数严格按照 TG19264A 的时序E 高电平 - 设置数据/控制线 - E 产生下降沿来操作。清屏、显示字符串、画点等应用函数。在main函数中调用初始化后可以尝试向 DDRAM 的不同位置写入特定的图案数据比如全亮、棋盘格、显示一行文字以便在仿真中直观地验证模型是否正确。5.3 仿真调试与问题排查这是最考验耐心和细心的环节。点击 ISIS 中的运行按钮开始仿真。常见问题与排查技巧问题现象可能原因排查步骤仿真无法启动提示“模型加载失败”1. DLL 文件未找到。2. DLL 依赖的运行时库缺失。3. 授权函数authorize调用失败。1. 确认 DLL 在MODELS目录或PXLSPATH指定目录。2. 使用Dependency Walker工具打开 DLL检查是否有缺失的MSVCRxxx.DLL等。确保编译环境与 Proteus 运行环境一致。3. 检查createdsimmodel和createactivemodel函数中的授权码是否一致且已调用。仿真运行但液晶屏无任何显示1. 电气模型未正确响应引脚信号。2. 绘图模型animate未被调用或坐标计算错误。3. 单片机程序未正确驱动液晶。1. 在simulate函数入口添加日志输出可用instance-message()检查是否在引脚变化时被触发。2. 检查new_flag逻辑在simulate写入数据后是否置TRUEindicate函数是否返回TRUE3. 在animate函数开始添加日志确认其被调用。临时将drawbox颜色改为红色或绘制一个固定的大矩形看是否有任何图形出现以排除坐标计算错误。4. 使用 Proteus 的逻辑分析仪或虚拟终端监控单片机发出的控制信号和数据确保时序符合数据手册要求。显示错位、乱码或只有部分显示1. DDRAM 地址映射错误。2. 像素坐标计算错误。3. 片选CS1/2/3逻辑错误。1. 仔细核对 TG19264A 数据手册中 DDRAM 的地址结构X地址、Y地址、块选择与代码中的DDRAM数组索引计算是否完全对应。2. 在animate中将pix.x1, pix.y1等坐标值输出到日志与预期位置对比。检查BLANK_WIDTH,SYM_LINEWIDTH,pix_width/height的计算公式。3. 在simulate中检查cur_blk的赋值逻辑确保片选信号识别正确。总线冲突Bus Conflict模型在不应驱动总线时驱动了总线。确保在读操作结束时E下降沿且R/W为高调用databus-drivetristate(time)将总线置为高阻。这是很多初学者容易遗漏的一点。调试利器——日志输出在模型代码中可以使用instance-message()函数输出调试信息到 Proteus 的System Log窗口。这是定位问题最直接的方法。例如在simulate函数中每当写入数据时可以输出地址和数据值在animate开始时输出一条信息。通过日志你可以清晰地看到模型的内部执行流程。当你在仿真中看到液晶屏按照单片机程序的控制正确显示出预期的文字或图形时那份成就感是无与伦比的。这意味着你不仅成功创建了一个可用的仿真元件更深刻地理解了 Proteus 仿真引擎与自定义模型交互的完整链条。这个技能可以迁移到任何其他你需要的器件模型开发上从此你的仿真世界将不再有边界。

相关新闻