proteus自制元件实例
Proteus虚拟仿真案例---流水灯制作

Proteus虚拟仿真案例-——流水灯制作一、原理图设计1.打开proteus,新建文件2.选择元器件(1)选择单片机芯片左侧快捷菜单栏里按下,按下P,在“关键字”栏中输入“8951”,选择AT89C51(2)选择晶振:输入crystal,选择CRYSTAL(3)选择电容:输入22p,左边类别中选择Capacitors,右边选择CERAMIC22P(4)选择电阻:输入10k,左边类别中选择Resistors,右边选择RESISTORS库的3WATT10K(5)选择led:输入led,左边类别中选择Optoelectronics,右边选择led—yellow(6)选择按钮:输入button,选择USERDVC库的BUTTON(7)选择好的元器件如图所示3.放置器件振荡电路:(1)放置AT89C51单片机:在DEVICES栏中选中AT89C51,然后在绘制区放置到合适的位置(2)放置晶振,隐藏text属性(菜单-模板—设置设计默认值—显示隐藏文本不勾选)(3)分别将晶振的两脚与AT89C51的19、18脚相连(4)放置两个22p的电容,一端与晶振相连,另一端互连(5)放置地节点(左侧快捷菜单栏里按下—-GROUND),与两个电容相连复位电路:a.放置电源节点(左侧快捷菜单栏里按下——POWER)b.放置地节点c.放置电容,电阻,电阻一端接地,一端与电容相连,电容一端接+5V电源d.AT89C51第9脚接电阻、电容中间e.放置按钮,接电容两端f.右击按钮——编辑属性——元件参考:BUTTON,并取消“本元件不用于PCB制版”g.修改C3电容的值:右击——编辑属性—-Capacitance改为10u绘制流水灯:a.放置电阻、led,右击led——编辑属性——隐藏元件值,连接电阻和ledb.使用块复制,复制7组电阻和ledc.放置电源,分别与D1—D8的一端连接d.总线绘制:左侧选择“总线模式”,绘制一条总线,连接P1口与R2-R9e.使用属性分配工具进行快速网络标号:按下a,出现属性分配窗口,“字符串”框输入“net=D#”,单击P0口的8条线,进行编号,再次按下a,出现属性分配窗口,“字符串”框输入“net=D#”,单击R2—R9的8条线,进行编号f.批量修改R2-R9的值:按下a,出现属性分配窗口,“字符串”框输入“VALUE=100”,确定二、系统仿真1.编写源代码(1)菜单——源代码——添加/删除源文件—-new——文件名输入pmd。
Proteus 自建元件库(TG19264A点阵式液晶显示元件)

Proteus 自建元件库转自: 一、Proteus VSM仿真模型简介在使用Proteus仿真单片机系统的过程中,经常找不到所需的元件,这就需要自己编写。
Proteus VSM的一个主要特色是使用基于DLL组件模型的可扩展性。
这些模型分为两类:电气模型(Electrical Model)和绘图模型(Graphical Model)。
电气模型实现元件的电气特性,按规定的时序接收数据和输出数据;绘图模型实现仿真时与用户的交互,例如LCD的显示。
一个元件可以只实现电气模型,也可以都实现电气和绘图模型。
Proteus为VSM模型提供了一些C++抽象类接口,用户创建元件时需要在DLL中实现相应的抽象类。
VSM模型和Proteus系统通信的原理如下图:绘图模型接口抽象类:ICOMPONENT――ISIS内部一个活动组件对象,为VSM模型提供在原理图上绘图和用户交互的服务。
IACTIVEMODEL――用户实现的VSM绘图模型要继承此类,并实现相应的绘图和键盘鼠标事件处理。
电气模型接口抽象类:IINSTANCE――一个PROSPICE仿真原始模型,为VSM模型提供访问属性、模拟节点和数据引脚的服务,还允许模型通过仿真日志发出警告和错误信息。
ISPICECKT(模拟)――SPICE拥有的模拟元件,提供的服务:访问、创建和删除节点,在稀疏矩阵上分配空间,同时还允许模型在给定时刻强制仿真时刻点的发生和挂起仿真。
ISPICEMODEL(模拟)――用户实现的VSM模拟元件要继承此类,并实现相应的载入数据,在完成的时间点处理数据等。
IDSIMCKT(数字)――DSIM拥有的数字元件,提供的服务:访问数字系统的变量,创建回调函数和挂起仿真。
IDSIMMODEL(数字)――用户实现的VSM数字元件要继承此类,并实现相应的引脚状态变化的判断和回调事件的处理。
IDSIMPIN(数字)――数字组件的引脚,提供检测引脚状态和创建输出事务事件的服务。
Proteus中自己制作元件说明之欧阳体创编

