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--);
}
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--);
}
相关文章推荐
- ARM学习之ADC实验
- arm的LCD的学习
- 【ARM学习笔记】实验三:S3C2440A与内存SDRAM连接实验
- ARM学习之触摸屏实验
- Linux独立中断栈学习笔记及验证实验(ARM、x86)
- ARM学习之KEY_ENT实验
- 【ARM学习笔记】实验四:内存管理单元MMU的虚拟地址映射实验
- ARM学习之GPIO实验
- 嵌入式arm学习总结(四)--LCD
- ARM学习笔记--LCD显示
- My_ARM startboard 学习过程中的问题1:LCD显示问题
- 学习 ARM 系列 -- FS2410 开发板上的内存搬移实验
- 【ARM学习笔记】实验一:S3C2440A的GPIO输出实验
- ARM底层学习笔记-裸板实验程序解析-点亮LED
- ARM学习之UART实验
- 【ARM学习笔记】实验二:S3C2440A的GPIO输入实验
- ARM底层学习笔记-裸板实验程序解析-点亮LED
- ARM2440 LCD实验
- ARM学习笔记--SPI总线接口
- ARM指令学习2