当前位置:首页 > 实验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 \#include\#include \#include\
#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;j
for (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=0xfca86420; //rGREENLUT=0xfca86420;
共分享92篇相关文档