创建基于DLL的Proteus仿真模型
Proteus软件仿真教程

Proteus软件仿真教程我的毕业论文(二):Keil软件的基本用法2007年07月02日星期一 13:11Keil μVision是Keil公司(ARM子公司)开发的一款用于MCS-51单片机开发的应用十分广泛的编译和调试软件。
该软件可以编辑、编译汇编语言、C51语言,连接定位目标文件和库文件,创建HEX文件,调试目标程序等。
Keil软件功能强大,包含很多部分,本文我们主要使用Keil μVision来开发C51项目、调试程序并生成HEX文件来用于单片机开发。
Keil μVision是一款在Windows下使用的集成开发环境,目前最新版本为V3,本文中我们为了简便选用V2.0。
下面我们就来熟悉一下Keil软件。
首先安装软件,它的安装与MedWin一样简单,我们不做过多介绍。
安装完成后,我们就可以使用软件了,打开软件,我们可以看到其界面,如下图所示:下面我们就来使用Keil软件开发我们的第一个项目。
点击“Project”(工程)菜单下面的“New Project”(新建工程),我们来新建一个工程。
软件弹出“Create New Project”(创建新工程)窗口。
如下图所示: prova mitjanes, ?per punts d'experiència. Mòdul de compressió Es de veure de deformació cohesionada terra, sorra per EO. 3, la distribució de les aigüessubterrànies: 3.1, el camp lloc tipus medi ambient classe II. Segons hidrològica geològic dos o tres capa sòl per clay llim, quatre capa de llim General subterrània enterrat, tipus d'aigua subterrània és quart porus Departament submarinisme, enquesta durant nivell estable d'aigua subterrània de llocs mesurat enterrat profundament 1.10 ~ 2.30 m, principal p er precipitació de l'atmosfera i aigües superficials de Xia infiltració subministraments, per evaporació i l'escorrentia metro per manera d'excreció principals; nivell freàtic amb temporada canvia la gamma més evident (canvis anys rang 0,50 ~ 1.50 m), ha r ecuperat Feng la temporada de l'aigua nivell pot lleugerament. 3.2, basat en laexperiència regional i resultats de prova de penetració coberta, lloc II clip llim capes de coeficients de permeabilitat franc argila per argila1x10-4cm/s, de franc interbedded amb coeficients de permeabilitat llims ? per K=6.0x10-4~1.0x10-3cm/s, permeabilitat de franc experiència negra capa valors de coeficient de 6 x 10-3 cm/s. Precipitació negre franc impacte radi és de 253.33 m, per tant, construcció ha de ser uadvantages, facing the Yangtze River Delta, Pearl River Delta, Shandong peninsula, Beijing-Tianjin-Tangshan area, targeted investment promotion several times. Industry-led unit and various town streets are developingdetailed promotion plans, the basis of what is specific to each industry, has formed a kind of scale, need to bring in the kind of projects each town street has the kind of resources, what location, focus on thedevelopment of the kind of industries. Four stroke technology and science. Determinants of technology is the County's economic development through scientific and technological innovation, improve product value-added and improve economic competitiveness, is the inevitable way to achieve leapfrog development. Talent is the city center city's first resource, is the primary industry development, and revitalization of the social protection. So, in terms of skills: to catch ... Competitive. Encouraging enterprises to actively undertake science and technology projects, strengthening research cooperation, using advanced technology to increase the added value of their products to ensure thatintroduction of transforming scientific and technological achievements during the year ... ... New research enterprises ... ... Home, creating innovative platforms ... ... Generic classifier. In: first, we must strengthen the cultivation of talent, efforts to increase vocational education and training and meet the basic demand of enterprise development. Then introduced a number of the county needed scarce education, health professionals, meet social development needs to invest more in machinery, pharmaceutical manufacturing research and development in higher education, such as the introduction of talent to meet the need. Third, we must rely on ... ... Post-doctoral workstation, ... ... Food research station platform, to the XX University to find experts我们为工程输入文件名后,点击“保存”按钮,软件将弹出“SelectDevice for Target”(选择MCU)窗口,如下图所示。
Proteus电路仿真快速入门GDL

