一、实验目的
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 #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;i 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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务