[国嵌攻略][061][2440LCD驱动设计]
LCD初始化
1.引脚初始化
2.时序初始化
VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数
VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数
VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算
HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数
HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数
HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算
LCDCON1:
CLKVAL=7 VCLK=HCLK/((CLKVAL+1)*2) VCLK=6.0-7.1MHz HCLK=100MHz
PNRMODE 11
BPPMODE 1100
ENVID
LCDCON2:
VSPW(pulse width) 4
VBPD(back proch) 4
VFPD(front proch) 4
LINEVAL 319 LINEVAL+1=320
LCDCON3:
HBPD(back proch) 1
HFPD(front proch) 14
HOZVAL 239 HOZVAL+1=240
LCDCON4:
HSPW -14 (左边边界)
LCDCON5
FRM560 1
INVVLINE 1
INVVFRAME 1
HWSWP 1
3.帧缓冲初始化
每个像素点用2个字节 16bpp,帧缓冲大小240*320*2
1.分配帧缓冲空间
2.告知帧缓冲地址给LCD控制器
4.杂项初始化
/******************************************************************** *名称:lcd *作者:D *时间:2015.11.18 *功能:液晶显示屏驱动 ********************************************************************/ /******************************************************************** * 宏定义 ********************************************************************/ #define GPCCON ( (*(volatile unsigned long *)0x56000020) ) //GPC组控制寄存器 #define GPDCON ( (*(volatile unsigned long *)0x56000030) ) //GPD组控制寄存器 #define GPGCON ( (*(volatile unsigned long *)0x56000060) ) //GPG组控制寄存器 #define LCDCON1 ( (*(volatile unsigned long *)0X4D000000) ) //LCD控制1寄存器 #define LCDCON2 ( (*(volatile unsigned long *)0X4D000004) ) //LCD控制2寄存器 #define LCDCON3 ( (*(volatile unsigned long *)0X4D000008) ) //LCD控制3寄存器 #define LCDCON4 ( (*(volatile unsigned long *)0X4D00000C) ) //LCD控制4寄存器 #define LCDCON5 ( (*(volatile unsigned long *)0X4D000010) ) //LCD控制5寄存器 #define LCDSADDR1 ( (*(volatile unsigned long *)0X4D000014) ) //帧缓冲起始地址1寄存器 #define LCDSADDR2 ( (*(volatile unsigned long *)0X4D000018) ) //帧缓冲起始地址2寄存器 #define LCDSADDR3 ( (*(volatile unsigned long *)0X4D00001C) ) //帧缓冲起始地址3寄存器 #define TPAL ( (*(volatile unsigned long *)0X4D000050) ) //临时调色板寄存器 #define HIGHT 320 //屏高,vertical #define WIDTH 240 //屏宽,horizontal //LCDCON1配置 #define CLKVAL 7 //CLKVAL[17:8]:4 VCLK=HCLK/((CLKVAL+1)*2) VCLK=6.0-7.1MHz HCLK=100MHz #define PNRMODE 0x3 //PNRMODE[6:5]:11 TFT LCD #define BPPMODE 0xC //BPPMODE[4:1]:1100 16 bpp for TFT #define ENVID_ON 1 //ENVID[0]:0 打开LCD输出 #define ENVID_OFF 0 //ENVID[0]:0 关闭LCD输出 //LCDCON2配置 #define VBPD 1 //VBPD[31:24]:2-1 垂直后肩 #define LINEVAL (HIGHT-1) //LINEVAL[23:14]:240-1 屏高,对应于Vertical Display Active #define VFPD 1 //VFPD[13:6]:2-1 垂直前肩 #define VSPW 12 //VSPW[5:0]:13-1 垂直脉宽,对应于Vertical Blank Time //LCDCON3配置 #define HBPD 1 //HBPD[25:19]:2-1 水平后肩 #define HOZVAL (WIDTH-1) //HOZVAL[18:8]:240-1 屏宽,对应于Horizontal Display Active #define HFPD 1 //HFPD[7:0]:2-1 水平前肩 //LCDCON4配置 #define HSPW 79 //HSPW[7:0]:80-1 水平脉宽,对应于Horizontal Blank Time //LCDCON5配置 #define FRM565 1 //FRM565[11]:1 5:6:5 Format #define INVVLINE 1 //INVVLINE[9]:1 HSYNC Inverted #define INVVFRAME 1 //INVVFRAME[8]:1 VSYNC Inverted #define PWREN_ON 1 //PWREN[3]:1 打开LCD电源 #define PWREN_OFF 1 //PWREN[3]:0 关闭LCD电源 #define HWSWP 1 //HWSWP[0]:1 Swap Enable //TPAL配置 #define TPALEN_ON 1 //TPALEN[24]:1 Enable #define TPALEN_OFF 0 //TPALEN[24]:0 Disable #define TPALVAL 0xFF0000 //TPALVAL[23:16]:RED, TPALVAL[15:8], GREEN,TPALVAL[7:0]:BLUE /******************************************************************** * 全局变量 ********************************************************************/ unsigned short LCDBUFFER[HIGHT][WIDTH]; //帧缓冲320*240*2字节 /******************************************************************** *名称:init_lcd *功能:初始化液晶显示屏 *********************************************************************/ void init_lcd(){ unsigned long LCDBANK; //LCDSADDR1[29:21] 帧缓冲起始地址30:22位 unsigned long LCDBASEU; //LCDSADDR2[20:0] 帧缓冲起始地址21:1位 unsigned long LCDBASEL; //LCDSADDR2[20:0] 帧缓冲结束地址21:1位 unsigned long OFFSIZE; //LCDSADDR3[21:11] 每行偏移的半字 unsigned long PAGEWIDTH; //LCDSADDR3[10:0] 每行字节的半字 //初始化引脚 GPCCON = 0xAAAAAAAA; //GPC15-GPC8:10 VD[7-0], GPC7:10 LCD_LPCREVB, GPC6:10 LCD_LPCREV, GPC5:10 LCD_LPCOE, GPC4:10 VM, GPC3:10 VFRAME, GPC2:10 VLINE, GPC1:10 VCLK, GPC0:10 LEND GPDCON = 0xAAAAAAAA; //GPD15-GPD0:10 VD[23-8] GPGCON |= (0x3<<8); //GPG4[9:8]:11 LCD_PWRDN //初始化时序 LCDCON1 = (CLKVAL<<8)|(PNRMODE<<5)|(BPPMODE<<1)|(ENVID_OFF<<0); LCDCON2 = (VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW<<0); LCDCON3 = (HBPD<<19)|(HOZVAL<<8)|(HFPD<<0); LCDCON4 = (HSPW<<0); LCDCON5 = (FRM565<<11)|(INVVLINE<<9)|(INVVFRAME<<8)|(TPALEN_OFF<<3)|(HWSWP<<0); //初始化帧缓冲 LCDBANK = ((unsigned long)LCDBUFFER>>22)&0x1FF; //取出帧缓冲地址的30:22位 LCDBASEU = ((unsigned long)LCDBUFFER>>1)&0x1FFFFF; //取出帧缓冲起始地址的21:1位 LCDSADDR1 = (LCDBANK<<21)|(LCDBASEU<<0); LCDBASEL = ( (((unsigned long)LCDBUFFER + WIDTH*HIGHT*2)>>1) )&0x1FFFFF; //取出帧缓冲结束地址的21:1位 LCDSADDR2 = (LCDBASEL<<0); OFFSIZE = 0; PAGEWIDTH = WIDTH*2/2; //页宽一个字是2个字节,所以乘以2,又因为该值是半字,所以除以2 LCDSADDR3 = (OFFSIZE<<11)|(PAGEWIDTH<<0); //关闭临时调色板 TPAL = (TPALEN_OFF<<24); //打开液晶显示屏 LCDCON5 |= (PWREN_ON<<3); LCDCON1 |= (ENVID_ON<<0); } /******************************************************************** *名称:clear_lcd *参数: * none *返回: * none *功能:清屏 *********************************************************************/ void clear_lcd(){ //打开临时调色板 TPAL = (TPALEN_ON<<24)|(TPALVAL<<0); }