Proteus 7制作元件时间:2021.02.03 创作:欧阳体在制作原理图器件前应先将器件所对应的PCB封装制作好,以便进行封装的指定。
打开Proteus 7.4 ISIS 原理图绘制软件。
单击左边工具栏中的2D Graphics Box Mode(2D图形框体模式)图标,在旁边的列表中选择“COMPONENT”画一个框。
然后单击左边工具栏中的Device Pins Mode(器件引脚模式)图标,在旁边的列表中选择“ DEFAULT”画管脚。
其中,DEFAULT表示普通引脚;INVERT表示低电平有效的引脚;POSCLK表示脉冲下降沿有效的时钟输入引脚;NEGCLK表示脉冲上升沿有效的时钟输入引脚;SHORT表示端普通引脚;BUS表示普通总线引脚。
在选择元件引脚时应根据元件引脚实际功能进行选择,注意:在摆放引脚时应将有叉的一端放在外侧,因为,那是用于连接导线用的。
当引脚放置完后,右键单击引脚,在弹出的下拉列表中选择“ Edit Properties”(即编辑属性),在弹出的对话框中输入引脚名称,引脚编号,引脚电气类型等,若不想显示引脚名称则可将“显示名称”后的对勾去掉,然后点击Next或OK退出。
将所有引脚按上述方法进行设置。
如下图所示:当所有引脚设置完成后,然后单击左边工具栏中的(选择模式)将所绘制的图形框选起来(变成红色),点击菜单栏中的Library(库),在下拉列表中选择Make Device…(制作元件),在弹出的对话框中的Device Name(器件名称)中输入器件名,例如CSI24WC02;在Reference Prefix(参考前缀)中输入引用前缀(放置器件时的默认名称),例如U ,其他保持不变,点击Next,如下图:接着点击“ADD/Edit”按钮为元件添加封装,如下图:在弹出的对话框中接着点击“Add”或直接输入封装名,如下图:在弹出的对话框中选择一个封装,然后点击确定。
PROTEUS入门实例教程3--添加电池、可调电阻、电流、电压表word资料3页

