您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页实验7实验报告

实验7实验报告

来源:飒榕旅游知识分享网
实验三 LCD驱动

一、实验目的

1.学习LCD驱动及控制原理。

2.熟悉用ARM内置的LCD控制器驱动LCD。 二、实验内容

通过实验代码,实现在LCD上显示黑红橙黄绿青蓝紫白几个均匀色带,并在最后一个色带显示三基色。

三、实验设备及工具

硬件:ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上。

软件:PC机操作系统win98、Win2000或WinXP、ARM SDT 2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。 四、实验步骤

1.新建工程,将老师给的相关文件添加到工程。 2.构建工程,并接入实验板,观察LCD图像。 源程序分析 (1)主函数: #include \"44b.h\" #include\"uhal.h\" #include \"option.h\" #include\"def.h\"

#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting

extern U32 LCDBuffer[240][320];

//在LCD上显示图形的关键是填充二级显示缓冲,将显示象素的24位颜色信息写入LCDBuffer。将RGB三种基本颜色按一定比例混合即可构成更复杂的颜色,每个象素的三种基本颜色分别占一个字节,可以方便的在程序里改写各基本颜色的数值,从而改变该象素的混合颜色。 int main(void) { int i,j,k; U32 jcolor;

ARMTargetInit(); LCD_Init();

//开发版初始化 //LCD初始化

for (i=0;i<9;i++) { switch (i)

//着色原理:0x000000e0为红色,0x0000e000为绿色,0x00e00000为蓝色,颜色采用8位16进制编码,有三基色混合而成,每种基色占用一个字节,如倒数第两位代表红色亮度,倒数第四位为绿色亮度,倒数第6位为蓝色亮度。数值代表亮度的大小,由0至e分为16级,分别对应亮度由无至亮。由此可以得到16*16*16=4096种颜色。

{ case 0: jcolor=0x00000000; //RGB均为0 黑色 break;

case 1: jcolor=0x000000e0; //R 纯红色 break;

case 2: jcolor=0x0000d0e0; //R +G 橙色 break;

case 3: jcolor=0x0000e0e0; //R +G 黄色 break;

case 4: jcolor=0x0000e000; //G 纯绿色 break;

case 5: jcolor=0x00e0e000; //G+B 青色 break;

case 6: jcolor=0x00e00000; //B 纯蓝色 break;

case 7: jcolor=0x00e000e0; //R+ B 紫色 break;

case 8: jcolor=0x00e0e0e0; //R+G+B最大 白色 break; }

//以下为控制色带宽度和长度的部分,其中,k为行标记,j为列标记。第一个循

环表示取整个k=240即0——240行为一个单元。后面的循环为对不同色彩的色带分列,其中前面的循环已经控制i的值由0——9,再由for (j=i*32;jfor (j=i*32;j//此处是对最后一个列的色带再均分为三行,形成三个新的色带,写入三基色 jcolor=0x000000ff; for (i=0;i<240;i++) {if (i==80||i==160) jcolor<<=8; for (j=288;j<320;j++) LCDBuffer[i][j]=jcolor; }

LCD_Refresh() ; while(1); }

(2)LCD320的内部驱动代码: #include #include #include \"def.h\" #include \"44b.h\" #include \"LCD320.h\"

#define LCDCON1_ENVID #define LCDCON1_INVVD

(1) (1<<1)

return 0;

#define LCDCON1_INVFRAME (1<<2)

#define LCDCON1_INVLINE #define LCDCON1_INVCLK #define LCDCON1_MMODE #define L248 #define CLKVAL

(8)

(20)

(1<<3) (1<<4) (1<<7)

// 60Mhz, fr=100Hz (CLKVAL=38.6)

//#define M5D(n) ((n) & 0x1fffff)

U32* pLCDBuffer16=(U32*)0xc000000; //一级缓存指针 U32 LCDBuffer[LCDHEIGHT][LCDWIDTH];//二级缓存

void LCD_Init() //设置各功能寄存器,清空显示缓存区 {

LCDDisplayOpen(FALSE); rLCDCON1=(0);

// disable

rLCDCON2=(239)|(119<<10)|(15<<21);

//320x240LCD LINEBLANK=15 (without any calculation) LCDBANK=0xc000000>>22;//((U32)LCDBuffer16)>>22; LCDBASEU=0x0;//((U32)LCDBuffer16)&0x3fffff; LCDBASEL=LCDBASEU+(160)*240;

|(LCDBANK<<21)|LCDBASEU;//|

int i;

U32 LCDBASEU,LCDBASEL,LCDBANK;

rLCDSADDR1= (0x3<<27) ((((U32)LCDBuffer16)>>1)&0x7ffffff);

// color_mode, LCDBANK, LCDBASEU rLCDSADDR2= (0<<29)|(0<<21)|LCDBASEL; rLCDSADDR3= (320/2)|(0<<9); //No virtual screen. //rREDLUT=0xfca820; //rGREENLUT=0xfca820;

//rBLUELUT=0xfffff840; rREDLUT=0xfca820; rGREENLUT=0xfca820; rBLUELUT=0xfffffa50;

rLCDCON1=LCDCON1_ENVID|0<<1|0<<2|0<<3|(2<<5)|1<<7|(0x3<<8)|(0x3<<10)|(CLKVAL<<12); //|LCDCON1_MMODE; }

void LCDDisplayOpen(U8 isOpen) {

if(isOpen){ } else{ }

rPDATB|=LCDDisplayPin; rPDATB&=~LCDDisplayPin;

// enable,8B_SNGL_SCAN,WDLY=16clk,WLH=16clk,CLKVAL=? for(i=0;i<80*240;i++)

*(pLCDBuffer16+i)=0x0;

Delay(5000);

LCDDisplayOpen(TRUE);

}

void LCD_Refresh()

//此函数主要是将二级缓存LCDBuffer的数据由32位彩色图形信息转换成8位256色的图形信息,然后放到pLCDBuffer16指向的一级缓存。

转换公式:pixcolor=(pbuf[0]&0xe0)|((pbuf[1]>>3)&0x1c)|(pbuf[2]>>6)。

其中,pbuf[0]、pbuf[1]、pbuf[2]是一个象素的32位彩色数据的前24位,分别代表R、G、B { int i,j;

U32 lcddata;

U32 pixcolor; //一个像素点的颜色

U8* pbuf=(U8*)LCDBuffer[0];

for(i=0;ifor(j=24;j>=0;j-=8){

pixcolor=(pbuf[0]&0xe0)|((pbuf[1]>>3)&0x1c)|(pbuf[2]>>6); //转换色彩

lcddata|=pixcolor<显示结果:

最终,LCD将显示如下图像: }

}

*(pLCDBuffer16+i)=lcddata;

pbuf+=4;

五、实验心得:

此实验的原理是在LCD上显示256色图形的关键是填充二级显示缓冲,将显示象素的24位颜色信息写入LCDBuffer。将RGB三种基本颜色按一定比例混合即可构成更复杂的颜色,每个象素的三种基本颜色分别占一个字节,可以方便的在程序里改写各基本颜色的数值,从而改变该象素的混合颜色。通过本次实验,我学习了LCD驱动及控制原理;熟悉了用ARM内置的LCD控制器驱动LCD。但是在代码方面还是有很多不懂的地方,勉强可以接受。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务