(3)电阻
电阻的分类为“Resistors”,子类有0.6W和2W的金属膜电阻、3W、 7W和10W绕线电阻、通用电阻、热敏电阻(NTC)、排阻(Resistors Packs)、可变电阻(Variables)及家用高压系列加热电阻丝。常用电阻可直 接输入通用电阻“RES”即可,然后再修改参数。
交互式仿真实例一(模拟电路)
激励源
电压探针 虚拟示波器
仿真时的示波器窗口
交互式仿真实例二(单片机电路)
CPU运行游戏程序
游戏显示屏(LCD)
引脚逻辑状态显示
游戏手柄 (可映射到PC键盘上)
高级仿真(ASF)实例(放大电路分析)
模拟分析:用于绘制一条或多条电压或电流
随时间变化的曲线。
频率分析:用于分析电路的频率特性
仿真工具-激励源
DC:直流电压源; Sine:正弦波发生器。 Pulse:脉冲发生器。 Exp:指数脉冲发生器。 SFFM:单频率调频波信号发生器。 Pwlin:任意分段线性脉冲信号发生器。 File:File信号发生器。数据来源于
ASCII文件。 Audio:音频信号发生器。数据来源于
Proteus电路仿真快速入 门GDL
1.PROTEUS简介 2.PROTEUS ISIS的特点 3.PROTEUS电路仿真方法 4.常用元件介绍
元件库、符号库管理* 5.仿真实例
实例一:RC桥式振荡器 实例二:数字电路彩灯 实例三:单管共射放大器 实例四:差动放大器 实例五:直流稳压电源
创建Proteus原理图仿真模型的制作技术

Proteus是英国Labcenter electronics公司研发的EDA工具软件。
Proteus不仅是模拟电路、数字电路、模/数混合电路的设计与仿真平台;更是目前世界上最先进的多种型号微控制器(单片机)应用系统的设计与仿真平台。
Proteus提供了众多的信号源,使用者还可构建信号;提供了数字示波器、逻辑分析仪、I2C 调试器、SPI调试器等十几种虚拟仪器;提供了可作精确测量与分析(例傅里叶分析、噪声分析等)的Proteus高级图表仿真(ASF)。
所以,Proteus也是检测、测试与分析的平台。
正因如此,Proteus在电类教学、单片机应用产品研发、科研及测试技术中都获得了愈来愈广泛的应用。
Proteus在全世界拥有越来越多的使用者。
例如:Motorola、Philips、Sony等企业;Cambridge University(剑桥大学)、Stanford University(斯坦福大学)、香港理工大学、中山大学等高等院校。
Proteus元器件仿真模型库是应用Proteus设计与实现实时、交互、动态仿真的基础。
Proteus有6 000多个各种类型的仿真模型。
一般可将他们分为4类:原型模型(Primitive Models);原理图模型(Schematic Models);VSM模型(VSM Models);SPICE模型(SPICE Models)。
虽然Proteus仿真模型库相当丰富,但仍有不能满足应用的情况。
这就需要自己创建模型来丰富Proteus库。
本文以创建6位D/A转换器和TTL7458原理图模型实例论述创建原理图仿真模型方法,存库与调用方法。
如图1所示。
1 Proteus创建模型流程创建原理图模型同创建其他模型大致相同,其流程也大致一样。
如图1所示。
在创建模型中,若无需设计元器件封装,则可跳过与设计封装有关的步骤;若无需设计模型内电路,则可跳过与内电路有关的步骤。
2 创建6位数/模转换器(本文命名DA6,原Proteus库中无此模型)2.1 绘制原理图符号在Proteus ISIS中选择2D工具绘制DA6的原理图符号,如图2所示。
Proteus8.6SP2仿真使用汇总

目录:一、设置仿真环境与操作1、设置整体仿真环境2、设置模拟仿真选项3、常用操作二、图标含义与绘图1、逻辑探针图标2、逻辑状态图标3、示波器图标4、交流VSINE图标5、Probes探针图标6、电源图标7、Counter Timer图标检测频率10、修改网表和电子元件属性11、生成BOM12、总线标注三、通用电子元件1、通用电子元件列表2、以文本形式查看与修改元件属性四、交互式VSM仿真1、信号发生器1)PULSE图标产生波形 2)SFFM图标产生两个正弦波的调制波 3)PWLIN图标产生自定义波形五、图表式仿真1、图表仿真使用的信号源介绍2、图表仿真的一些操作六、单片机仿真1、Proteus作为独立的调试器1)Keil编译环境设置输出Proteus可调试文件2)Proteus中相关操作3)常用调试文件格式2、Proteus作为在路模拟器ICE(In-Circuit Emulator)1)官网下载链接程序链接Keil与Proteus 2)通过VDM51.dll链接Keil与Proteus 3)使用VDMAGDI.EXE链接Keil与Proteus3、添加hex文件到单片机七、仿真模型及其创建1、Primitive Models2、Schematic Models1)绘制图形2)创建元件3)模型的创建3、VSM Models4、SPICE Models5、元件模型的介绍八、调试跟踪九、仿真错误处理1、出现元件错误提示2、Gmin stepping failed和too many iterations without convegence(不收敛的迭代次数太多)3、置放电压探针,仿真显示“1.#QNAN”4、仿真中Digital Oscilloscope数字示波镜无显示的处理5、多谐振荡器无法起振十、仿真实例讲解1、分等级与参数化电路设计2、伺服电机控制-------------------------------------------下面的讲述基于Proteus 8.6 SP2 Professional版本WIN7/32位系统,此软件下载搜索我的百度网盘“Proteus 8.6 SP2 Professional 使用良好”。
PROTEUS仿真教程

PROTEUS仿真教程第一步:安装PROTEUS软件第二步:创建新项目在PROTEUS软件中,您可以创建新项目来开始您的电路仿真工作。
点击菜单栏中的“File”选项,选择“New Project”来创建一个新项目。
然后输入项目的名称并选择保存路径。
第三步:添加元件在PROTEUS软件中,您可以通过“Library”选项来选择各种电子元件,包括电阻、电容、电压源等。
点击“Library”选项,选择您需要的元件并将其拖动到工作区中。
连接元件之间的引脚以搭建电路。
第四步:设置仿真参数在搭建完电路后,您需要设置仿真参数。
点击菜单栏中的“Graph”选项,选择“Set Simulator Parameters”来设置仿真参数,包括仿真时间、步长等。
您还可以设置输出波形的显示格式和范围。
第五步:运行仿真设置好仿真参数后,点击菜单栏中的“Simulate”选项,选择“Run”来运行仿真。
PROTEUS将模拟您搭建的电路,并显示仿真结果。
您可以查看电压、电流等参数,并分析电路的工作情况。
第六步:调试电路在仿真过程中,您可能会发现电路存在问题,比如输出波形不符合预期,电流过大等。
您可以通过调试电路来解决这些问题。
尝试更改元件参数、连接方式等,并重新运行仿真来检查效果。
第七步:保存和导出仿真结果在完成仿真后,您可以保存仿真结果并导出到其他格式。
点击菜单栏中的“File”选项,选择“Save As”来保存仿真文件。
您还可以导出波形图、数据表等结果,以便后续分析和报告。
总结:本教程介绍了PROTEUS的基本功能和使用方法,帮助您快速上手该软件进行电路仿真工作。
通过创建新项目、添加元件、设置仿真参数、运行仿真、调试电路和保存结果,您可以轻松完成电路仿真工作。
希望本教程对您有所帮助,祝您在PROTEUS软件中取得成功!。
基于Proteus的建模技术及EasyHDL介绍主要内容26页PPT

