您的位置:首页 > 其它

ARM学习之LCD实验

2011-10-27 11:27 253 查看
/***************************************************

Project: LCD实验

Writer: SHOW

Time:
2011/10/26

Hareware: 硬件平台:mini2440 , J-link.

Function: LCD循环显示红,绿,蓝三色。

Direction: 1.LCD实验的设置比较麻烦,设置的寄存器很多,可以参考韦东山书籍设置,这样一个一个寄存器搞懂,再设置就比较轻松啦。

看手册可能会麻烦很多。

2.设置控制寄存器时,要对多项时间参数进行设置,这些值也是经验值,可以多调试看效果。

参考代码:国嵌

参考书籍:韦东山《嵌入式linux应用开发完全手册》

***************************************************/

#include "2440addr.h"

#include "def.h"

#include "2440lib.h"

#include "uart.h" //uart.c by xgc

#include "mmu.h"

#define LINE 320

#define WIDTH 480

#define CLK_VALUE 4 // 这些值与液晶本事特性有关,这里的值是根据国嵌的代码设置的。

#define PNRMODE_TFT 3

#define BPPMODE_16bpp 12

#define VBPD 1

#define VFPD 5

#define VSPW 1

#define HBPD 39

#define HFPD 16

#define HSYNC 13

#define HSPW 5

volatile unsigned short LCD_BUFFER[LINE][WIDTH]; //定义320行,240列的数组,用于存放显示数据

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

#define LCD_ADDR ((U32)LCD_BUFFER)

void Set_HCLK_100M(void);

static void Lcd_Port_Init(void);

void Init_Lcd(void);

static void Lcd_ClearScr(U16 c);

void TFT_LCD_Show(void);

void Delay1ms(int times);

static void Pait_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp);

//========================================================================

// 函数名称: 主函数

// 功能描述: 函数入口

// 参数: void

// 返回值: void

//========================================================================

void Main(void)

{

MMU_Init(); // 做这个实验没这个,中断出错。下次出错注意加上。

Set_HCLK_100M(); // 设置HCLK为100M

Init_Lcd();

while(1)

TFT_LCD_Show();

}

//========================================================================

// 函数名称: 初始化LCD端口

// 功能描述


// 参数: void

// 返回值: void

//========================================================================

static void Lcd_Port_Init(void)

{

rGPCUP=0xffffffff; // Disable Pull-up register

rGPCCON=0xaaaa02a8; //Initialize VD[7:0],VM,VFRAME,VLINE,VCLK

rGPDUP=0xffffffff; // Disable Pull-up register

rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]

}

//========================================================================

// 函数名称: 初始化LCD设置

// 功能描述 设置 控制寄存器 LCDCON1~LCDCON5,帧内存地址寄存器 LCDSADDR1~LCDSADDR3

// 参数: void

// 返回值: void

//========================================================================

void Init_Lcd(void)

{

Lcd_Port_Init();

rLCDCON1 = (CLK_VALUE << 8) | (PNRMODE_TFT << 5) | (BPPMODE_16bpp << 1); //时间参数的设置

rLCDCON2 = (VBPD << 24) | ((LINE - 1) << 14) | (VFPD << 6) | (VSPW << 0);

rLCDCON3 = (HBPD << 19) | ((WIDTH - 1) << 8) | (HFPD << 0);

rLCDCON4 = (HSYNC << 8) | (HSPW << 0);

rLCDCON5 = (1 << 11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0);

rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0);

rLCDSADDR2 = M5D((LCD_ADDR + WIDTH * LINE * 2) >> 1); // 这里为什么*2不懂?

rLCDSADDR3 = WIDTH;

rLCDINTMSK |= 3; // 关中断

rTPAL = 0x0; // 不使用调色板功能

rLCDCON1|=1; // 输出使能

}

//========================================================================

// 函数名称: 填充整个屏幕子函数

// 功能描述 320*480个像素点都填充一样的颜色则整个屏都一色啦。

// 参数: c:为像素点颜色分配

// 返回值: void

// PS-> 此函数来源 国嵌ARM精讲班第六天 main.c

//========================================================================

static void Lcd_ClearScr( U16 c)

{

unsigned int x,y ;

for( y = 0 ; y < LINE; y++ )

{

for( x = 0 ; x < WIDTH ; x++ )

{

LCD_BUFFER[y][x] = c ;

}

}

}

//========================================================================

// 函数名称: LCD显示子函数

// 功能描述 依次显示红,绿,蓝

// 参数: void

// 返回值: void

// PS-> 此函数来源 国嵌ARM精讲班第六天 main.c

//========================================================================

void TFT_LCD_Show(void)

{

Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) );//clear screen black

Delay1ms(100000);

Lcd_ClearScr((0x1f<<11) | (0x00<<5) | (0x00));
//red

Delay1ms(100000);

Lcd_ClearScr((0x00<<11) | (0x3f<<5) | (0x00));
//green

Delay1ms(100000);



Lcd_ClearScr((0x00<<11) | (0x00<<5) | (0x1f));
//blue

Delay1ms(100000);

Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x1f) );//clear screen white

Delay1ms(100000);

}



//========================================================================

// 函数名称: PCLK大小设置函数

// 功能描述 设置FCLK=200M,PCLk=50M,HCLK=100M

// 参数: void

// 返回值: void

//========================================================================

#define MPLL_200MHZ ((0x5c<<12) | (0x01<<4) | (0x02))

void Set_HCLK_100M(void)

{

rMPLLCON = 0;

rMPLLCON |= MPLL_200MHZ; // MPLL = FCLK

rCLKDIVN = 0x03; // FCLK:HCLK:PCLK = 1:2:4 => PCLK = 50MHz, HCLK = 100MHz

}

//========================================================================

// 函数名称: 延时1ms子函数

// 实现功能: 延时

// 参数: times为延时的ms数。实际测试不是1ms,注意,有延时功能就行

// 返回值: void

//========================================================================

void Delay1ms(int times)

{

int i;

for( ; times > 0; times-- )

for(i=400; i>0 ; i--);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: