34图形液晶控制实验

2024-04-26

34图形液晶控制实验(精选6篇)

篇1:34图形液晶控制实验

【实验目的】

1.在掌握液晶光开关的基本工作原理的基础上,测量液晶光开关的电光特性曲线,并由电光特性曲线得到液晶的阈值电压和关断电压。

2.测量驱动电压周期变化时,液晶光开关的时间响应曲线,并由时间响应曲线得到液晶的上升时间和下降时间。

3.测量由液晶光开关矩阵所构成的液晶显示器的视角特性以及在不同视角下的对比度,了解液晶光开关的工作条件。

4.了解液晶光开关构成图像矩阵的方法,学习和掌握这种矩阵所组成的液晶显示器构成文字和图形的显示模式,从而了解一般液晶显示器件的工作原理。

【实验仪器】

篇2:34图形液晶控制实验

实验报告书

(实验五)

姓名:

学号: 班级:

浙江理工大学 二0一二 年 十二 月

数字图像处理实验指导书

实验五 纹理映射实验

一、实验目的和要求

掌握纹理映射的基本原理,利用VC++ OpenGL实现纹理映射技术。

二、实验原理

纹理映射是真实感图形制作的一个重要部分,运用纹理映射可以方面地制作真实感图形,而不必花更多的时间去考虑物体的表面纹理。如一张木制桌子其表面的木纹是不规范的,看上去又是那么自然,如果在图形制作中不用纹理映射,那么只是这张桌面纹理的设计,就要花费很大精力,而且设计结果也未必能像现实中那么自然。如果运用纹理映射就非常方便,可以用扫描仪将这样的一张桌子扫成一个位图。然后的具体的操作中,只需把桌面形状用多边形画出来,把桌面纹理贴上去就可以了。

另外,纹理映射能够在多边形进行变换时仍保证纹理的图案与多边形保持一致性。例如,以透视投影方式观察墙面时,远端的砖会变小,而近处的砖就会大一些。

此外,纹理映射也可以用于其他方面。例如,使用一大片植被的图像映射到一些连续的多边形上,以模拟地貌,或者以大理石、木纹等自然物质的图像作为纹理映射到相应的多边形上,作为物体的真实表面。

在OpenGL中提供了一系列完整的纹理操作函数,用户可以用它们构造理想的物体表面,可以对光照物体进行处理,使其映射出所处环境的景象,可以用不同方式应用到曲面上,而且可以随几何物体的几何属性变换而变化,从而使制作的三维场景和三维物体更真实更自然。

在OpenGL中要实现纹理映射,需要经历创建纹理、指定纹理应用方式、启用纹理映射、使用纹理坐标和几何坐标绘制场景几个过程。

用于指定一维、二维和三维纹理的函数分别为: Void glTexImage1D(GLenum target, Glint level, Glint components, GLsizei width, Glint border, GLenum format, GLenum type, const GLvoid *texels);Void glTexImage2D(GLenum target, Glint level, Glint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *texels);Void glTexImage3D(GLenum target, Glint level, Glint components, GLsizei width, GLsizei height, GLsizei depth, Glint border, GLenum format, GLenum type, const GLvoid *texels);其中,参数target取值一般为GL_TEXTURE_1D, GL_TEXTURE_2D和GL_TEXTURE_3D,分别与一维、二维和三维的纹理相对应。参数Level表示纹理多分辨率层数,通常取值为0,表示只有一种分辨率。参数components的可能取值为1~4的整数以及多种符号常量(如GL_RGBA),表示纹理元素中存储的哪些分量(RGBA颜色、深度等)在纹理映射中被使用,1表示使用R颜色分量,2表示使用R和A颜色分量,3表示使用RGB颜色分量,4表示使用RGBA颜色分量。参数width,height,depth分别指定纹理的宽度、高度、深度。参数format和type表示给出的图像数据的数据格式和数据类型,这两个参数的取值都是符号常量(比如format指定为GL_RGBA,type指定为GL_UNSIGNED_BYTE,参数texels指向内存中指定的纹理图像数据。

在定义了纹理之后,需要启用纹理的函数: 数字图像处理实验指导书

glEnable(GL_TEXTURE_1D);glEnable(GL_TEXTURE_2D);glEnable(GL_TEXTURE_3D);在启用纹理之后,需要建立物体表面上点与纹理空间的对应关系,即在绘制基本图元时,在glVertex函数调用之前调用glTexCoord函数,明确指定当前顶点所对应的纹理坐标,例如:

glBegin(GL_TRIANGLES);glTexCoord2f(0.0, 0.0);glVertex2f(0.0, 0.0);glTexCoord2f(1.0, 1.0);glVertex2f(15.0, 15.0);glTexCoord2f(1.0, 0.0);glVertex2f(30.0, 0.0);glEnd();其图元内部点的纹理坐标利用顶点处的纹理坐标采用线性插值的方法计算出来。

在OpenGL中,纹理坐标的范围被指定在[0,1]之间,而在使用映射函数进行纹理坐标计算时,有可能得到不在[0,1]之间的坐标。此时OpenGL有两种处理方式,一种是截断,另一种是重复,它们被称为环绕模式。在截断模式(GL_CLAMP)中,将大于1.0的纹理坐标设置为1.0,将小于0.0的纹理坐标设置为0.0。在重复模式(GL_REPEAT)中,如果纹理坐标不在[0,1]之间,则将纹理坐标值的整数部分舍弃,只使用小数部分,这样使纹理图像在物体表面重复出现。例如,使用下面的函数:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);分别指定二维纹理中s坐标采用截断或重复处理方式。

另外,在变换和纹理映射后,屏幕上的一个像素可能对应纹理元素的一小部分(放大),也可能对应大量的处理元素(缩小)。在OpenGL中,允许指定多种方式来决定如何完成像素与纹理元素对应的计算方法(滤波)。比如,下面的函数可以指定放大和缩小的滤波方法:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);其中,glTexParameteri函数的第一个参数指定使用的是一维、二维或三维纹理;第二个参数为GL_TEXTURE_MAG_FILTER或GL_TEXTURE_MIN_FILTER,指出要指定缩小还是放大滤波算法;最后一个参数指定滤波的方法。

补充:透视投影函数

void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);它也创建一个对称透视视景体,但它的参数定义于前面的不同。其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。参数fovy定义视野在X-Z平面的角度,范围是[0.0,180.0];参数aspect是投影平面宽度与高度的比率;参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离,它们总为正值。

三、实验内容

在OpenGL中纹理映射所使用的纹理数据,既可以是程序生成的一组数据,也可以从外部文件中直接读取,参考示范代码完成以下两项内容: 1.利用直接创建纹理的方法生成二维纹理并映射到四边形上。参考代码:

void makeImage(void){ 数字图像处理实验指导书

int i, j, r,g,b;for(i = 0;i < ImageWidth;i++){

for(j = 0;j < ImageHeight;j++)

{

r=(i*j)%255;

g=(4*i)%255;

b=(4*j)%255;

Image[i][j][0] =(GLubyte)r;

Image[i][j][1] =(GLubyte)g;

Image[i][j][2] =(GLubyte)b;

} }} void myinit(void){ glClearColor(0.0, 0.0, 0.0, 0.0);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);// 生成纹理数据 makeImage();// 设置像素存储模式

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);// 定义二维纹理映射 glTexImage2D(……);// 定义纹理映射参数 glTexParameterf(……);glTexParameterf(……);glTexParameterf(……);glTexParameterf(……);// 启用二维纹理

glEnable(GL_TEXTURE_2D);glShadeModel(GL_FLAT);} void display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//绘制四边形,并完成纹理映射

……

glFlush();} void myReshape(GLsizei w, GLsizei h){ ……} void main(int argc, char* argv[]){ ……} 2.从外部文件中直接读取纹理实现正方体每个面的纹理映射,并使正方体转动。

数字图像处理实验指导书

整个过程需要三个步骤:创建纹理、启用纹理映射和使用纹理坐标和几何坐标绘制,下面我们对三个过程进行阐述,并给出参考代码。1)创建纹理对象并绑定纹理

纹理创建即在内存中创建保存纹理数据的数组,一般是先读入一个图像文件,将图像文件的RGBA信息存入我们创建的纹理空间中,当然图像的位图不同,创建的纹理空间结构也会有所不同。为了更加简单易懂地实现这个过程,我们使用未压缩的纹理。代码:

GLuinttexture[1];//创建一个纹理空间

AUX_RGBImageRec *LoadBMP(CHAR *Filename)//载入位图图像 { FILE *File=NULL;//文件句柄

if(!Filename)//确保文件名已提供

{

return NULL;} File=fopen(Filename, “r”);//尝试打开文件

if(File){

fclose(File);//关闭文件

return auxDIBImageLoadA(Filename);//载入位图并返回指针

} return NULL;} //如果载入失败,返回NULL int LoadGLTextures()//载入位图并转换成纹理 { int Status=FALSE;//状态指示器

AUX_RGBImageRec *TextureImage[1];//创建纹理的存储空间

memset(TextureImage, 0, sizeof(void *)*1);//初始化 //载入位图,检查有无错误,如果位图没找到则退出

if(TextureImage[0]=LoadBMP(“data.bmp”)){

Status=TRUE;

glGenTextures(1,&texture[0]);//创建纹理 //使用来自位图数据生成的典型纹理

glBindTexture(GL_TEXTURE_2D, texture[0]);//生成2D纹理

glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);} if(TextureImage[0])//纹理是否存在{

if(TextureImage[0]->data)//纹理图像是否存在 { 数字图像处理实验指导书

free(TextureImage[0]->data);//释放纹理图像占用的内存

}

free(TextureImage[0]);//释放图像结构

} return Status;//返回Status }

2)启用纹理映射操作,初始化相关参数

在OpenGL中使用纹理映射之前,必须打开纹理映射。int InitGL(GLvoid){ if(!LoadGLTextures())//调用纹理载入子例程

{

return FALSE;} glEnable(GL_TEXTURE_2D);//启用纹理映射

glShadeModel(GL_SMOOTH);//启用阴影平滑

glClearColor(0.0f, 0.0f, 0.0f, 0.5f);//黑色背景

glClearDepth(1.0f);//设置深度缓存

glEnable(GL_DEPTH_TEST);//启用深度测试

return TRUE;}

3)使用纹理坐标和几何坐标绘制 void DrawGLScene(void){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0.0f,0.0f,-5.0f);glRotatef(xrot,1.0f,0.0f,0.0f);glRotatef(yrot,0.0f,1.0f,0.0f);glRotatef(zrot,0.0f,0.0f,1.0f);// 选择纹理

glBindTexture(GL_TEXTURE_2D,texture[0]);//绘制一个正方体,给每个面贴上纹理,并使之转动

glBegin(GL_QUADS);……

glEnd();xrot+=0.3f;yrot+=0.2f;zrot+=0.4f;}

四、实验代码 数字图像处理实验指导书

1、利用直接创建纹理的方法生成二维纹理并映射到四边形上。#include #include

#define imageWidth 64 #define imageHeight 64 GLubyte image[imageWidth][imageHeight][3];

/*绘制一个简单的二维纹理图*/ void makeImage(void){ int i,j,r,g,b;

/*根据点的位置设置不同的颜色*/ for(i = 0;i < imageWidth;i++){

for(j = 0;j

r =(i*j)%255;

g =(i*i)%255;

b =(j*j)%255;

image[i][j][0] =(GLubyte)r;

image[i][j][1] =(GLubyte)g;

image[i][j][2] =(GLubyte)b;

} } } void myInit(void){ glClearColor(0.0,0.0,0.0,0.0);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);// 生成纹理数据 makeImage();// 设置像素存储模式

glPixelStorei(GL_UNPACK_ALIGNMENT,1);/*指定二维纹理映射*/ glTexImage2D(GL_TEXTURE_2D,0,3,imageWidth,imageHeight,0,GL_RGB,GL_UNSIGNED_BYTE,&image[0][0][0]);//纹理过滤函数

/*GL_TEXTURE_2D: 操作D纹理.GL_TEXTURE_WRAP_S: S方向上的贴图模式.GL_CLAMP: 将纹理坐标限制在.0,1.0的范围之内.如果超出了会如何呢.不会错误,只是会边缘拉伸填充.GL_TEXTURE_MAG_FILTER: 放大过滤

GL_LINEAR: 线性过滤, 使用距离当前渲染像素中心最近的个纹素加权平均值.数字图像处理实验指导书

GL_TEXTURE_MIN_FILTER: 缩小过滤

GL_LINEAR_MIPMAP_NEAREST: 使用GL_NEAREST对最接近当前多边形的解析度的两个层级贴图进行采样,然后用这两个值进行线性插值.*/ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);/*设置纹理环境参数*/ //glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);// 启用二维纹理

glEnable(GL_TEXTURE_2D);glShadeModel(GL_FLAT);} void myDisplay(void){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/*将纹理映射到四边形上*/ glBegin(GL_QUADS);/*纹理的坐标和四边形顶点的对应*/ glTexCoord2f(0.0,0.0);glVertex3f(-0.7,-0.25,0.0);glTexCoord2f(0.0,1.0);glVertex3f(-0.2,-0.25,0.0);glTexCoord2f(1.0,1.0);glVertex3f(-0.2,0.25,0.0);glTexCoord2f(1.0,0.0);glVertex3f(-0.7,0.25,0.0);glTexCoord2f(0.0,0.0);glVertex3f(0.2,-0.25,1.875);glTexCoord2f(0.0,1.0);glVertex3f(0.6,-0.25,0.0);glTexCoord2f(1.0,1.0);glVertex3f(0.6,0.25,0.125);glTexCoord2f(1.0,0.0);glVertex3f(0.2,0.25,2.0);glEnd();glFlush();} void myReshape(int w,int h){ glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(80.0,1.0-(GLfloat)w/(GLfloat)h,1.0,30.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();} int main(int argc,char **argv){ /*初始化*/ glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,400);数字图像处理实验指导书

glutInitWindowPosition(200,200);glutCreateWindow(“ Texture ”);//创建窗口 myInit();//绘制与显示

glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);glutMainLoop();return 0;}

2、从外部文件中直接读取纹理实现正方体每个面的纹理映射,并使正方体转动。#include

#include

#include

#include

#include

#pragma comment(lib, “openGL32.lib”)#pragma comment(lib, “glu32.lib”)#pragma comment(lib, “glaux.lib”)#pragma comment(lib,“openGL32.lib”)GLuint texture[1];//创建纹理空间

GLfloat xRot,yRot,zRot;//控制正方体的旋转 //载入位图图像

AUX_RGBImageRec *LoadBMP(CHAR *Filename){

//载入位图图像

FILE *File=NULL;

//文件句柄

if(!Filename){

//确保文件名已提供

return NULL;} File=fopen(Filename, “r”);

//尝试打开文件

if(File){

fclose(File);

//关闭文件

return auxDIBImageLoadA(Filename);

//载入位图并返回指针

} return NULL;

//如果载入失败,返回NULL } int LoadGLTextures(){ //载入位图并转换成纹理

int Status=FALSE;

//状态指示器

AUX_RGBImageRec *TextureImage[1];

//创建纹理的存储空间

memset(TextureImage, 0, sizeof(void *)*1);//初始化 //载入位图,检查有无错误,如果位图没找到则退出

if(TextureImage[0]=LoadBMP(“data.bmp”)){

Status=TRUE;

glGenTextures(1,&texture[0]);

//创建纹理 //使用来自位图数据生成的典型纹理

glBindTexture(GL_TEXTURE_2D, texture[0]);

//生成D纹理

数字图像处理实验指导书

glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);} if(TextureImage[0]){

//纹理是否存在if(TextureImage[0]->data){

//纹理图像是否存在free(TextureImage[0]->data);

//释放纹理图像占用的内存

}

free(TextureImage[0]);

//释放图像结构

} return Status;

//返回Status }

int InitGL(GLvoid){ if(!LoadGLTextures()){

//调用纹理载入子例程

return FALSE;} glEnable(GL_TEXTURE_2D);

//启用纹理映射

glShadeModel(GL_SMOOTH);

//启用阴影平滑

glClearColor(0.0f, 0.0f, 0.0f, 0.5f);

//黑色背景

glClearDepth(1.0f);

//设置深度缓存

glEnable(GL_DEPTH_TEST);

//启用深度测试

return TRUE;}

void display(){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glTranslatef(0.0f,0.0f,-5.0f);

glRotatef(xRot,1.0f,0.0f,0.0f);

glRotatef(yRot,0.0f,1.0f,0.0f);

glRotatef(zRot,0.0f,0.0f,1.0f);

//绘制正方体,贴上纹理并使之转动

glBindTexture(GL_TEXTURE_2D,texture[0]);//选择纹理

glBegin(GL_QUADS);

//前

glTexCoord2f(0.0f, 0.0f);glVertex3f(-1.0f,-1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f);glVertex3f(1.0f,-1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f);glVertex3f(1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);

glEnd();

glBindTexture(GL_TEXTURE_2D,texture[0]);

glBegin(GL_QUADS);

//后

glTexCoord2f(1.0f, 0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);数字图像处理实验指导书

glTexCoord2f(1.0f, 1.0f);glVertex3f(-1.0f, 1.0f,-1.0f);

glTexCoord2f(0.0f, 1.0f);glVertex3f(1.0f, 1.0f,-1.0f);

glTexCoord2f(0.0f, 0.0f);glVertex3f(1.0f,-1.0f,-1.0f);

glEnd();

glBindTexture(GL_TEXTURE_2D,texture[0]);

glBegin(GL_QUADS);

// 上

glTexCoord2f(0.0f, 1.0f);glVertex3f(-1.0f, 1.0f,-1.0f);

glTexCoord2f(0.0f, 0.0f);glVertex3f(-1.0f, 1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f);glVertex3f(1.0f, 1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f);glVertex3f(1.0f, 1.0f,-1.0f);

glEnd();

glBindTexture(GL_TEXTURE_2D,texture[0]);

glBegin(GL_QUADS);

//下

glTexCoord2f(1.0f, 1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);

glTexCoord2f(0.0f, 1.0f);glVertex3f(1.0f,-1.0f,-1.0f);

glTexCoord2f(0.0f, 0.0f);glVertex3f(1.0f,-1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f);glVertex3f(-1.0f,-1.0f, 1.0f);

glEnd();

glBindTexture(GL_TEXTURE_2D,texture[0]);

glBegin(GL_QUADS);

//右

glTexCoord2f(1.0f, 0.0f);glVertex3f(1.0f,-1.0f,-1.0f);

glTexCoord2f(1.0f, 1.0f);glVertex3f(1.0f, 1.0f,-1.0f);

glTexCoord2f(0.0f, 1.0f);glVertex3f(1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 0.0f);glVertex3f(1.0f,-1.0f, 1.0f);

glEnd();

glBindTexture(GL_TEXTURE_2D,texture[0]);

glBegin(GL_QUADS);

//左

glTexCoord2f(0.0f, 0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);

glTexCoord2f(1.0f, 0.0f);glVertex3f(-1.0f,-1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 1.0f);glVertex3f(-1.0f, 1.0f,-1.0f);

glEnd();

glutPostRedisplay();

glutSwapBuffers();

}

void reshape(int w,int h){

if(0 == h)

h = 1;

glViewport(0,0,(GLsizei)w,(GLsizei)h);

glMatrixMode(GL_PROJECTION);数字图像处理实验指导书

glLoadIdentity();

gluPerspective(60.0f,(GLfloat)w /(GLfloat)h,1,100);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

void spinDisplay(void){

xRot += 0.2f;

yRot += 0.2f;

glutPostRedisplay();} void mouse(int button, int state, int x, int y)//鼠标监听 {

switch(button){

case GLUT_LEFT_BUTTON:

if(state == GLUT_DOWN)

glutIdleFunc(spinDisplay);//设备空闲时调用的函数

break;

case GLUT_MIDDLE_BUTTON:

case GLUT_RIGHT_BUTTON:

if(state == GLUT_DOWN)

glutIdleFunc(NULL);

break;

default:

break;

} }

int main(int argc,char** argv){

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

glutInitWindowSize(400,400);

glutInitWindowPosition(100,100);

glutCreateWindow(“Texture Map”);

InitGL();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutMouseFunc(mouse);//鼠标监听

glutMainLoop();

return 0;

}

五、实验结果

1、利用直接创建纹理的方法生成二维纹理并映射到四边形上。数字图像处理实验指导书

2、从外部文件中直接读取纹理实现正方体每个面的纹理映射,并使正方体转动。(按左键转动,按右键停止)

篇3:内部审计外包研究综述

关键词:内部审计外包,可行性分析,独立性

引言

美国的“安然事件”、“世通公司案件”、“施乐公司案件”直至国内的“银广厦”、“麦科特”、“郑百文”等一系列事件使会计信息失真成为热点, 人们在讨论会计诚信和注册会计师职业道德的同时, 也更加清醒地认识到作为审计监督体系重要组成部分的内部审计并没有充分发挥其作用, 认真履行其职能, 使内部审计的有效性大大削弱。在此背景下, 内部审计外部化成为人们关注的焦点。

一、内部审计外包的基本状况

1. 内部审计外包的范围。

Matusik和Hin (1998) 建立了两维模型研究外包的范围。他们对当时学者所提出的业务划分为核心业务和非核心业务的说法表示质疑。Matusik和Hin认为企业业务是否应该外部化是一个相当复杂的决策过程, 这一过程涉及到组织构架的方方面面, 并非简单的取决于该职能是否属于核心职能。他们从企业知识的角度建立了两维矩阵: (1) 私人知识与公共知识; (2) 结构性知识与组件性知识。Matusik和Hin推测组织最有可能将公共的非核心组件性知识外包给外部机构。因为这可以获取尽可能多的公共知识, 同时, 又尽量避免私有知识的外泄。但是, 这样的行为需要靠AICPA的职业道德守则的约束。

2. 内部审计外包的形式。

Barr和Stanley (1993) 概括内部审计外包的形式有三种: (1) 补充。这属于部分外包, 是最简单的一种外部审计协助。当企业面对某个技术性较强的项目或者暂时的工作量需求时会采取这种形式。它一般通过签订短期合约来实现。 (2) 审计管理咨询。这种形式对于有或者没有内部审计部门的企业均适用, 主要通过会计师事务所向企业提供与内审有关的咨询服务如内审机构设置、人员培训招聘等来发挥作用。 (3) 全外包。是指本来没有设立内部审计部门的企业, 当面临业务经营方面的审计需求时, 委托事务所来实施, 一般在中小企业比较流行。Martin和Lavine (2000) 进一步拓展了外包形式的研究, 提出了第四种类型———替代。即由外部机构替代现有的内部审计部门。这种形势下的外包不再是短期的行为, 进而演变成为取代企业内部的专门机构。由于替代这种模式直接威胁到内部审计人员的生存, 因此, 其引起的争议也是最大的。

关于内部审计外部化的形式研究, 国内学者大多建立在分析外包影响因素的基础之上。赵娜 (2006) 从审计效益、人员优势等多个角度分析得出中国的企业应该选择部分外包的形式。张宜 (2006) 认为, 企业在不同的成长期对内部审计的要求不同, 这必然会导致内部审计部门的变化。因此企业应当按照成长周期来进行外包形式的选择。毕华书、魏仲群 (2006) 认为, 内部审计应该在充分考虑企业规模、法律环境、知识管理、外部资源、知识管理等诸多因素的基础上选取合适的资源配置形式, 以寻求最佳的内部审计效果。

3. 内部审计外包的提供者。

Pelfrey和Peacock (1995) 调查发现:近一半的内部审计外包服务是由公司的外部审计师提供的。Kusel等 (1997) 对内部审计外包服务的提供商调查 (如下表所示) :

内部审计外包服务的提供者调查

由此可见, 国际会计师事务所在内部审计外包中扮演了绝对重要的角色, 另外, 关于提供者的选择问题, Aldhizer&Cosshell (1996) 认为, 管理层应充分考虑一下信息: (1) 所能提供外包服务的项目或范围; (2) 内部审计作业管理; (3) 内部审计计划及其执行; (4) 预估的审计总成本或小时费用率; (5) 所派审计人员的经验和水平; (6) 当会计事务所处于忙季时, 所提供的服务是否会受到限制。

4. 内部审计外包的影响因素。

Widener&Selto (1999) 认为, 交易成本是决定内部审计取得方式的关键因素, 而影响交易成本的主要因素包括资产专用程度、行为和环境不确定程度、交易次数等。通过对600家上市公司实证分析后发现:内部审计是否外包受资产专用程度和交易次数的显著影响, 而与行为及环境的不确定程度没有明显关系。Calan&Kirschenheite (2000) 认为外包与否是质量要求与成本控制之间的一种权衡。企业本身对内部控制体系的评价结果也会影响外包, 内部控制体系存在缺陷的可能性越大, 企业就越倾向于外包内部审计。Caplan等 (2000) 把外包需求看成是公司控制风险的函数, 管理者根据公司控制风险的大小进行决策, 结果发现, 当控制风险偏高 (大于0.5) 时, 管理者将趋向于内审外包, 而控制风险偏低 (在0.375~0.5之间) 时则内置。Peter等 (2006) 研究了澳大利亚公司内部审计外包的影响因素, 在99家上市公司中发现有54.5%的公司成立了自己的内部审计机构, 另外45.5%的公司则选择部分或者全部外包。同时, 他们提出一个成本节约、企业规模、内审人员的技术能力及公司战略的四因素模型, 实证发现, 成本节约越多以及外部审计人员的技术能力越强, 则内部审计容易外包。Abbott等 (2007) 从内部审计外包的角度研究公司治理、审计质量和萨班斯法案的关系, 并利用2000年法案颁布前的219家公司数据进行多元回归, 结果发现:审计委员会运作越有效, 公司日常内审活动外包的可能性就越低, 如果审计委员会有权解聘审计官, 外包可能性会更低。刘斌、石恒贵 (2008) 基于交易成本理论和公司治理理论建立了外包程度影响因素的模型, 结果发现, 内审资产的专用性、内审活动的开展频率、审计委员会的有效性是影响内部审计外包程度的主要因素, 即内审资产的专用性越低, 内审活动开展越不频繁, 审计委员会未成立或未有效运作, 公司越可能进行内部审计外包。

二、内部审计外包的可行性分析

对内部审计外包的可行性分析主要从两个方面展开:

1. 内部审计外部化可行性的理论依据。

