/***************************************************
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--);
}