ARM学习之LCD实验

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

你可能感兴趣的:(ARM9裸机编程)