Matlab中显示未定义参数错误或者未定义什么情况?怎么定义?我是直接把Gain中的值改成了字母

matlab中s函数编写心得(转)
所谓s函数是system Function的简称,
用它来写自己的simulink模块. s函数可以用matlab、C、C++、Fortran、Ada等语言来写,
这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)
xmlnamespace prefix ="o" ns
="urn:schemas-microsoft-com:office:office"
先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,
还可以操作windows API等
先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:
一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、
采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、
计算连续状态等等,这个阶段需要反复运行,直至结束.
在matlab的workspace里输入edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构.
1. 函数的函数头
函数的第一行:function
[sys,x0,str,ts]=sfuntmpl(t,x,u,flag) ,
先讲输入与输出变量的含义:
t是采样时间,
x是状态变量,
u是输入(是做成simulink模块的输入),
flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等)
sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义),
x0是状态变量的初始值,
str是保留参数(mathworks公司还没想好该怎么用它,
一般在初始化中将它置空就可以了, str=[]), ts是一个1&2的向量, ts(1)是采样周期, ts(2)是偏移量
2. 函数分析
下面结合sfuntmpl.m中的代码来讲具体的结构:
switch flag, %判断flag,看当前处于哪个状态
[sys,x0,str,ts]=mdlInitializeS
// 解释说明
flag=0表示当前处于初始化状态,此时调用函数mdlInitializeSizes进行初始化,此函数在该文件的第149行定义.
其中的参数sys是一个结构体,它用来设置模块的一些参数,各个参数详细说明如下
size =%用于设置模块参数的结构体用simsizes来生成
sizes.NumContStates = 0; %模块连续状态变量的个数
sizes.NumDiscStates = 0; %模块离散状态变量的个数
sizes.NumOutputs = 0; %模块输出变量的个数
sizes.NumInputs = 0; %模块输入变量的个数
sizes.DirFeedthrough = 1; %模块是否存在直接贯通
sizes.NumSampleTimes = 1;
%模块的采样时间个数,
至少是一个
sys = simsizes(sizes); %设置完后赋给sys输出举个例子,考虑如下模型:
dx/dt=fc(t,x,u)
也可以用连续状态方程描述:dx/dt=A*x+B*u
x(k+1)=fd(t,x,u)
也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k)
y=fo(t,x,u)
也可以用输出状态方程描述:y=C*x+D*u
设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为(一般连续状态与离散状态不会一块用,
我这儿是为了方便说明):
sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1;
其他的可以不变, 继续在mdlInitializeSizes函数中往下看:
x0 = []; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改为x0=[0,0](离散和连续的状态变量我们都设它初值为0)
str = []; %保留参数,
置[]就可以了,
没什么用ts = [0 0]; %采样周期设为0表示是连续系统,
如果是离散系统在下面的mdlGetTimeOfNextVarHit函数中具体介绍
sys=mdlDerivatives(t,x,u);
flag=1表示此时要计算连续状态的微分,
即上面提到的dx/dt=fc(t,x,u)中的dx/dt,
找到193行的函数mdlDerivatives,
如果设置连续状态变量个数为0,
此处只需sys=[]就可以了,
按我们上述讨论的那个模型, 此处改成 sys=fc(t,x(1),u)或sys=A*x(1)+B*u,
我们这儿x(1)是连续状态变量,
而x(2)是离散的,
这儿只用到连续的, 此时的输出sys就是微分
sys=mdlUpdate(t,x,u);
flag=2表示此时要计算下一个离散状态,
即上面提到的x(k+1)=fd(t,x,u),
找到mdlUpdate函数,
它这儿sys=[]表示没有离散状态,
我们这儿可以改成sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即为x(k+1)
sys=mdlOutputs(t,x,u);
flag=3表示此时要计算输出,
即y=fo(t,x,u),
找到218行的mdlOutputs函数.
如果sys=[]表示没有输出,
我们改成sys=fo(t,x,u)或sys=C*x+D*u %sys此时为输出y
sys=mdlGetTimeOfNextVarHit(t,x,u);
flag=4表示此时要计算下一次采样的时间,
只在离散采样系统中有用(即上文的mdlInitializeSizes中提到的ts设置ts(1)不为0),
连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys=[].
这个函数主要用于变步长的设置, 具体实现大家可以用edit vsfunc看vsfunc.m这个例子
sys=mdlTerminate(t,x,u);
flag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=[]就可,
如果你在结束时还要设置什么,就在此函数中写完了.
此外, s函数还可以带用户参数,
下面给个例子, 它和simulink下的gain模块功能一样
function [sys,x0,str,ts] = sfungain(t,x,u,flag,gain)
switch flag,
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
sys=gain*u;
case {1,2,4,9},
做好了s函数后,
simulink --& user-defined
function下拖一个S-Function到你的模型,
就可以用了.
在simulink --& user-defined
function还有个s-Function Builder,
他可以生成用c语言写的s函数.
或者在matlab的workspace下打sfundemos,
可以看到很多演示s函数的程序
SIMULINK s-function的设计Simulink为用户提供了许多内置的基本库模块,
通过这些模块进行连接而构成系统的模型. 对于那些经常使用的模块进行组合并封装可以构建出重复使用的新模块,
但它依然是基于Simulink原来提供的内置模块.而Simulink
s-function是一种强大的对模块库进行扩展的新工具.(一) s-function的概念s-function是一个动态系统的计算机语言描述,
在MATLAB里,
用户可以选择用m文件编写,
也可以用c或mex文件编写,
在这里只给大家介绍如何用m文件编写s-function.S-function提供了扩展Simulink模块库的有力工具,
它采用一种特定的调用语法, 使函数和Simulink解法器进行交互.S-function最广泛的用途是定制用户自己的Simulink模块.
它的形式十分通用, 能够支持连续系统、离散系统和混合系统.(二)
建立m文件s-function1.
使用模板文件:sfuntmp1.m, 其格式为[sys,x0]=function(t,x,u,flag).
该该模板文件位于MATLAB根目录下toolbox/simulink/blocks目录下模板文件里s-function的结构十分简单,
它只为不同的flag的值指定要相应调用的m文件子函数.
比如当flag=3时,
即模块处于计算输出这个仿真阶段时, 相应调用的子函数为sys=mdloutputs(t,x,u).
模板文件使用switch语句来完成这种指定,
当然这种结构并不唯一, 用户也可以使用if语句来完成同样的功能.
而且在实际运用时, 可以根据实际需要来去掉某些值,
因为并不是每个模块都需要经过所有的子函数调用.模板文件只是Simulink为方便用户而提供的一种参考格式,
并不是编写s-function的语法要求,
用户完全可以改变子函数的名称, 或者直接把代码写在主函数里, 但使用模板文件的好处是, 比较方便,
而且条理清晰.使用模板编写s-function,
用户只需把s-函数名换成期望的函数名称,
如果需要额外的输入参量, 还需在输入参数列表的后面增加这些参数, 因为前面的4个参数是simulink调用s-function时自动传入的.
对于输出参数, 最好不做修改. 接下去的工作就是根据所编s-function要完成的任务,
用相应的代码去替代模板里各个子函数的代码即可.Simulink在每个仿真阶段都会对s-function进行调用.
在调用时, Simulink会根据所处的仿真阶段为flag传入不同的值,
而且还会为sys这个返回参数指定不同的角色.
也就是说尽管是相同的sys变量,
但在不同的仿真阶段其意义却不相同, 这种变化由simulink自动完成.m文件s-function可用的子函数说明如下:mdlInitializeSizes(flag=0)
定义s-function模块的基本特性,
包括采样时间、连续或者离散状态的初始条件和sizes数组mdlDerivatives(flag=1)
计算连续状态变量的微分方程mdlUpdate(flag=2)
更新离散状态、采样时间和主时间步的要求mdlOutputs(flag=3)
计算s-function的输出mdlGetTimeOfNextVarHit(flag=4)
计算下一个采样点的绝对时间, 这个方法仅仅是在用户在mdlInitializeSizes
里说明了一个可变的离散采样时间
建立s-function可以分成两个分离的任务:
初始化模块特性包括输入输出信号的宽度, 离散连续状态的初始条件和采样时间.
将算法放到合适的s-function子函数中去。2.
定义s-function的初始信息为了让Simulink识别出一个m文件是s-function,
用户必须在s-函数里提供有关s-函数的说明信息,
包括采样时间、连续或者离散状态个数等初始条件. 这一部分主要是在mdlInitializeSizes子函数里完成.Sizes数组是s-function函数信息的载体,
它内部的字段意义为:NumContStates(sys(1)):连续状态的个数(状态向量连续部分的宽度)NumDiscStates(sys(2)):离散状态的个数(状态向量离散部分的宽度)NumOutputs(sys(3)):
输出变量的个数(输出向量的宽度)NumInputs(sys(4)):输入变量的个数(输入向量的宽度)DirFeedthrough(sys(5)):有不连续根的数量NumSampleTimes(sys(6)):采样时间的个数,有无代数循环标志如果字段代表的向量宽度为动态可变,
则可以将它们赋值为-1.
注意DirFeedthrough是一个布尔变量,
它的取值只有0和1两种,
0表示没有直接馈入,
此时用户在编写mdlOutputs子函数时就要确保子函数的代码里不出现输入变量u; 1表示有直接馈入.
NumSampleTimes表示采样时间的个数,
也就是ts变量的行数,
与用户对ts的定义有关.需要指出的是,
由于s-function会忽略端口,
所以当有多个输入变量或多个输出变量时, 必须用mux模块或demux模块将多个单一输入合成一个复合输入向量或将一个复合输出向量分解为多个单一输出.3.
输入和输出参量说明S-function默认的4个输入参数为t、x、u和flag,
它们的次序不能变动, 代表的意义分别为:t
代表当前的仿真时间, 这个输入参数通常用于决定下一个采样时刻, 或者在多采样速率系统中, 用来区分不同的采样时刻点,
并据此进行不同的处理x
表示状态向量, 这个参数是必须的, 甚至在系统中不存在状态时也是如此.
它具有很灵活的运用u
表示输入向量flag
是一个控制在每一个仿真阶段调用哪一个子函数的参数, 由Simulink在调用时自动取值.S-function默认的4个返回参数为sys、x0、它们的次序不能变动,代表的意义分别为:sys
是一个通用的返回参数, 它所返回值的意义取决于flag的值x0
是初始的状态值(没有状态时是一个空矩阵[]),
这个返回参数只在flag值为0时才有效,
其他时候都会被忽略.
有一系统如下:dx1=x2
dx2=9.81*sin(x(1))-2*x(2)+u
求出系统在单位阶跃输入下的x1的状态变化曲线,
假设x1,x2初值为0, 则:function
[sys,x0]=dong(t,x,u,flag)if
flag==0sys=[2;0;2;1;0;0];
flag==1sys=[x(2);9.81*sin(x(1))-2*x(2)+u];
flag==3sys=[x(1);x(2)];
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。GUI指导教程系列(9)——在GUI中调用Simulink模型 - MATLAB技术论坛 ...
我的图书馆
GUI指导教程系列(9)——在GUI中调用Simulink模型 - MATLAB技术论坛 ...
MATLAB技术论坛
标题: GUI指导教程系列(9)——在GUI中调用Simulink模型
作者: dynamic& & 时间:
22:40 & & 标题: GUI指导教程系列(9)——在GUI中调用Simulink模型本节教程主要向大家演示使用三种不同的方法,在GUIDE中嵌入Simulink模块。关于原理大家可以参考在Simulink中能够直观快速的搭建系统模型,如果再联合GUIDE的面向对象可视化编程,可以说是锦上添花!将Simulink融入到GUIDE中可以方便模型的终端用户,很容易直接可视化的操控模型参数和显示仿真结果,而此时并不需要进入Simulink环境。
构建Simulink模型
该部分我们将快速的构建一个Simulink模型方便在后面的GUIDE中使用。本次我们就使用一个简单的二阶“质量-弹簧-阻尼”系统作为示例吧。&在使用该教程时,我们假定您已经具备Simulink相关建模基础和了解“质量-弹簧-阻尼”系统的理论。因此在这里我就不深入介绍Simulink模型的建立和“质量-弹簧-阻尼”系统的数学推导。如果的确需要,建议您参考下1、先下载论坛为您制作好的Simulink和GUI模型
(13.04 KB, 下载次数: 338) ,包含simulink_gui.fig、simulink_gui.m、 simulateButton.m和 mass_spring.mdl四个文件,将其解压到MATLAB工作目录。2、在Simulink中打开模型,框图如下所示&3、请注意增益(Gain)模块的增益使用的是变量1/m、c/m和k/m,而不是数值。因为Simulink默认使用基本状态空间(Base WorkSpace)的数据,因此在仿真之前必须先在状态空间定义参数m、c和k,否则将出错。当然我们可以使用set_param()函数直接设置参数,这个将会在后面讲解。4、由于函数有自己的状态空间(不是Base Workspace),因此在函数中使用sim()函数进行模型仿真,即使你在函数中定义了模型的必要参数,但是这些参数只存在于函数状态空间中,模型在仿真是没法获取。比如下面的代码将会导致错误
function runSimulinkModel(m,c,k)
% 即使在函数中有模型的参数输入或定义,但是Simulink默认只使用基本状态空间的数据
sim('mass_spring');
5、由于函数状态空间和基本状态空间的变量和数据不兼容,这就增加了在GUIDE中调用Simulink模型的难度。在接下来的教程中,我们将讨论使用三种方法来解决这个问题!
GUIDE调用Simulink
方法一:主要使用set_param函数设置仿真参数方法二:Simulink中提供的simset()函数,可以让用户自定Simulink模型的运行空间(默认是Base Workspace),我们只要将Simulink设置为从当前工作空间运行就Ok了。关于simset的更多用法,感兴趣的网友可以自己参考Matlab帮助!1、在GUIDE中打开simulink_gui.fig文件(不会使用GUIDE,那先看下),GUI布局如下所示&2、打开simulink_gui.m文件定位到Simulate!按钮的回调函数simulate_pushbutton_Callback,在后面添加如下代码
axes(handles.axes1) % 将axes1设置为当前坐标系,便于绘制仿真结果
m=str2num(get(handles.mass_editText,'String')); % 获取质量
c=str2num(get(handles.damping_editText,'String')); % 获取阻尼
k=str2num(get(handles.spring_editText,'String')); % 获取劲度系数
% 配置Simulink仿真选项,使其使用当前工作空间
% 设置Simulink从当前工作空间运行
options = simset('SrcWorkspace','current');
% 使用sim()函数对模型进行仿真
% 第一参数是模型名称
% 第二个参数是向量,指定仿真开始和结束时间
% 如果设置为[],则使用在Simulink中设置的始末时间
% 第三个参数设置Simulink仿真选项
sim('mass_spring',[],options);
% 绘制图形% 模型中有一个OUT模块,使用它我们可以设置输出变量为tout和yout
% 然后就可以直接调用Simulink的获取仿真结果tout和yout进行绘图了
plot(tout,yout)
xlabel('Time')
ylabel('Displacement')
Title('2nd Order Mass Spring System')
3、保存修改,再运行GUI。在文本框中输入“质量-弹簧-阻尼”系统的三个参数(注意不要输入字母、符号或负数),然后点击“Simulate!”按钮,看看我们的劳动成果吧!&方法三:1、同样在GUIDE中打开未经有修改的simulink_gui.fig文件&2、双击“Simulate!”按钮打开属性查看器,将Callback属性修改为simulateButton。以后每次点击“Simulate!”按钮时,则GUI只响应simlateButton中定义的操作,而不是simulate_pushbutton_Callback。注意:simulateButton是另外编写的一个M脚本文件,MATLAB中脚本文件(不同于函数文件)中的所有变量和数据共用基本状态空间。&3、其实simulateButton.m脚本的代码如下
% 注意到simulateButton.m文件不是一个M函数(以function开头的为M函数),而是M脚本!
% Matlab脚本将在基本工作空间运行,它涉及到所有的变量和数据都保存在基本工作空间!
% 而Simulink所有参数默认调用基本工作空间的数据,所以此时我们就可以直接使用sim()函数进行模型仿真了!
% 获取当前GUI窗体的句柄
% 获取GUI的handles结构体,它包含了所有控件的信息
handles = guidata(h);
% 选择当前坐标系,由于后面的绘图
axes(handles.axes1);
% 获取文本框中的Simulink仿真参数
m=str2num(get(handles.mass_editText,'String')); % 注意获取的string是一个字符串,需要使用str2num将其转换为数值
c=str2num(get(handles.damping_editText,'String'));
k=str2num(get(handles.spring_editText,'String'));
% 仿真系统
sim('mass_spring');
% 绘制仿真结果图形
plot(tout,yout)
xlabel('Time')
ylabel('Displacement')
Title('2nd Order Mass Spring System')
其实方法二的一种变形就是,跨空间计算Simulink模型所需要的参数,比如evalin('base','m=5'),就表示在基本工作空间运行m=5这条命令。4、保存下对GUI的修改,验证下我们的成果吧!&图片附件: image001.gif ( 22:42, 5.23 KB) / 下载次数 6http://www.matlabsky.com/forum.php?mod=attachment&aid=NDQ0NHwyYzg5NTYyY3wxMzA0MDc3ODI0fDkwMDk5图片附件: image003.png ( 22:42, 12.78 KB) / 下载次数 9http://image28.360doc.com/DownloadImg/9/图片附件: image005.png ( 22:42, 15.32 KB) / 下载次数 5http://image28.360doc.com/DownloadImg/9/图片附件: image007.png ( 22:42, 11.16 KB) / 下载次数 4http://www.matlabsky.com/forum.php?mod=attachment&aid=NDQ0N3wzZDlkNzA3NHwxMzA0MDc3ODI0fDkwMDk5图片附件: image013.png ( 22:42, 12.05 KB) / 下载次数 2http://image28.360doc.com/DownloadImg/9/附件: simulink-gui.zip ( 22:44, 13.04 KB) / 下载次数 338http://www.matlabsky.com/forum.php?mod=attachment&aid=NDQ0OXw2ZDE0NDQwNHwxMzA0MDc3ODI0fDkwMDk5图片附件: image005.png ( 23:09, 15.32 KB) / 下载次数 6http://image28.360doc.com/DownloadImg/9/图片附件: image013.png ( 23:09, 12.05 KB) / 下载次数 4http://image28.360doc.com/DownloadImg/9/
assignin('base','m',m);assignin('base','c',c);assignin('base','k',k);sim('massspring');也可以
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢在matlab中怎么定义变量?我要创建一个多项式,直接打y=x^2+x+1,显示x未定义.该怎么解决?
符号表达式可以这样syms xy=x^2+x+1
8023是我一直在用的一组数字. 8023也可以做lose,失
(1/3xy)?*(-12x?y?)÷(-4/3x?y) =1/9*x?y?*(-12x?y?)÷(-
(1-2的平方分之1)(1-3的平方分之1).(1-9的平
(1-1/2^2)(1-1/3^2)……(1-1/9^2)(1-1/10^2) =
y=2x+b与双曲联立得 10x?+12bx+(3b?+6)=0 x1+x2=-5/6 x1x
2 || i">C语言中的i 2 怎么理解啊什么情况下成立 还有这
i 2 有一个条件成立结果就为真 i 2 需要两个条件
∴ |x|≥1又 x+√(x^2-1)>0
且 |x| >√(x^2-1)
∴ 定义域为:x≥1由:1≤x≤x+√(x^2-1) x+√(x^2-1) 取值为 [1,+∞)∴ f(x)=ln(x+√(x^2-1))/lna 值域为 :(-∞,0]y=log[a] (x+√(x^2-1))a^y=x+√(x^2-1)=1/[x-√(x^2-1)]a^(-y)=x-√(x^2-1)2x=a^(y) + a^(-y)x=[a^(y) + a^(-y)]/2∴ f^-1(x)=[a^(x) + a^(-x)]/2">f(x)=log[a] (x+√(x^2-1))=ln(x+√(x^2-1))/lna x^2-1>0 ∴ |
其他相关问题已解决问题
在matlab中,simulink里的s-function,我添加到仿真中,在网上找了一段相当于放大器的代码,如下
提问时间: 02:50:44
function [sys,x0,str,ts] = sfungain(t,x,u,flag,gain) switch flag, case 0,
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
ts=[0,0]; case 3,
sys=gain*u; case {1,2,4,9}, sys = []; end 双击sfunction更模块后,点击edit,然后把这段代码放进去,并另存为gain1之后,我将上s-function name写为 gain1,然后参数为gain,然后我加了一个输入常数,想用示波器观察,但是运行时总是出错,说gain1这个sfunction找不到,第一次研究sfunctiong ,不知道怎样才能正确运行,求指导,谢谢啊。 还有如果我要设置参数gain是不是直接在matlab里的command window那边写入gain=1,这样的就行了?(即参数怎么设置。。。
浏览次数:5727
该答案已经被保护
/********************引脚定义********************/ sbit RS =P3^0; //数据指令 sbit RW =P3^1; //读写 sbit E =P3^2; //使能 sbit CSL =P3^3; //左片选 sbit CSM =P3^4; //中片选 sbit CSR =P3^5; //右片选 sbit RST =P3^6; unsigned char P //页 地址 unsigned char C //列 地址 unsigned char code BMP1[]; unsigned char code BMP2[]; void Delay(unsigned int MS); void wtcom(void); /***************************/ /*检查Busy */ /***************************/ void BusyL(void) { CSL= 1; CSM= 0; CSR= 0; wtcom(); } void BusyM(void) { CSL= 0; CSM= 1; CSR= 0; wtcom(); } void BusyR(void) { CSL= 0; CSM= 0; CSR= 1; wtcom(); } void wtcom(void) { RS = 0; //指令 RW = 1; P1 = 0xFF; //输出0xff以便读取正确 E = 1; _nop_();_nop_();_nop_(); while(P1 & 0x80); //Status Read Bit7 = BUSY E = 0; _nop_(); _nop_();_nop_(); } /********************************************************/ /*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */ /********************************************************/ void Locatexy(void) { unsigned char x,y; switch (Col&0xc0) /* col.and.0xC0 */ { /*条件分支执行 */ case 0: {BusyL();}/*左区 */ case 0x40: {BusyM();}/*中区 */ case 0x80: {BusyR();}/*右区 */ } x = Col&0x3F|0x40; /* col.and.0x3f.or.Set Y Address*/ y = Page&0x07|0xB8; /* row.and.0x07.or.set Page */ wtcom(); /* waitting for enable */ RS = 0; //指令 RW = 0; //写 P1 = //设置页面地址 E = 1; _nop_(); E = 0; _nop_(); _nop_();_nop_();_nop_(); wtcom(); /* waitting for enable */ RS = 0; RW = 0; P1 = //设置列地址 E = 1; _nop_();_nop_();_nop_();_nop_(); E = 0; _nop_(); _nop_();_nop_();_nop_(); } /***************************/ /*写指令 */ /***************************/ void WriteCommandL( unsigned char CommandByte ) { BusyL(); P1 = CommandB RS = 0; //指令 RW = 0; E = 1; _nop_();_nop_();_nop_();_nop_(); E = 0; _nop_();_nop_();_nop_();_nop_(); } void WriteCommandM( unsigned char CommandByte ) { BusyM(); P1 = CommandB RS = 0; //指令 RW = 0; E = 1; _nop_();_nop_();_nop_();_nop_(); E = 0; _nop_();_nop_();_nop_();_nop_(); } void WriteCommandR( unsigned char CommandByte ) { BusyR(); P1 = CommandB RS = 0; //指令 RW = 0; E = 1; _nop_();_nop_();_nop_();_nop_(); E = 0; _nop_();_nop_();_nop_();_nop_(); } /***************************/ /*读数据 */ /***************************/ unsigned char ReadData( void ) { unsigned char DataB Locatexy(); /*坐标定位,返回时保留分区状态不变 */ RS = 1; /*数据输出*/ RW = 1; /*读入 */ P1 = 0xFF; //输出0xff以便读取正确 E = 1; /*读入到LCM*/ _nop_();_nop_();_nop_();_nop_(); DataByte = P1; /*数据读出到数据口P1 */ E = 0; _nop_();_nop_();_nop_();_nop_(); return DataB } /***************************/ /*写数据 */ /***************************/ void WriteData( unsigned char DataByte ) { Locatexy(); /*坐标定位,返回时保留分区状态不变 */ RS = 1; /*数据输出*/ RW = 0; /*写输出 */ P1 = DataB /*数据输出到数据口 */ E = 1; /*写入到LCM*/ _nop_();_nop_();_nop_();_nop_(); E = 0; _nop_();_nop_();_nop_();_nop_(); } void LcmClear( void ) { Page = 0; Col = 0; for(Page=0;Page&8;Page++) for(Col=0;Col&192;Col++) WriteData(0); } void LcmInit( void ) { WriteCommandL(0x3f); //开显示 WriteCommandM(0x3f); WriteCommandR(0x3f); WriteCommandL(0xc0); //设置起始地址=0 WriteCommandM(0xc0); WriteCommandR(0xc0); WriteCommandL(0x3f); //开显示 WriteCommandM(0x3f); WriteCommandR(0x3f); LcmClear(); Col = 0; Page= 0; Locatexy(); } void LcmPutDots( unsigned char DotByte ) { Page = 0; Col = 0; for(Page=0;Page&8;Page++) { for(Col=0;Col&192;Col++) { WriteData( DotByte ); DotByte = ~DotB } } } void LcmPutBMP( unsigned char *puts ) { unsigned int X=0; Page = 0; Col = 0; for(Page=0;Page&8;Page++) { for(Col=0;Col&192;Col++) { WriteData( puts[X] ); X++; } } } void LcmReverseBMP( void ) { Page = 0; Col = 0; for(Page=0;Page&8;Page++) { for(Col=0;Col&192;Col++) { temp = ReadData(); //空读一次 temp = ReadData(); temp = ~ WriteData(temp); } } } void Delay(unsigned int MS) { unsigned char us, while(MS!=0) { usn = 2; //for 12M while(usn!=0) { us=0xf6; while (us!=0){us--;}; usn--; } MS--; } } void Main( void ) { Delay(200); //等待复位 LcmInit(); LcmClear(); while(1) { LcmPutBMP(BMP1); Delay(1500); LcmReverseBMP(); Delay(1500); LcmPutBMP(BMP2); Delay(1500); LcmReverseBMP(); Delay(1500); } } 更多0 展开@_@不知道 你的问题解决了么?谢谢。
答案创立者
以企业身份回答&
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题

我要回帖

更多关于 matlab显示未定义函数 的文章

 

随机推荐