1、不要轻言放弃,否则对不起自己。
2、要冒一次险!整个生命就是一场冒险。走得最远的人,常是愿意 去做,并愿意去冒险人。“稳妥”之船,从未能从岸边走远。-戴尔.卡耐基。
梦 境
3、人生就像一杯没有加糖的咖啡,喝起来是苦涩的,回味起来却有 久久不会退去的余香。
基于Proteus的建模技术及EasyHDL介绍 4、守业的最好办法就是不断的发展。 5、当爱不能完美,我宁愿选择无悔,不管来生多么美丽,我不愿失 去今生对你的记忆,我不求天长地久的美景,我只要生生世世的轮 回里有你。 主要内容
谢谢!
51、 天 下 之 事 常成 于困约 ,而败 于奢靡 。——陆 游 52、 生 命 不 等 于是呼 吸,生 命是活 动。——卢 梭
53、 伟 大 的 事 业,需 要决心 ,能力 ,组织 和责任 感。 ——易 卜 生 54、 唯 书 籍 不 朽。——乔 特
创建基于DLL的Proteus VSM仿真模型

创建基于DLL的Proteus VSM仿真模型一、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(数字)――数字组件的引脚,提供检测引脚状态和创建输出事务事件的服务。
基于DLL技术的PID仿真器设计与实现

Absr c :L b E n t b h v h i wn p e o n n ed fa p ia in t a t a Vl W a d Mal a e t e ro rd mi a t l s o p l t .T e a n o p r t h d a t g sa d h v r a i f c o h y c n i c r o ae t e a v a e n a e moe n
优秀的面 向对象 的图形化编程语 言,具有功 能完 整 、应 用灵 活 、易于 理解 、编 程简 单 、开发 效率 高 等 优点 ,已成 为虚 拟 仪 器 开发 事 实 上 的工业 标 准 。
然 而 ,它 在 工程计 算 、图形 处理 、先 进控 制 、系 统
建模 和仿 真方 面 等远 不及 M db功能 强 大 。Maa aa db 是 Ma Wok 公 司开 发 的 “ 算 纸 ” 的 程 序 设 计 t rs h 演 式 语 言 。它 以强大 的科 学计算 功 能 、大 量稳 定可 靠 的 算法 库 ,在 数 学 计 算 工 具 方 面 已成 为 事 实 上 的标
b t ra piain ite l b x dpo rmmig h ep p rit d c sameh fu igDL e l etec mmu iainb t e n et p l t f h ywi emie rga e c o l n .T a e r u e to o sn L t rai o n o d o z h nc t ew e o
De i n a d I p e e t o D i u a o s d o sg n m lm n f PI S m l t r Ba e n DLL
PENG Yu- n nig,L U n I Pi g
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创建基于DLL的Proteus VSM仿真模型作者:silingsong一、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点阵式液晶显示元件的开发为实例详细讲解开发过程。
TG19264A的pdf手册下载:TG19264A使用说明书.pdf1.打开Proteus,选择菜单查看>>Snap 10th,选择左边绘图工具栏的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,编写如下代码。
/****************************************************************** 文件:LCD19264A.H* 说明:不支持以下特性* (1) 不支持显示开关控制* (2) 不支持设置显示起始行*****************************************************************/#include "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, ACTIVESTA TE newstate);//交互仿真时每帧结束时被调用,通过传递ACTIVEDA TA数据与绘图模型通信,从而调用animate()进行绘图BOOL indicate (REALTIME time, ACTIVEDA TA *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; //每象素对应矩形的宽和高};/****************************************************************** 文件:LCD19264A.CPP* 说明:不支持以下特性* (1) 不支持显示开关控制* (2) 不支持设置显示起始行*****************************************************************/#include <string.h>#include "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(FLT);d[1] = instance->getdsimpin("D1,d1", true);d[1]->setstate(FLT);d[2] = instance->getdsimpin("D2,d2", true);d[2]->setstate(FLT);d[3] = instance->getdsimpin("D3,d3", true);d[3]->setstate(FLT);d[4] = instance->getdsimpin("D4,d4", true);d[4]->setstate(FLT);d[5] = instance->getdsimpin("D5,d5", true);d[5]->setstate(FLT);d[6] = instance->getdsimpin("D6,d6", true);d[6]->setstate(FLT);d[7] = instance->getdsimpin("D7,d7", true);d[7]->setstate(FLT);//为方便操作,将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){}//交互仿真时每帧结束时被调用,通过传递ACTIVEDA TA数据与绘图模型通信,从而调用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_Y ADDRESS: //设置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工程,编写代码测试元件。