傅黎瑛 (2007) 通过对交易费用的四个维度进行量化, 利用回归分析方法对内部审计外包的可行性作出检验, 她认为当内部审计资产专有性不强时, 内部审计外包的可能性增加;当内部审计业务频繁时, 外包的可行性随之提高。同时, 环境不确定性以及行为不确定性对外包不存在显著影响。韩晓梅 (2004) 以交易费用理论为基础, 分析了内部审计外包的形成机理。刘峰、刘海燕 (2000) 运用委托代理理论分析内部审计的性质。得出管理者倾向于选择降低代理成本更多的审计方式的结论。潘中华、娄金 (2006) 认为外包是解决内部审计在委托代理关系中的独立性问题的有效途径。张少凤 (2008) 认为, 内部审计根源于受托责任, 并从审计独立性和注册会计师专业胜任能力两个角度分析了内部审计外包的可行性。崔刚 (2005) 从企业战略管理的相关理论出发, 在分析外包原理的基础上, 进一步探讨了外包与企业经营管理及战略发展的深层次关系。孙燕东、赵卓 (2004) 从注册会计师、企业及法律法规的角度对内部审计外部化进行了可行性分析, 他们认为外包可以成为企业和事务所的双赢策略。赵恒伯 (2005) 认为, 因为任何一方单方面的审计工作都难以达到理想的预期, 由此, 外包应运而生了, 他是从舞弊角度来分析外包的可行性的。赵蔚 (2005) 从内部审计在公司治理中的作用入手, 提出内部审计外包在较长时期内不会成为主流, 它的实现需要相应条件的观点。

2. 内部审计外部化优劣势的比较。

Barr&Chang (1993) 关于外包是“福”是“祸”的讨论, 被堪称为内部审计外包的先驱性文献, 受到后来众多研究者的借鉴。他们认为从长远来看, 外包对于大多数人来说是福, 但是对于那些将组织视为长久保护伞的人员和不能客观衡量内部审计费用的部门来说是祸。同时, 又列举了外包在独立性、成本效益等方面的优势以及在忠诚度、对环境的了解等方面的劣势。Caplan&Kirschenheiter (2000) 认为外包唯一的好处是克服了雇佣内审人员契约中的约束条件, 而唯一的劣势则是导致CPA拥有更高的保留工资。Aldhizer Cashell Martin (2003) 认为, 在20世纪90年代, 内部审计外包因为能给企业和会计师事务所带来双赢的经济效应所以而备受推崇。James (2003) 发现外包虽然显著地提高了内部审计的技术水平, 但却没有明显的证据表明提高了公司投资者的信心。Cardillo and Couch (1994) , 认为应当尽可能阻止内审外包的发生, 他们认为在一个公司里有组织的内审机构和训练有素的内审人员将会比以合约形式引入的外部审计人员更有效。索耶等 (2005) 认为, 当外包使内部审计工作成为外部审计的一部分时, 内部审计的评估变得非常棘手。即使内部审计和外部审计分别由两家外部审计公司完成, 如果两家审计公司进行了内部和外部审计的轮换, 那么同样存在独立性和双重评判标准的问题。

国内对于内部审计外包的利弊也是争议不断。支持者认为外包的优点包括:提高审计独立性;促使管理层集中关注核心竞争力和战略计划;节约成本;优化资源配置;稳定审计质量;同一事务所提供的内部审计与外部审计产生协调效应, 从而减少审计收费;提高核心竞争力;充分利用内审无法获得的专门技术;获得最新的前沿实务;可以通过熟悉当地情况的训练有素的员工在国际和跨文化的范围内提供服务 (郭建军, 2007;李文华, 2007;姜薇, 2006;王普查, 2005;时现, 2004;袁清波, 2001等) 。外包反对者则认为外包存在如下缺点:边际成本和机会成本提高;泄露商业秘密的风险;破坏内部审计职能的完整和审计业务的连续性;浪费自身良好的资源优势;削减员工的忠诚度和管理当局的责任感;降低竞争优势;不利于企业文化的融合;缺乏长远规划等 (陈彬彬, 2007;廖建英, 2006;葛卫东, 2006;马金达, 2004;崔秀梅、彭鹏翔、刘静, 2004等) 。学者们和实务界人士大多认为, 内部审计外包和传统的内部审计活动一样, 没有绝对的好或者不好, 外包有时能成功, 有时会失败 (王光远, 2005) 。

从目前的研究来看, 关于内部审计外部化理论依据的研究, 国内研究已经较为成熟, 为外包的实践提供了较为丰富的理论基础。但是, 对于内部审计外包利弊的争论, 学者们各抒己见, 至今, 学术界也没有给出统一的定论。

三、内部审计外包带来的独立性问题

Barr&Stanley (1993) 提出外包的第四种类型——替代 (replacing) , 即外部机构替代现有的内部审计部门, 由此引发的审计人员的独立性问题自然成为人们关注的焦点。George&James (1996) 认为外包形式独立性受到损害的两个最主要原因:一是内审外包带来的高额收入, 二是外包所提供的服务具有一种持续的性质, 这种时间上的持续, 促进了外审人员与客户之间的关系。1996年5月, AICPA职业道德执行委员会发布了道德准则解释IDI, 13《征求意见稿:扩展的审计服务》, 认为外包如果满足以下三个条件就不会损害外部审计人员的独立性: (1) 管理层对内部审计部门负责; (2) 事务所没有成为客户的管理层或雇员, 或扮演类似的角色; (3) 外包的内部审计职能不是从事实时的监控活动。之后, AIC成立了“确认服务特别委员会”, 探讨了由外部审计人员提供的各种确认服务的新形式, 为CPA在独立性方面争夺内审服务提供帮助。Swanger (1998) 的博士论文就会计师事务所同时为客户提供内、外部审计服务时, 财务分析师对事务所独立性、客户财务报告可靠性的理解以及对客户的投资意愿所受到的影响, 通过调查问卷的方式进行了实证研究。结果表明外包本身不存在问题, 审计师独立性问题产生的根本问题在于没有适当保障 (如人员的分离) 。Swanger (1998) 进一步研究发现, 由于独立性的认同越强, 导致对财务报表可靠性认识也越强, 当外包的人员与外部审计人员发生分离时, 回答者相信财务报表差错和舞弊会更少。James (2002) 做了类似研究。Lowe等 (1999) 将外包分为五种情况来考察报表使用者对注册会计师独立性、财务报表可靠性以及投资决策方面的不同认识及影响。结果显示:CPA同时提供财务报表审计和内部审计业务时, 其独立性比仅提供财务报表审计时要低。同一会计师事务所执行财务报表审计和内部审计时, 施行人员分离时的独立性较高。另外, 当外部审计人员履行部分管理职能时, 会对其实施财务报表审计和内部审计的独立性产生负面影响。James (2000) 认为, 为了提高财务报告信息使用者的信心, 公司要么将内部审计外包, 要么设立内部审计部门, 并向审计委员会报告。Swanger&Chewning (2001) 的研究表明, 风险越大, 越可能外包。同时, 如果人员能够分离, 即将内审业务外包给不同的事务所, 那么, 就不会存在独立性问题。

王光远 (2002) 认为, 同一会计师事务所的不同业务部门对同一客户进行不同性质的业务服务并不会影响注册会计师的独立性, 同时, 还可以节约成本, 提高效率。傅黎瑛 (2008) 认为内部审计外包提高了形式上的独立性, 但是是否削弱了实质上的独立性仍难以判断。石恒贵 (2011) 认为内审外包与内审内置的公司其独立性存在显著差异。如果中国内部审计外包费用占总费用的比例达到9%, 并且内审外包主要趋向于咨询服务, 可能导致内审外包影响了审计独立性。