PROTEUS入门实例教程3--添加电池、可调电阻、电流、电压表1.- 新建一个文档2.- 使用Pick Devices添加以下元件(方法见例1)- BATTERY- LAMP- POT-LIN这里介绍一个更快捷的方法,就是使用Pick Devices的搜索功能(前提是你知道要找的元件的名字至少知道名字的前几个字母),该功能位于Pick Devices 对话框的左上角。
3.- 搭好以下电路POT-LIN的电阻值设为200BATTERY的电压值设为123.- 添加直流电流表和直流电压表a.- 找到这个工具条,红色圈的那个就是INSTRUMENTS(仪表元件)了。
b.- 单击这个按钮,会在The Object Selector(元件列表框)列出所有仪表,其中的DC AMMETER和DC VOLTMETER是我们要用到的,选中DC AMMETER并在原理图的适当位置单击左键,这样DC AMMETER就被放置到原理图中了。
同理放置DC VOLTMETER。
最终电路:c.- 设置DC AMMETER和DC VOLTMETER,DC AMMETER和DC VOLTMETER 不会根据电路的实际电流、电压值来自动改变量程(比如DC AMMETER默认的单位是A,它能测量的最小电流值是0.01A,如实际电路的电流值为9mA,那它就显示为0.00A),需要手动修改。
操作跟修改一般元件一样。
Display Range 有三个值A、mA、uAe.- 仿真结果。
在仿真过程中,你可以点击可调电阻POT-LIN上方的两个红色箭头来调节电阻值,这时LAMP的亮度也随之改变,DC AMMETER 和DC VOLTMETER的显示值也随之改变。
注意到了没有?!这个图好像有点特别,对了!!它就是例1后面介绍Set Animation Options中选择Show Wire Voltage by Colour?和Show Wire Current with Arrows?后的效果。
[最新]PROTEUS简单实例速成
![[最新]PROTEUS简单实例速成](https://img.taocdn.com/s3/m/a68b087c571252d380eb6294dd88d0d233d43c29.png)
例子1:简易串联电路演示为了快速掌握PROTEUS设计与仿真操作,我们先从一简单实例入手带你入门。
让我们首先来熟悉一下仿真软件的主界面:图1-1 仿真软件的主界面运行protues的ISIS模块,进入仿真软件的主界面,如图1-1所示,区域①为菜单及工具栏,区域②为元器件预览区,区域③为对象选择器窗口,区域④为编辑窗口,区域⑤为绘图工具栏,区域⑥为元器件调整工具栏,区域⑦为运行工具条。
Proteus是一种集单片机仿真和SPICE分析于一身的仿真软件。
其功能非常强大,不仅能仿真模拟电路、数字电路以及模拟数字混合电路,更重要的是可以仿真51系列、AVR、PIC等常用主流单片机。
Protues提供了丰富的资源:(1)Proteus拥有的元器件资源:Proteus可提供30多种元件库,超过8000种模拟、数字元器件。
(2)Proteus可提供的仿真仪表资源:仿真仪器仪表的数量、类型和质量是衡量仿真实验室是否合格的一个关键因素。
Proteus可提供常用的示波器(本文的实例中示波器被用来观察产生的波形)、逻辑分析仪、虚拟终端、SPI调试器、I2C调试器、信号发生器、模式发生器、交直流电压表、交直流电流表。
步骤一:PROTEUS电路设计整个设计都是在ISIS编辑区中完成的。
(1)单击工具栏上的“新建”按钮,新建一个设计文档。
单击“保存”按钮,弹出如图5-2所示的“Save ISIS Designe File”对话框,在文件名框中输入“简易串联电路演示”(简单实例的文件名),再单击“保存”按钮,完成新建设计文件操作,其后缀名自动为.DSN。
图1-2保存ISIS设计文件(2)选取元器件此简单实例需要如下元器件:直流电源:BA TTERY熔断器(保险丝):FUSE灯泡:LAMP可变电阻器:POT-HG开关:SWITCH单击图1-3中的“P”按钮,弹出如图1-4所示的选取元器件对话框,在此对话框左上角“keywords(关键词)”一栏中输入元器件名称,如“BA TTERY”,系统在对象库中进行搜索查找,并将与关键词匹配的元器件显示在“Results”中。
Proteus实例教程

本章主要内容
4.1 交通灯控制 4.2 直流可调稳压电源 4.3 数字钟 4.4 串/并行数据转换器
4.1 交通灯控制
设计任务: 在Proteus中设计一个十字路口交通灯信号控制器,要求:
(1) 主、支干道交替通行,主干道每次放行30秒,支干道每次放 行20秒;
(2) 绿灯亮表示可以通行,红灯亮表示禁止通行; (3) 每次绿灯变红时,黄灯先亮5秒(此时另一干道红灯以1Hz的
从Proteus的元件库中取变压器“TRAN-2P2S”,在原边接 交流电源“ALTERNATOR”,原副边分别接交流电压表以测量 其有效值,变压器的原副边同时接地,并与直流部分共地。
图4-4 直流稳压电源的组成
4.2.2 电路设计与仿真
1. 变压电路 直流电源通常从市电取电,把220V、50Hz的单相交流电先
降压,变成所需的交流电,然后再整流。根据桥式整流电路和电 容滤波电路的输出与输入电压的比例关系,从输出电压的最大值 37V倒推,可以算出所使用的降压变压器的副边电压有效值应为 29V左右。
《Proteus实例教程》——
第4章 电子技术课程设计
电子技术课程设计的主要目的是利用模拟电子技 术和数字电子技术理论知识,设计、仿真、制作完成 一定功能的应用电路,以加深对所学知识的理解,并 对所学知识进行扩充和完善,以提高实践动手能力。 本章利用Proteus强大的电子线路设计与仿真功能,讲 授几个典型电子技术综合课题设计与仿真过程。
(4) 用NE555及电阻、电容设计一个秒脉冲发生器。
4.1.1 电路设计
3. 元件清单列表
元件名称
表4-2 元件清单
所属类
4510
CMOS 4000 series
74LS245
Proteus制作一个元器件和添加封装

Proteus制作一个元器件
摸索了一下,发现过程很简单,主要分以下几步:
1.画元件的外形,添加注释
2.定义元件的针脚
3.定义元件的PCB封装
为了保证像我一样的初学者能够看懂,所以尽量多放图
现在我就制作一个AT89C51的复制品,命名为AT89C18. 注意两者的颜色,先画一个矩形框,然后添加引脚
完成这一步之后,选中我做的(右边的那个)右键select all objects 后边框变成红色
在点击library 选择make device
点击NEXT
点击Add/Edit
点击Add
添加封装点击OK 封装添加完成点击后变成
NEXT:
一直NEXT直到出现:
填写相应的
点击OK,你成功可!接下查看一下
可以找到相应的元器件了!。
第8章 Proteus ISIS的元件制作和层次原理图设计_3

Depth:此项为网络表输出深度选择项。
Depth的缺省模式是“Flatten”,这时, 带子页的对象将被它们的实现电路所替 代。如果没有选中“Flatten”选项,这种 替代就不会发生,而且这种带子页的对 象会出现在元件列表和网络表中。
Format:此选项是和“Output”选项配合使用
Scope:此项为范围选择项,生成网络
表的缺省范围是整个设计,即“Whole Design”选项。而“Current Sheet”选项 仅生成当前已加载页面的网络表,这通 常用于想要从子页中提取网络表的情况, 例如要做一个“子卡”,在ARES中进 行布线时这个子卡要单独设计,但它仍 然是整个设计的一部分,仍然需要仿真。
网络名可以包含文字和数字符号、减号
(-)、下划线(_),还可以用空格、感叹 号(!)和星号(*),其中感叹号(!)和星号(*) 具有特殊意义(后面将要提到)。另外, 网络名对英文字母的大小写是有区别的。
元件库中的许多芯片都有隐藏的电源引脚。网络表 生成器遇到这种情况将创建一个新的网络,并把隐 藏引脚的名字分配给它。例如,一个7400将生成两 个网络,14引脚VCC和7引脚GND。因为所有同名 网络都会被合并,所以所有同名引脚会被连到一起。 在一些设计中,特别当CMOS和TTL逻辑混合时, 用户需要将两组隐藏的电源引脚连接在一起,比如 VCC和VDD、GND和VSS。这可以通过放置两个 Generic Terminal,然后连线它们,如图8-66所示, 并用合并的网络名标识它们。例如PSU(Power Supply Unit)电路的输出端,经常要连接好几个终端。
X[0..7]
图8-74 正确的使用方法
Y[0..7]
BB1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
自制元件例一- CSI24WC02CSI24WC02是串行E2PROM,兼容400 kHz I2C 总线控制。
一个元件可以只实现绘图模型或电气模型,也可以电气和绘图模型都实现。
该例子我们只实现绘图模型。
详细信息见帮助的Styles :Component creation或Styes: Component creation部分。
管脚描述CSI24WCXX系列E2PROM提供标准的8脚DIP封装和8脚表面安装的SOIC封装。
其管脚功能描述如下:●SCL 串行时钟这是一个输入管脚用于产生器件所有数据发送或接收的时钟●SDA串行数据/地址这是一个双向传输端用于传送地址和所有数据的发送或接收它是一个漏极开路端因此要求接一个上拉电到Vcc 端典型值为100KHz 是为10K 400KHz 时为1K 对于一般的数据传输仅在SCL为低期间SDA才允许变化在SCL为高期间变化留给指示START开始和STOP停止条件●A0 A1 A2 器件地址输入端这些输入端用于多个器件级联时设置器件地址当这些脚悬空时默认值为0 CSI24WC01 除外●WP 写保护如果WP管脚连接到Vcc所有的内容都被写保护只能读当WP 管脚连接到Vss或悬空允许器件进行正常的读/写操作绘制元件●单击2D Graphics Box Mode > COMPONENT,画一个框。
●单击Device Pins Mode > DEFAULT,画管脚。
●右击引脚> Edit Properties,输入管脚名称,例如A0;输入默认管脚号,例如1,确定。
●选择所设计的图形(翻红)> Library > Make Device…,在Device Name中输入器件名,例如CSI24WC02;在Reference Prefix中输入引用前缀(放置器件时的默认名称),例如U ,其他保持不变,Next>。
●单击ADD/Edit添加封装●选择一个封装,例如DIL08,单击Assign Package(s),指派封装。
●Next●组件属性与定义,保持默认,Next>。
●器件数据手册和帮助文件定义,没有手册和帮助,略过,Next>。
●索引和库选择,单击New,输入器件目录,例如My Device,OK,OK。
完成。
现在就可以使用该元件了,从Pick Devices的目录My Device中也可以找到该元件。
自制元件例二– 7段数码管我们也可以通过改造原有器件来创建新器件,这样我们就不必从头开始创建一个新器件。
下面我们以7段共阳绿色数码管7SER-COM-AN-GRN为例创建一个新器件。
这个数码管原来不带封装,我们通过改造给它加上封装,并重新命名为新器件。
●在设计图纸上防置一个7SER-COM-AN-GRN。
●右击该器件> Decompose,分解该器件。
下面是分解后的器件。
●选择所设计的图形(翻红)> Library > Make Device…,保持Device Name中的器件名;在Reference Prefix中输入引用前缀(放置器件时的默认名称),例如D,其他保持不变,Next>。
●单击ADD/Edit添加封装1)先在Packabe Device对话框中的A列中随意输入管脚编号,例如1、2、3…(原来没有管脚编号)。
2)单击Add,选择一个封装,例如7SEG.3+A。
3)依据封装重新输入管脚编号。
4)单击Assign Package(s),指派封装。
组件属性与定义,指定默认封装为7SEG.3+A,Next>。
●器件数据手册和帮助文件定义,没有手册和帮助,略过,Next>。
● 索引和库选择,单击New ,输入器件目录,例如My Device ,OK ,OK 。
完成。
现在就可以使用该元件了,从Pick Devices 的目录My Device 中也可以找到该元件。
●如果以前图上有该器件,更新图中该器件的实例,OK 。
●将以前器件的PCB Package 属性改为7SEG .3+A ,并添加组件引用名,例如:D1。
注意:器件必须有引用名才能在ARES 中布局。
一、Proteus VSM仿真模型简介在使用Proteus仿真单片机系统的过程中,经常找不到所需的元件,这就需要自己编写。
Proteus VSM的一个主要特色是使用基于DLL组件模型的可扩展性。
这些模型分为两类:电气模型(Electrical Model)和绘图模型(Graphical Model)。
电气模型实现元件的电气特性,按规定的时序接收数据和输出数据;绘图模型实现仿真时与用户的交互,例如LCD 的显示。
一个元件可以只实现电气模型,也可以都实现电气和绘图模型。
Proteus为VSM模型提供了一些C++抽象类接口,用户创建元件时需要在DLL中实现相应的抽象类。
VSM模型和Proteus系统通信的原理如下图:绘图模型接口抽象类:ICOMPONENT――ISIS内部一个活动组件对象,为VSM模型提供在原理图上绘图和用户交互的服务。
IACTIVEMODEL――用户实现的VSM绘图模型要继承此类,并实现相应的绘图和键盘鼠标事件处理。
电气模型接口抽象类:IINSTANCE――一个PROSPICE仿真原始模型,为VSM模型提供访问属性、模拟节点和数据引脚的服务,还允许模型通过仿真日志发出警告和错误信息。
ISPICECKT(模拟)――SPICE拥有的模拟元件,提供的服务:访问、创建和删除节点,在稀疏矩阵上分配空间,同时还允许模型在给定时刻强制仿真时刻点的发生和挂起仿真。
ISPICEMODEL(模拟)――用户实现的VSM模拟元件要继承此类,并实现相应的载入数据,在完成的时间点处理数据等。
IDSIMCKT(数字)――DSIM拥有的数字元件,提供的服务:访问数字系统的变量,创建回调函数和挂起仿真。
IDSIMMODEL(数字)――用户实现的VSM数字元件要继承此类,并实现相应的引脚状态变化的判断和回调事件的处理。
IDSIMPIN(数字)――数字组件的引脚,提供检测引脚状态和创建输出事务事件的服务。
IDBUSPIN(数字)――数字组件的数据或地址总线,提供检测总线状态和创建总线输出事务事件的服务。
IMIXEDMODEL(混合)――同时继承了ISPICEMODEL 和IDSIMMODEL,元件既有模拟特性,又有数字特性。
为了让Proteus访问用户模型中的成员函数,必须创建用户模型的一个实例。
这不能通过类的接口来实现,只能通过从DLL中导出几个C函数来实现,在用户模型中必须实现这些C函数,达到构造和析构用户模型实例的效果。
(1)构造和析构绘图模型实例:IACTIVEMODEL *createactivemodel (CHAR *device, ILICENCESERVER *ils)VOID deleteactivemodel (IACTIVEMODEL *model)(2)构造和析构模拟电气模型实例:ISPICEMODEL *createspicemodel (CHAR *device, ILICENCESERVER *ils)VOID deletespicemodel (ISPICEMODEL *model)(3)构造和析构数字电气模型实例:IDSIMMODEL *createdsimmodel (CHAR *device, ILICENCESERVER *ils)VOID deletedsimmodel (IDSIMMODEL *model)(4)构造和析构混合电气模型实例:IMIXEDMODEL *createmixedmodel (CHAR *device, ILICENCESERVER *ils)VOID deletemixedmodel (IDSIMMODEL *model)二、Proteus VSM仿真模型开发流程1.绘制元件图形、引脚和相关符号。
2.制作元件,设置元件属性。
3.用C++编写元件,实现电气和绘图模型,编译生成DLL。
4.搭建电路仿真测试。
三、VSM模型开发实例下面以TG19264A点阵式液晶显示元件的开发为实例详细讲解开发过程。
1.打开Proteus,选择菜单查看>>Snap 10 th,选择左边绘图工具栏的2D graphics box,绘制如图所示的三个图形。
2.选择2D graphics line,给出两条直线,设置width为36th,颜色为灰色。
选择2D graphics circle,给四个角绘制安装孔。
选择Markers for component origin,给三个图形分别绘图符号原点(图中红色部分)。
3.选择Device pin,顺时针旋转90度,放置20个引脚,如图所示。
GND、VCC、V0、Vee、LED+的电气类型选择PP-Power Pin,D/I、R/W、E、CS1、RET、CS2、CS3的电气类型选择IP-Input,D0~D7的电气类型选择IO- Bidirectional。
4.右键拖出选择框选择第一个符号,选择菜单库>>制作符号,命名为LCD19264A_C,确定。
同理,第二和第三个分别命名为LCD19264A_1 和LCD19264A_0。
当用户调用drawsymbol (-1),将绘制LCD19264A_C,调用drawsymbol (1),将绘制LCD19264A_1,调用drawsymbol (0),将绘制LCD19264A_0。
5.右键拖出选择框选择符号LCD19264A_C,选择菜单库>>制作元件,Device Properties 设置如图,点击Next>。
跳过封装设置,点击Next>。
组件属性设置如图,点击Next>。
选择数据手册(可选),点击Next>。
选择器件库,点击OK。
6.打开VC,新建工程,选择Win32 Dynamic-Link Library,给工程命名,建立空的DLL 工程。
从Proteus安装目录的INCLUDE文件夹中将VSM.HPP复制到当前工程目录,新建文件LCD19264A.H和LCD19264A.CPP,编写如下代码。
CODE:/****************************************************************** 文件:LCD19264A.H* 说明:不支持以下特性* (1) 不支持显示开关控制* (2) 不支持设置显示起始行*****************************************************************/#i nclude "vsm.hpp"//LCD常量#define LCD_BLK_NUM 3 //lcd block number#define LCD_BLK_LEN 64 //lcd block length#define LCD_LINE_NUM 8 //lcd line number#define LCD_LENGTH (LCD_BLK_LEN*LCD_BLK_NUM) //lcd length#define LCD_WIDTH 64 //lcd width#define BLANK_WIDTH 50 //the width of blank#define SYM_LINEWIDTH 28 //the width of symbol line//LCD命令掩码#define CMD_MASK 0xc0//LCD命令#define DISP_ONOFF 0x00 //开关背光#define SET_STARTLINE 0xc0 //设置起始行#define SET_XADDRESS 0x80 //设置X地址#define SET_YADDRESS 0x40 //设置Y地址//延时常量#define DELAY_1s 1000000000000#define DELAY_1ms 1000000000#define DELAY_1us 1000000#define DELAY_1ns 1000#define DELAY_1ps 1/*LCD元件既有数字电气特性,也有绘图特性,所以要继承IACTIVEMODEL和IDSIMMODEL */class LCD19264A : public IACTIVEMODEL,public IDSIMMODEL{public:/* 电气模型成员函数*///数字电路总是返回TRUEINT isdigital (CHAR *pinname);//当创建模型实例时被调用,做初始化工作VOID setup (IINSTANCE *inst, IDSIMCKT *dsim);//仿真运行模式控制,交互仿真中每帧开始时被调用VOID runctrl (RUNMODES mode);//交互仿真时用户改变按键等的状态时被调用VOID actuate (REALTIME time, ACTIVESTATE newstate);//交互仿真时每帧结束时被调用,通过传递ACTIVEDATA数据与绘图模型通信,从而调用animate()进行绘图BOOL indicate (REALTIME time, ACTIVEDATA *data);//当引脚状态变化时被调用,主要用来处理数据输入和输出VOID simulate (ABSTIME time, DSIMMODES mode);//可通过setcallback()设置在给定时间调用的回调函数VOID callback (ABSTIME time, EVENTID eventid);/* 绘图模型成员函数*///当创建模型实例时被调用,做初始化工作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/IIDSIMPIN *rw; //R/WIDSIMPIN *en; //EIDSIMPIN *cs1; //CS1IDSIMPIN *cs2; //CS2IDSIMPIN *cs3; //CS3IDSIMPIN *d[8]; //D0~D7IBUSPIN *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 <string.h>#i nclude "LCD19264A.h"//----------------------------------------------------------------------------//电气模型的实现//构造数字电气模型实例extern "C" IDSIMMODEL __declspec(dllexport) * createdsimmodel (CHAR *device, ILICENCESERVER *ils){//授权认证ils->authorize(0x88888888, 0x69); //版本为6.9return new LCD19264A; //创建模型实例}//析构数字电气模型实例extern "C" VOID __declspec(dllexport) deletedsimmodel (IDSIMMODEL *model) {delete (LCD19264A *)model; //删除模型实例}//数字电路总是返回TRUEINT LCD19264A::isdigital (CHAR *pinname){return 1;}//当创建模型实例时被调用,做初始化工作VOID LCD19264A::setup (IINSTANCE *inst, IDSIMCKT *dsim){instance = inst; //PROSPICE仿真原始模型ckt = dsim; //DSIM的数字元件//获取引脚di = instance->getdsimpin("D/I,d/i", true);di->setstate(FLT); //FLOATrw = instance->getdsimpin("R/W,r/w", true);rw->setstate(FLT);en = instance->getdsimpin("E,e", true);en->setstate(FLT);cs1 = instance->getdsimpin("CS1,cs1", true);cs1->setstate(FLT);cs2 = instance->getdsimpin("CS2,cs2", true);cs2->setstate(FLT);cs3 = instance->getdsimpin("CS3,cs3", true);cs3->setstate(FLT);d[0] = instance->getdsimpin("D0,d0", true);d[0]->setstate(FL T);d[1] = instance->getdsimpin("D1,d1", true);d[1]->setstate(FL T);d[2] = instance->getdsimpin("D2,d2", true);d[2]->setstate(FL T);d[3] = instance->getdsimpin("D3,d3", true);d[3]->setstate(FL T);d[4] = instance->getdsimpin("D4,d4", true);d[4]->setstate(FL T);d[5] = instance->getdsimpin("D5,d5", true);d[5]->setstate(FL T);d[6] = instance->getdsimpin("D6,d6", true);d[6]->setstate(FL T);d[7] = instance->getdsimpin("D7,d7", true);d[7]->setstate(FL T);//为方便操作,将D0~D7映射为8位总线databus = instance->getbuspin("LCD_DBUS", d, 8);databus->settiming(100,100,100); //设置时间延迟databus->setstates(SHI,SLO,FLT); //设置总线逻辑为[1,0,三态]时的驱动状态//lcd modelx_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 lcddata->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;elsereturn; //not select blockdata = (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地址自动加1if(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~bit0break;case SET_YADDRESS: //设置Y地址y_addr = (data&0x3f); //bit5~bit0break;default:break;}}}else{ //E的下降沿到达,R/W为高表示读结束databus->drivetristate(time); //驱动总线为三态}}else if(en->isposedge() //E的上升沿到达&& ((rw->istate()==SHI)||(rw->istate()==WHI))){ //R/W为高表示读if((di->istate()==SHI)||(di->istate()==WHI)){ //D/I为高表示数据//读块选择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;elsereturn; //not select blockdata = DDRAM[cur_blk][x_addr*LCD_BLK_LEN+y_addr];databus->drivebusvalue(time, data); //输出数据y_addr = ((y_addr+1)%LCD_BLK_LEN); //y地址自动加1if(y_addr==0)x_addr = ((x_addr+1)%LCD_LINE_NUM); //自动换行}else{ //D/I为低表示命令databus->drivebusvalue(time, status); //输出状态}}}//可通过setcallback()设置在给定时间调用的回调函数VOID LCD19264A::callback (ABSTIME time, EVENTID eventid){}//----------------------------------------------------------------------------//绘图模型的实现// Exported constructor for active component models.extern "C" IACTIVEMODEL __declspec(dllexport) * createactivemodel (CHAR *device, ILICENCESERVER *ils){ils->authorize (0x88888888,0x69); //6.9return new LCD19264A;}// Exported destructor for active component models.extern "C" VOID __declspec(dllexport) deleteactivemodel (IACTIVEMODEL *model) {delete (LCD19264A *)model;}//当创建模型实例时被调用,做初始化工作VOID LCD19264A::initialize (ICOMPONENT *cpt){//获取ICOMPONENT接口和初始化component = cpt;component->setpenwidth(0);component->setpencolour(BLACK);component->setbrushcolour(BLACK);//获取显示区域component->getsymbolarea(0,&lcdarea);//计算每象素对应矩形的宽和高pix_width = (float)(lcdarea.x2-lcdarea.x1-BLANK_WIDTH*2-SYM_LINEWIDTH*2)/LCD_LENGTH;pix_height = (float)(lcdarea.y2-lcdarea.y1-BLANK_WIDTH*2-SYM_LINEWIDTH*2)/LCD_WIDTH;}//被PROSPICE调用,返回模拟电气模型ISPICEMODEL *LCD19264A::getspicemodel (CHAR *){return NULL;}//被PROSPICE调用,返回数字电气模型IDSIMMODEL *LCD19264A::getdsimmodel (CHAR *){return this;}//当原理图需要重绘时被调用VOID LCD19264A::plot (ACTIVESTATE state){//绘制LCD19264A_C元件基本图形component->drawsymbol(-1);//刷新LCD数据显示new_flag = TRUE;animate (0, NULL);}//当相应的电气模型产生活动事件时被调用,常用来更新图形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); //打开缓冲component->drawsymbol(1); //显示LCD19264_1符号//显示各点数据for(block=0; block<LCD_BLK_NUM; block++){ //blockfor(line=0; line<LCD_LINE_NUM; line++){ //linefor(byte_off=0; byte_off<LCD_BLK_LEN; byte_off++){ //line offdat = DDRAM[block][line*LCD_BLK_LEN+byte_off]; //get byte datafor(bit_off=0; bit_off<8; bit_off++){if(dat&(1<<bit_off)){ //bit=1pix.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);pix.x2 = pix.x1 + (int)(pix_width+0.5);pix.y2 = pix.y1 - (int)(pix_height+0.5);component->drawbox(pix); //绘制1个象素点}}}}}component->endcache(); //结束缓冲,显示数据}}//用来处理键盘和鼠标事件BOOL LCD19264A::actuate (WORD key, INT x, INT y, DWORD flags) {return FALSE;}7.搭建电路如下电路,新建Keil C工程,编写代码测试元件。