关于内部审计外部化的独立性问题, 国内外学者大多认为内部审计外包本身不存在问题, 如果能够适当的进行人员分离, 那么独立性问题也就能够避免, 国内学者对独立性问题的实证研究并不多, 未来可以进一步深入, 独立性问题也有待通过实证的方法来进一步的检验。

总结与展望

从上述文献回顾的情况来看, 中国学者对内部审计外包的研究主要集中在外包的可行性理论探索和利弊分析上。与国外关于内部审计外包的研究相比, 国内大部分的研究都停留在理论层面, 实证研究较少, 并且研究多以规范研究为主, 缺乏解释性研究。因此, 无论从研究内容的深度和广度上, 国内外研究都存在一定差距。然而, 现有研究的局限性, 也为未来研究的发展提供了广阔的空间。笔者认为未来可以继续从以下几个方面对内部审计外包展开研究: (1) 何卫红、赵佳 (2011) 通过统计2003年以来权威期刊发现:内部审计外包出现回归内置本位的发展趋势, 未来内部审计与外包是相互替代亦或是两者优势互补合作还有待进一步的研究分析。 (2) 萨班斯法案规定, 会计师事务所不能为同一客户提供内、外部审计服务, 但非外部审计的事务所还是可以提供内部审计外包服务的。即2001年SEC颁布的萨班斯法案对内部审计外包的程度存在一定的影响。但是目前尚未有研究来说明这一法案对内部审计外部化的影响。是今后可以研究的一个方向。 (3) 内部控制审计在中国实施以后, 对外包业务是否存在影响, 是积极的影响还是消极的。对独立性的影响又如何, 未来可以结合中国上市公司的实际情况做进一步的深入研究。 (4) 国外学者对于内部审计外包问题的研究采用实证与规范相结合的方法, 国内研究可以借鉴。正如Widener&Selto (1999) 所建议的, 研究人员可进一步进行实地研究 (field study) , 对影响内部审计的外包或内置决策的情形做出更充分的解释。

参考文献

[1]傅黎瑛.内部审计外包中的独立性和决策标准问题研究[J].管理世界, 2008, (9) :177-179.

[2]何卫红, 赵佳.内部审计研究述评:2003—2009[J].审计研究, 2011, (1) :57-62.

[3]Lawrence J.A, S.Parker, G.F.Peters and D.V.Rama“.Corporate governance, aidit quality and the Sarbanes-Oxley Act:evidence frominternal audit outsourcing”[J].Accouting Review, 2007, (82) :235-272.

[4]刘斌, 石恒贵.上市公司内部审计外包决策的影响因素研究[J].审计研究, 2008, (4) :66-73.

[5]石恒贵.内部审计外包与审计独立性[J].商业研究, 2011, (8) :150-155.

[6]王光远, 瞿曲.内部审计外包:述评与展望[J].审计研究, 2005, (2) :11-19.

[7]王光远.关于内部管理审计的外部化问题[J].财会月刊, 2002, (4) :3-4.

篇4:34图形液晶控制实验

[关键词]34x高效课堂三突出四强化四步骤

[中图分类号]G633.41[文献标识码]A[文章编号]167460582015)220036

一、“34x高效课堂”提出背景

我们一直在思考:教师和学生在初中英语课堂上应该扮演什么样的角色?我们的英语课堂教学模式应该是什么样的?近年来我校推进“34x高效课堂”教学模式,既是对全校教师课堂教学的范式要求,又可根据教师教改能力灵活调整,旨在强化课程改革,不断提高课堂教学水平。“34x”中的“3”指三突出:突出学生本位,突出三维目标,突出学生基础习惯培养;“4”指四强化:强化学法指导,强化启发思维,强化激情感染,强化授课条理;“x”指课堂教学的X步骤,因为学科不同,所以步骤也不尽相同。我们英语组集体打磨,共同探讨英语学科的34x模式,初步形成了“344”英语课堂模式。

二、“344”初中英语课堂模式

牛津译林版英语教材按照“话题—功能—结构—任务”相结合的思路编排,每个单元围绕一个话题,共设计welcome to the unit, reading, grammar, integrated skills, study skills和task六个模块,其中integrated skills模块主要训练学生的听说。本文以牛津译林版教材8B Unit 3的integrated skills模块为例,简要阐述“344”初中英语课堂模式。

第一个步骤:Check and explanation(检查与释疑

检查与释疑就是检查学生课前的预学习情况,并对一些共性的问题进行集体答疑。具体实施步骤是:1.教师课前下发资料,资料包含本节课需要掌握的重点以及学生自学的思路点拨和方法,学生先进行有效自学。2.英语课的前10分钟学生组内答疑,组内互查自学情况,并将检查结果记录在册,组长在组内释疑,并将不能解决的疑难问题汇总。3.老师随机抽查,解答组内不能解决的疑难问题。比如任教integrated skills模块时,我先布置学生自学coast等8个生词,然后整理出本节课的重点内容,学生先自己读背,接下来布置学生预习书本内容。这个教学环节中学生是主体,学生组内带读,组内检查,组内释疑,互相学习,突出学生本位,突出学生基础习惯培养。教师在这个环节的主要任务是检查学生自学情况和释疑,解答学生的共性问题。

第二个步骤:Presentation and practice(呈现与操练

呈现与操练是课堂的中心环节,这个环节更加突出教师的主导作用和学生的自我展示。新知呈现的方式丰富多样,不同的呈现方式对学生的学习产生不同的效果。在integrated skills模块教学中,我是这样呈现的:1.integrated skills主要是关于网上澳大利亚旅游,所以在呈现阶段,我先播放澳大利亚的观光旅游视频,让学生先了解澳大利亚的地理位置、主要景点等。2.然后抛出两个问题:Where is Australia? What places of interest can we see in Australia?让学生带着这两个问题,自行阅读听力材料,猜测文中可能要填写的内容。3.播放integrated skills模块的听力材料,学生先自己填写所缺内容,然后组内交流自己所听内容,扫除听力障碍。4.小组PK赛,形式是:小组间互相提问,回答正确小组得分,回答错误不得分。在这样的呈现阶段学生学习热情高涨,突出学生本位,突出三维目标,强化启发思维。[1]教师在呈现阶段,只是提出问题,启发学生思考,激发学生的学习热情,潜移默化中渗透教学内容。

操练即学生展示环节,主要是让学生小组合作,操练所学内容,进行英语口语交际,在交流中自己获取知识。在操练环节,我是这样设计的:1.通过听力训练,学生已经知晓澳大利亚的地理位置、气候等方面知识,所以我设计了一个关于澳大利亚旅游的对话,给出部分问题,学生自行对话。A: Where is Australia? B:... A:What can I see there? B:...设计这样一个对话的目的是巩固刚刚所学重点。2.拓展训练,由澳大利亚迁移到the USA,然后再迁移到the UK,接下来就是学生自由发挥,想去哪儿就去哪儿,想知道哪些知识,就直接提问。设计所有这些活动时,突出三维目标,突出层次递进,教师退于幕后,舞台全部开放给学生,学生自己展示,自己操练,教师只在学生有困难时提供帮助,启发学生的思维,进行适当的学法指导。

第三个步骤:Questioning and answering(提问与答疑

提问与答疑环节主要让学生提出疑问并解决疑难问题,其实也是学生自我反思和整理学习重点的过程。在integrated skills这节课上,有同学提问澳大利亚季节与中国季节相反的问题,有同学问悉尼和北京的时间差,有同学问Would you mind showing me how to start this online tour?的回答有几种……这些问题学生问得非常好,因为它们就是考试的重点。设计提问与释疑这个环节时,我很注重对学生进行正确引导,引导学生回顾本节课重点、难点,引导学生自主整理考点,引导学生互相解决疑难问题,突出学生基础习惯培养。提问与答疑这个环节要求教师能准确预测学情,关注学生的需求,关注学生的问题,具有一定的开放性和探究性。[2]前苏联教育家苏霍姆林斯基说过这样一段精彩的话:“在每个孩子心中最隐秘的一角,都有一根独特的琴弦,拨动它就会发出特有的音响,要使孩子的心同我讲的话发生共鸣,我自身就需要同孩子的心弦对准音调。”课堂教学的终点应该是学生大胆质疑,教师帮助学生解决问题,师生间达到心与心的交流。

第四个步骤:Consolidation and production(巩固运用

当堂巩固运用课堂所学重点是打造高效课堂的保证。这个环节其实是对预设的学习目标进行回归性的检测。巩固运用指以一二四小组为单位合作解决“学习过程”中的重点、难点或疑惑问题或对基础知识的相关拓展,来巩固当堂学习成果,杜绝教师问答式检查答案。integrated skills这节课上我设计了这样两个巩固活动:(1短语翻译(2编网上旅游对话。引导学生先读背当天所学重点短语,然后合书翻译短语,接下来运用所学知识编对话。作为老师在这个环节中需要更多地关注“弱势群体”,多留机会给学习困难的学生,同时鼓励小组的优生带动困难生共同进步,从而达到“兵教兵”“兵练兵”“兵强兵”。[3]课堂当堂训练是课堂课堂教学中教师围绕教学目标,通过具体的教学内容,以适当的训练方式,使学生掌握知识,形成能力,发展智力。

三、“344”初中英语课堂模式反馈

“344”初中英语课堂模式充分体现了南通市课改新理念:教师限时讲授、学生小组合作学习、学生踊跃展示。 经过长期的实践,“344”初中英语课堂模式效果明显,“344”课堂教师讲得少,学生练的多,每个学生在课堂上都积极展示,大胆提问,很有成就感,课堂气氛非常融洽,学生的英语听说读写水平都有大幅提高。在“344” 模式的初中英语课堂中,教师自始至终围绕学生的需求而动,关注学生需要的帮助,整个课堂就是学生自主学习,踊跃展示的舞台。“三突出,四强化,四步骤”在初中英语课堂中的体现是:尊重学生、鼓励学生,启发学生思考,为学生的学习打下手,培养学生自主学习的品质,让学生主动积极地参与到学习中来。

[参考文献]

[1]尹刚.给英语教师的101条建议[M].南京:南京师范大学出版社,2005.

[2]苏霍姆林斯基.给教师的建议[M].北京:教育科学出版社,1982.

[3]邹丽,朱宁波.有效课堂教学策略探究[J].现代中小学教育,20084).

[4]余文森.有效教学十讲[M].上海:华东师范大学出版社,2009.

篇5:34图形液晶控制实验

需要显示的图片如图2所示。可以通过WINDOWS附带的画图工具制作这样一幅320×240的黑白位图。针对这款显示屏是由右向左显示的特点,需要将其垂直对称翻转,最后将处理过的图片以16进制文件的形式烧入外部27256中。该图片数据文件在DSP外部空间的起始地址为:0C000H。

由流程图(图3)可以看出,在系统硬件上电复位后,软件根据用户的需要自动对各项控制器指令代码及其参数进行设置,从而完成对液晶模块的参数(如液晶的行数、列数、扫描频率、光标的位置等)以及显示方式等一系列的初始化过程。在对系统进行正确的初始化以后,可以通过DSP将外部ROM中的数据直接送至SED1335显示缓冲区,控制器就可以控制液晶屏显示出用户所要的图画。同时用户也可以根据自己的需要在主程序运行的过程中改变图片显示的形式,只需在表1中选择相应的指令代码以及参数即可。

设置系统指令及其参数的方法如下:根据用户硬件电路的设计,先将指令代码送到SED1335控制器的命令口地址;然后把该指令的参数依次送到数据口地址,经过系统指令及其参数的设置后,就可以把数据送到数据口地址。具体语法形式如下:

指令设置语句:

STM #XXH,AR0 ;XXH为指令代码

PORTW AR0,#8100H ;8100H为命令口地址

参数设置语句:

STM #XXH,AR0 ;XXH为指令参数

PORTW AR0,#8000H ;8000H为数据口地址

…………

数据输入语句:

STM #XXH,AR0 ;XXH为用户数据

PORTW AR0,#8000H ;8000H为数据口地址

…………

液晶显示屏的初始化程序如下:

INIT:

STM #40H,AR0 ;系统设置命令,指令代码:40H

PORTW WR0,#8100H

STM #10H,AR0 ;标准设置

PORTW AR0,#8000H

STM #87H,AR0 ;设置光标宽度为8

PORTW AR0,#8000H

STM #07H,AR0 ;设置光标高度为8

PORTW AR0,#8000H

STM #27H,AR0;设置LCD每行需要的字节数,

PORTW AR0,#8000H每行320个点,行数为320/8=40

STM #36H,AR0 ;设置液晶的扫描频率约为70Hz

PORTW AR0,#8000H

STM #0F0H,AR0 ;设置LCD的点行数为240

PORTW AR0,#8000H

STM #28H,AR0 ;设置显示屏一行所占显缓的字节数

PORTW AR0,#8000H

STM #00H,AR0

PORTW AR0,#8000H

STM #44H,AR0 ;SCROLL指令,指令代码:44H

PORTW AR0,#8100H

STM #00H,AR0 ;确定第一显示区的首地址

PORTW AR0,#8000H

STM #00H,AR0

PORTW AR0,#8000H

STM #240D,AR0 ;设置第一显示区的行数

PORTW AR0,#8000H

STM #00H,AR0 ;确定第二显示区的首地址

PORTW AR0,#8000H

STM #40H,AR0

PORTW AR0,#8000H

STM #0F0H,AR0 ;设置第二显示区的行数

PORTW AR0,#8000H

STM #00H,AR0 ;确定第三显示区的首地址

PORTW AR0,#8000H

STM #80H,AR0

PORTW AR0,#8000H

STM #4CH,AR0 ;设置光标自动由左向右移动

PORTW AR0,#8100H

STM #5BH,AR0 ;设置显示屏为两层叠加显示方式

PORTW AR0,#8100H

STM #0DH,AR0

PORTW AR0,#8000H

…………

STM #42H,AR0 ;液晶显示屏显缓写指令

PORTW AR0,#8100H

LD #240D,A ;清屏程序

LOOP1:LD #40D,B

LOOP2:STM #00H,AR0

PORTW AR0,#8000H

SUB #1H,B

BC LOOP2,BNEQ

SUB #1H,A

BC LOOP1,ANEQ

RET ;初始化结束

显示图片的主程序如下:

AMIN:STM #800H,SP

CALL INIT ;调用液晶显示屏初始化程序

STM #0C03EH,AR1 ;位图数据相对于BMP文件头的地址

STM #42H,AR0

PORTW AR0,#8100H ;送液晶显示屏缓写指令

LD #240,A

CMP:LD #40,B

CMP1:PORTW AR1+,#8000H;将320×240的位图数据依次写入缓存区

SUB #1,B

BC CMP1,BNEQ

SUB #1,A

BC CMP,ANEQ

B $ ;主程序结束

以上就是该系统的软件设计。由于篇幅有限,这里省略了某些控制指令的设置,用户可根据实际需要添加设置。在实际的软件设计中,DSP汇编语言执行过程中由于本身延时而引起的数据丢失现象,可以适当地加入空指令(NOP)来解决。同时,本程序中使用图片显示的例子只是用来说明控制器的利用方面就显得有些浪费而且灵活性较差。针对那些存储空间有限、效率要求高的系统,可以制作成字模存储在外部ROM中供多次调用,当显示文字时只需计算出显示地址而后调用字模入口地址即可。

篇6:计算机图形学实验

最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮

第一步:构建MFC窗体

打开Visual C++ 6.0编译器 新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。这样一个简单的MFC窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。

第二步:编辑菜单项

选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。双击空白会弹出“菜单项目 属性”对话框。ID:ID_DRAW_LINE;标明:

DrawLine(&D),其它的为缺省。

第三步:建立消息命令

如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。通过“查看—Message Maps—Project:DrawLine—Class name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function„”,其它为默认,最后确定完成。现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。

第四步:添加鼠标消息响应

打开ClassView视窗,右键选定CDrawLineView,选择Add Windows Messsage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。

第五步:添加响应代码

首先,在ClassView视窗中双击CDrawLineView会定位到“DrawLineView.h : interface of the CDrawLineView class”的文件,添加CDrawLineView类的成员:protected: int m_Drag;POINT m_pPrev;POINT m_pOrigin;三个成员变量。视窗中展开CDrawLineView类,双击定位OnLBUTTONDOWN()函数。在该函数消息响应

处添加如下代码:

//建立好绘图的设备环境

CClientDC dc(this);OnPrepareDC(&dc);

dc.DPtoLP(&point);

//获取起始点坐标 m_pPrev=point;m_pOrigin=point;

m_Drag=1;

然后,定位于OnMouseMove(),添加如下代码(其中关键用到了橡皮筋技术):

//建立好绘图的设备环境

CClientDC dc(this);

OnPrepareDC(&dc);dc.DPtoLP(&point);

dc.SetROP2(R2_NOT);//橡皮筋绘图技术

//判断是否BUTTONDOWN

if(m_Drag)

{

dc.MoveTo(m_pOrigin);dc.LineTo(m_pPrev);dc.MoveTo(m_pOrigin);dc.LineTo(point);

}

m_pPrev=point;

最后,在OnLBUTTONDOWN()添加代码: m_Drag=0;

程序运行效果图

实验4 实现圆的生成算法

一、实验目的

1.熟悉CDC图形程序库; 2.掌握中点画圆生成算法; 3.掌握Bresenham画圆算法。

二、实验内容

利用VisualC++6.0设计一个简易画圆绘图板,验证圆生成算法。

三、实验指导

1.生成绘图应用程序的框架,如下图所示。具体实现见第二次实验,过程不再详细说明。

2.在应用程序中增加菜单

完成相关菜单的设计,具体的效果如下图所示,并设置好相关菜单消息的映射,具体的实现在前面的实验中介绍过,再此不在详细说明。

3.在绘图函数中添加代码

通过以上步骤,得到了与菜单对应的消息映射,就可以在函数中添加代码绘制图形了。(1)利用中点画圆算法实现圆的生成(算法原理见教材)。void CDraw_CirView::OnMid(){ // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针

RedrawWindow();//重绘窗口

int x,y,x0=200,y0=200,r=100;//圆的圆心为(x0,y0),半径为r float d;x=0;y=r;d=1.25-r;

pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));while(x<=y){

if(d<0)

{

d=d+2*x+3;

x++;

}

else

{

d=d+2*(x-y)+5;

x++;

y--;}

pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));

pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));

pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));

pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));

pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));

pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));

pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));

pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));} } 由以上代码绘出的图形如下:

(2)利用Bresenham算法生成圆(算法原理见教材)。void CDraw_CirView::OnBre(){ // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针

//RedrawWindow();//重绘窗口

int x,y,x0=200,y0=200,r=50;//圆的圆心为(x0,y0),半径为r int delta,delta1,delta2,direction;x=0;y=r;delta=2*(1-r);while(y>=0){

pDC->SetPixel(x+x0,y+y0,RGB(0,0,255));

pDC->SetPixel(x+x0,-y+y0,RGB(0,0,255));

pDC->SetPixel(-x+x0,y+y0,RGB(0,0,255));

pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,255));

if(delta<0)

{

delta1=2*(delta+y)-1;

if(delta<=0)direction=1;

else direction=2;

}

else if(delta>0)

{

delta2=2*(delta-x)-1;

if(delta2<=0)direction=2;

else direction=3;

}

else direction=2;

switch(direction)

{

case 1:x++;

delta+=2*x+1;

break;

case 2:x++;y--;

delta+=2*(x-y+1);

break;

case 3:y--;

delta+=(-2*y+1);

break;

} } }

由以上代码绘出的图形如下:

(3)以上是本次实验的基本部分,利用中点画圆和Bresenham画圆算法实现的基本图形的绘制。能不能利用该算法,完成一些复杂图形的生成,比如利用基本的画圆算法绘制一个奥运五环。甚至根据画圆算法,实现二次曲线的生成,如椭圆的生成等等。请同学们认真考虑,完成这部分的内容,上机调试。

四、思考

上一篇:西竖中学举行校本教研片活动下一篇:写就一封成功的求职信