FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕

使用开发板类型为:STM32F407系列

一、屏的相关信息

分辨率:320*480
尺寸:3.5寸
驱动器:ILI9486L
引脚接口:
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕

我们这里选用16-bts 8080-series MCU
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
IM[]为010,使用了16个数据引脚。

二、驱动器设置

FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
通过部分我们可以得到信息:

CSX: 片选信号,用于启用或者禁用ILI9486L芯片
RESX: 复位信号
WRX: 读信号
RDX: 写信号
DB[17:0]: 并行数据总线
D/CX: 数据/命令选择的信号,当D/CX= ' 1 '时,DB[17:0]位显示RAM数据
或命令参数。当D/CX= ' 0 '时,D B[17:0]位是命令。

FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
通过此表可以得到:

写命令:WRX处于上升沿,RDX:处于拉高,D/CX处于拉低
写数据:WRX处于上升沿,RDX处于拉高,D/CX处于拉高
读取内部状态:WRX处于拉高  RDX处于上升沿 D/CX处于拉高
读取参数显示数据:WRX处于拉高  RDX处于上升沿 D/CX处于拉高

时序图
写时序:
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
从图中可以得到,CSX拉低选中,RESX拉高,D/CX处于拉低RDX拉高时,WRX在上升沿时候发送命令。D/CX在拉高RDX拉高时,WRX在上升沿时候发送数据。

读时序
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
同理,当WRX拉高,RDX处于上升沿,D/CX拉高时处于读状态。
指令表
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
常用的三个为例:
Column Address Set,意思是设置列地址,首先发送命令2Ah表示我要设置列地址,然后SC意思是列起始地址,EC意思就是列终止地址。
Page Address Set,就是页地址设置,操作方法类比Column Address Set
Memory Write,就是写入,首先发送命令2Ch然后发送要写的数据。

三、FSMC

开头就说了,我们使用的是16位的8080并行接口。我们看一下F4的数据手册。
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
接口部分并没有8080接口,我们要如何操作呢,在OLED中我们使用过模拟SPI,模拟SPI的时序,实现需要的功能,那么我们可不可以模拟8080接口呢?当然可以。
在数据手册2.2.9章节中我们可以看到这样对FSMC的解释
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
画线部分清除说明了支持Intel 8080和Motorola 6800模式,灵活适应特定的LCD接口。所以我们可以通过FSMC来实现并行8080.
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
FSMC框图:
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
FSMC_NE[4:1]-----片选
FSMC_NOE-------读
FSMC_NWE-------写
FSMC_A[25:0]------地址
FSMC_D[15:0]------并行数据线
我们看一下F4的时钟树
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
可以发现,内部存储也就是红色框里面,通过AHB总线可以直接访问,右边紫色框里面外部存储器,先通过FSMC控制器然后通过AHB3传输到AHB总线的,所以下面我们第一步就是要将外部存储和FSMC连接起来
存储映射
独立编址:对外部存储芯片独立编址,比如0x00在外部芯片里面表示就是外部芯片地址的起始位置。
统一编址:在stm32中0x00表示32里面的一个地址,假设32内部的地址空间为0~1000,其中一部分是留作外设存储器用的地址,32内部是并没有用的。假设0-499和600-1000是32内部用到的地址,那么500-599就是外部存储器的地址,此时外部存储器的起始地址就不再是0x00了,是500。
看一下F4的地址映射框图
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕

上图就是外部存储空间的地址映射,简单理解就是将外部芯片额地址挂载在32里面的地址上面,客观化理解就是意思就是地址里面存地址。可以看到我们操控外部存储的地址一共有4块bank1、bank2、bank3、bank4。在F4参考手册里面对这四块做了详细划分:
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
在FSMC框图里面的FSMC_NE[4:1]-----片选
第一块:6000 0000h–63ff ffffh 片选 FSMC_NE1
第二块:6400 0000h–67ff ffffh 片选 FSMC_NE2
第三块:6800 0000h–6bff ffffh 片选 FSMC_NE3
第四块:6c00 0000h–6fff ffffh 片选 FSMC_NE4

FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
上图可以看到映射关系:存储区域 1 NOR/PSRAM 1就是bank1,我们只需要将HADDR的26,27位设为00就可以选择bank1然后FSMC_NE1拉低就选中了。
FSMC例子
说了这么多我们来举个例子吧!
有这IS62WV51216这样一块RAM芯片
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
IS62WV51216框图
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
可以看到共512k地址,一个地址存16位数据。
回顾一下我们的FSMC框图
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
这样一个外设RAM要和FSMC怎么连接呢?
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
是不是就是这样咯。
下面我们要注意一下地址偏移:
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
可以看到mode后面跟的就是otyper,为什么偏移地址是4呢,一个地址对应一个字节,一个字节8位,mode里面用了32位,所以就是4个字节,所以下一个otyper就要偏移4个字节。
再看一下IS62WV51216的框图
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
发现一个数据是16位,2个字节。所以每次偏移为2个字节。

那么有个问题了?
首先,CPU中一个地址只能存储一个字节的数据,而当CPU通过地址线访问外部存储器的一个地址时,如果外部储存器的一个地址的数据刚好是八位时(即一个字节),访问一次就可接收过来;但是,当外部存储器的一个地址里存的是16位数据时(即两个字节),CPU就开始傻眼了,“我访问你一次,你竟然给我两个字节的数据!!!”要怎么办呢?
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
在cpu端我们0x0读取FSMC_A的0x0两个数据,我们让CPU端0x00和0x01存储FSMC_A 0x00的两个数据。下一次cpu从0x02开始接收FSMC_A.也就是一次偏移两个地址。

CPU为了解决这个问题,只能够再派一个地址去访问外部存储器的同一个地址,把剩下的那个字节也接收过来,之后再接着访问外部存储器的第二个地址,依此类推。。。在此过程中,CPU如果还是把地址线一对一地连接到外部存储器上,那就做不到让自己的第二个地址还继续访问同一个地址了。。。(其中解释太复杂,我到现在还是不是特别捋的清楚),直接看结果就行,就是CPU实现了顺序两个地址访问外设端口一个地址。把2个字节数据都取走了。
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
模拟8080时序

FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
FSMC的时序有很多种,我们需要选择最相似的来模拟,比如这个写时序,对应引脚都规划好了
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
注意上图中的D/CX引脚,这个引脚高低决定像LCD发送的是命令还是数据,在原理图中我们发现D/CX连的是A6,也就是地址线里面的第六个。注意!!!
FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕
因为偏移,说的是A6实际上是第七位。
也就是
HADDR[7]=0;表示命令
HADDR[7]=1;表示数据
硬件接口

FSMC版本:多驱动器(ILI9486L等)驱动TFTLCD屏幕

FSMC IO 模式
FSMC_NE4 PG12 复用映射FSMC
FSMC_NEW PD5 复用映射FSMC
FSMC_NOE PD4 复用映射FSMC
A6 PF12 复用映射FSMC
LCD_BL PB15 通用推挽
D0 PD14 复用映射FSMC
D1 PD15 复用映射FSMC
D2 PD0 复用映射FSMC
D3 PD1 复用映射FSMC
D4 PE7 复用映射FSMC
D5 PE8 复用映射FSMC
D6 PE9 复用映射FSMC
D7 PE10 复用映射FSMC
D8 PE11 复用映射FSMC
D9 PE12 复用映射FSMC
D10 PE13 复用映射FSMC
D11 PE14 复用映射FSMC
D12 PE15 复用映射FSMC
D13 PD8 复用映射FSMC
D14 PD9 复用映射FSMC
D15 PD10 复用映射FSMC

四、代码

首先我们配置IO,模式如同上表

/*IO配置*/
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟
	RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟
	
  GPIO_InitTypeDef  GPIO_InitStructure;
  //PB15 推挽输出,控制背光 LCD_BL
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 //PB15 推挽输出,控制背光

	//D0~D3 D13~D15 FSMC_NEW FSMC_NOE
	GPIO_InitStructure.GPIO_Pin = (3<<0)|(3<<4)|(7<<8)|(3<<14);//PD0,1,4,5,8,9,10,14,15 AF OUT
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
  //D4~D12
	GPIO_InitStructure.GPIO_Pin = (0X1FF<<7);//PE7~15,AF OUT
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
  //PF12,FSMC_A6
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化
	
  //PG12,FSMC_NE4
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化
//复用映射到FSMC
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);//PD0,AF12
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);//PD1,AF12
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15,AF12

	GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);//PE7,AF12
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15,AF12

	GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);//PF12,AF12
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC);

然后我们配置读写时序,这里最好调用别人配置好的,厂家给好的就行,自己配置问题多到怀疑人生!!!

  //读写时序
	FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
	FSMC_NORSRAMTimingInitTypeDef  writeTiming;
  //读时序
	readWriteTiming.FSMC_AddressSetupTime = 0X0F;	 //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns
	readWriteTiming.FSMC_AddressHoldTime = 0x00;	 //地址保持时间(ADDHLD)模式A未用到
	readWriteTiming.FSMC_DataSetupTime = 0x3C;			//数据保存时间为60个HCLK	=6*60=360ns
	readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
	readWriteTiming.FSMC_CLKDivision = 0x00;
	readWriteTiming.FSMC_DataLatency = 0x00;
	readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;	 //模式A
  //写时序
	writeTiming.FSMC_AddressSetupTime =0x09;	      //地址建立时间(ADDSET)为9个HCLK =54ns
	writeTiming.FSMC_AddressHoldTime = 0x00;	 //地址保持时间(A
	writeTiming.FSMC_DataSetupTime = 0x08;		 //数据保存时间为6ns*9个HCLK=54ns
	writeTiming.FSMC_BusTurnAroundDuration = 0x00;
	writeTiming.FSMC_CLKDivision = 0x00;
	writeTiming.FSMC_DataLatency = 0x00;
	writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;	 //模式A

接着就是FSMC的初始化

	FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
	
	FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  这里我们使用NE4 ,也就对应BTCR[6],[7]。
	FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
	FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM
	FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit
	FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
	FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
	FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
	FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
	FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
	FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;	//  存储器写使能
	FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
	FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
	FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
	FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
	FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序

	FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

	FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);  // 使能BANK1

接下来就是应用了
应用
我们初始化完FSMC,IO,后我们是不是已经给屏幕连接好了。下面就是给屏幕跑起来吗,硬件部分搭建好了,接下来就是软件部分了嘛。
首先是数据传输:
如何确定我们传输的是命令还是数据呢,这里面我们用的是地址线A6的值来判断,也就是HADDR[7],为什么偏移一位上面说了。我们只需要A6的值就行,别的是不是在NE4的范围内想写啥就写啥嘛。
我们定义这样一个地址:

//LCD地址结构体
typedef struct
{
  volatile uint16_t LCD_REG;//HADDR7 = A6 = 0 给LCD屏发送指令//0x6C00 007E
  volatile uint16_t LCD_RAM;//HADDR7 = A6 = 1 给LCD屏发送数据//0x6C00 0080
} LCD_TypeDef;
 //0X7E = 0111 1110  HADDR[7]是0哈,不是1.0~7 7是第八个数
 #define LCD_BASE        ((uint32_t)(0x6C000000 | 0x0000007E))
 #define TFTLCD          ((LCD_TypeDef *) LCD_BASE)

如果我们有这样两个调用

TFTLCD->LCD_REG
TFTLCD->LCD_RAM
TFTLCD->LCD_REG 调用的是不是就是基地址0x6C00007E
TFTLCD->LCD_RAM 调用的地址是不是就是0x6C000080

0x6C00007E+2 是不是就是0x6C000080
为啥加2 注意LCD_TypeDef结构体里面是uint16_t 表示两个字节所以加2
0X7E : 0X0111 1110______A6=0 表示写命令
0X80 : 0X1000 0000______A6=1 表示写数据
如此:TFTLCD->LCD_REG 就相当于写命令
TFTLCD->LCD_RAM 就表示写数据
我们看一下写函数:

//写命令
void LCD_WR_REG(volatile uint16_t regval)
{
  regval=regval;		//使用-O2优化的时候,必须插入的延时
  TFTLCD->LCD_REG=regval;//写入要写的寄存器序号
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(volatile uint16_t data)
{
  data=data;			//使用-O2优化的时候,必须插入的延时
  TFTLCD->LCD_RAM=data;
}
//读LCD数据
//返回值:读到的值
uint16_t LCD_RD_DATA(void)
{
  volatile uint16_t ram;			//防止被优化
  ram=TFTLCD->LCD_RAM;
  return ram;
}
//写寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)
{
  TFTLCD->LCD_REG = LCD_Reg;		//写入要写的寄存器序号
  TFTLCD->LCD_RAM = LCD_RegValue;//写入数据
}
//读寄存器
//LCD_Reg:寄存器地址
//返回值:读到的数据
uint16_t LCD_ReadReg(uint16_t LCD_Reg)
{
  LCD_WR_REG(LCD_Reg);		//写入要读的寄存器序号
  Delay_us(5);
  return LCD_RD_DATA();		//返回读到的值
}

接下来我们是不是可以根据屏幕的指令来启动屏幕。
这部分代码比较长我就放在最后整体工程代码里面了。多个版本的启动流程太长了。
显示函数,图片,字符啊等等原理模式可以参考我上一篇OLED的博客,OLED驱动
具体代码下面总工程代码里面也有。

五、工程源码整合

bsp_lcd.c

#include "bsp_lcd.h"
#include "bsp_font.h"

//LCD的画笔颜色和背景色
uint16_t POINT_COLOR=0x0000;	//画笔颜色
uint16_t BACK_COLOR=0xFFFF;  //背景色

//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;

//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(volatile uint16_t regval)
{
  regval=regval;		//使用-O2优化的时候,必须插入的延时
  TFTLCD->LCD_REG=regval;//写入要写的寄存器序号
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(volatile uint16_t data)
{
  data=data;			//使用-O2优化的时候,必须插入的延时
  TFTLCD->LCD_RAM=data;
}
//读LCD数据
//返回值:读到的值
uint16_t LCD_RD_DATA(void)
{
  volatile uint16_t ram;			//防止被优化
  ram=TFTLCD->LCD_RAM;
  return ram;
}
//写寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)
{
  TFTLCD->LCD_REG = LCD_Reg;		//写入要写的寄存器序号
  TFTLCD->LCD_RAM = LCD_RegValue;//写入数据
}
//读寄存器
//LCD_Reg:寄存器地址
//返回值:读到的数据
uint16_t LCD_ReadReg(uint16_t LCD_Reg)
{
  LCD_WR_REG(LCD_Reg);		//写入要读的寄存器序号
  Delay_us(5);
  return LCD_RD_DATA();		//返回读到的值
}
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
  TFTLCD->LCD_REG=lcddev.wramcmd;
}
//LCD写GRAM
//RGB_Code:颜色值
void LCD_WriteRAM(uint16_t RGB_Code)
{
  TFTLCD->LCD_RAM = RGB_Code;//写十六位GRAM
}
//从ILI93xx读出的数据为GBR格式,而我们写入的时候为RGB格式。
//通过该函数转换
//c:GBR格式的颜色值
//返回值:RGB格式的颜色值
uint16_t LCD_BGR2RGB(uint16_t c)
{
  uint16_t  r,g,b,rgb;
  b=(c>>0)&0x1f;
  g=(c>>5)&0x3f;
  r=(c>>11)&0x1f;
  rgb=(b<<11)+(g<<5)+(r<<0);
  return(rgb);
}
//当mdk -O1时间优化时需要设置
//延时i
void opt_delay(uint8_t i)
{
  while(i--);
}
//读取个某点的颜色值
//x,y:坐标
//返回值:此点的颜色
uint16_t LCD_ReadPoint(uint16_t x,uint16_t y)
{
  uint16_t r=0,g=0,b=0;
  if(x>=lcddev.width||y>=lcddev.height)return 0;	//超过了范围,直接返回
  LCD_SetCursor(x,y);
  if(lcddev.id==0X9341||lcddev.id==0X9486||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X1963)LCD_WR_REG(0X2E);//9341/6804/3510/1963 发送读GRAM指令
  else if(lcddev.id==0X5510)LCD_WR_REG(0X2E00);	//5510 发送读GRAM指令
  else LCD_WR_REG(0X22);      		 			//其他IC发送读GRAM指令
  if(lcddev.id==0X9320)opt_delay(2);				//FOR 9320,延时2us
  r=LCD_RD_DATA();								//dummy Read
  if(lcddev.id==0X1963)return r;					//1963直接读就可以
  opt_delay(2);
  r=LCD_RD_DATA();  		  						//实际坐标颜色
  if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510)		//9341/NT35310/NT35510要分2次读出
  {
    opt_delay(2);
    b=LCD_RD_DATA();
    g=r&0XFF;		//对于9341/5310/5510,第一次读取的是RG的值,R在前,G在后,各占8位
    g<<=8;
  }
  if(lcddev.id==0X9325||lcddev.id==0X9486||lcddev.id==0X4535||lcddev.id==0X4531||lcddev.id==0XB505||lcddev.id==0XC505)return r;	//这几种IC直接返回颜色值
  else if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510)return (((r>>11)<<11)|((g>>10)<<5)|(b>>11));//ILI9341/NT35310/NT35510需要公式转换一下
  else return LCD_BGR2RGB(r);						//其他IC
}
//LCD开启显示
void LCD_DisplayOn(void)
{
  if(lcddev.id==0X9341||lcddev.id==0X9486||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X1963)LCD_WR_REG(0X29);	//开启显示
  else if(lcddev.id==0X5510)LCD_WR_REG(0X2900);	//开启显示
  else LCD_WriteReg(0X07,0x0173); 				 	//开启显示
}
//LCD关闭显示
void LCD_DisplayOff(void)
{
  if(lcddev.id==0X9341||lcddev.id==0X9486||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X1963)LCD_WR_REG(0X28);	//关闭显示
  else if(lcddev.id==0X5510)LCD_WR_REG(0X2800);	//关闭显示
  else LCD_WriteReg(0X07,0x0);//关闭显示
}
//设置光标位置
//Xpos:横坐标
//Ypos:纵坐标
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
  if(lcddev.id==0X9341||lcddev.id==0X5310)
  {
    LCD_WR_REG(lcddev.setxcmd);
    LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);
    LCD_WR_REG(lcddev.setycmd);
    LCD_WR_DATA(Ypos>>8);LCD_WR_DATA(Ypos&0XFF);
  }
	else if (lcddev.id==0X9486)
	{
		LCD_WR_REG(lcddev.setxcmd);
		LCD_WR_DATA(Xpos>>8);
		LCD_WR_DATA(Xpos&0XFF); 
		LCD_WR_DATA((lcddev.width-1)>>8);
		LCD_WR_DATA((lcddev.width-1)&0xFF);				
		LCD_WR_REG(lcddev.setycmd);
		LCD_WR_DATA(Ypos>>8);
		LCD_WR_DATA(Ypos&0XFF);
		LCD_WR_DATA((lcddev.height-1)>>8);
		LCD_WR_DATA((lcddev.height-1)&0xFF);
	}
	else if(lcddev.id==0X6804)
  {
    if(lcddev.dir==1)Xpos=lcddev.width-1-Xpos;//横屏时处理
    LCD_WR_REG(lcddev.setxcmd);
    LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);
    LCD_WR_REG(lcddev.setycmd);
    LCD_WR_DATA(Ypos>>8);LCD_WR_DATA(Ypos&0XFF);
  }else if(lcddev.id==0X1963)
  {
    if(lcddev.dir==0)//x坐标需要变换
    {
      Xpos=lcddev.width-1-Xpos;
      LCD_WR_REG(lcddev.setxcmd);
      LCD_WR_DATA(0);LCD_WR_DATA(0);
      LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);
    }else
    {
      LCD_WR_REG(lcddev.setxcmd);
      LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);
      LCD_WR_DATA((lcddev.width-1)>>8);LCD_WR_DATA((lcddev.width-1)&0XFF);
    }
    LCD_WR_REG(lcddev.setycmd);
    LCD_WR_DATA(Ypos>>8);LCD_WR_DATA(Ypos&0XFF);
    LCD_WR_DATA((lcddev.height-1)>>8);LCD_WR_DATA((lcddev.height-1)&0XFF);

  }else if(lcddev.id==0X5510)
  {
    LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(Xpos>>8);
    LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(Xpos&0XFF);
    LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(Ypos>>8);
    LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(Ypos&0XFF);
  }else
  {
    if(lcddev.dir==1)Xpos=lcddev.width-1-Xpos;//横屏其实就是调转x,y坐标
    LCD_WriteReg(lcddev.setxcmd, Xpos);
    LCD_WriteReg(lcddev.setycmd, Ypos);
  }
}
//设置LCD的自动扫描方向
//注意:其他函数可能会受到此函数设置的影响(尤其是9341/6804这两个奇葩),
//所以,一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
//dir:0~7,代表8个方向(具体定义见lcd.h)
//9320/9325/9328/4531/4535/1505/b505/5408/9341/5310/5510/1963等IC已经实际测试
void LCD_Scan_Dir(uint8_t dir)
{
  uint16_t regval=0;
  uint16_t dirreg=0;
  uint16_t temp;
  if((lcddev.dir==1&&lcddev.id!=0X6804&&lcddev.id!=0X1963)||(lcddev.dir==0&&lcddev.id==0X1963))//横屏时,对6804和1963不改变扫描方向!竖屏时1963改变方向
  {
    switch(dir)//方向转换
    {
    case 0:dir=6;break;
    case 1:dir=7;break;
    case 2:dir=4;break;
    case 3:dir=5;break;
    case 4:dir=1;break;
    case 5:dir=0;break;
    case 6:dir=3;break;
    case 7:dir=2;break;
    }
  }
  if(lcddev.id==0x9341||lcddev.id==0X9486||lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X5510||lcddev.id==0X1963)//9341/6804/5310/5510/1963,特殊处理
  {
    switch(dir)
    {
    case L2R_U2D://从左到右,从上到下
      regval|=(0<<7)|(0<<6)|(0<<5);
      break;
    case L2R_D2U://从左到右,从下到上
      regval|=(1<<7)|(0<<6)|(0<<5);
      break;
    case R2L_U2D://从右到左,从上到下
      regval|=(0<<7)|(1<<6)|(0<<5);
      break;
    case R2L_D2U://从右到左,从下到上
      regval|=(1<<7)|(1<<6)|(0<<5);
      break;
    case U2D_L2R://从上到下,从左到右
      regval|=(0<<7)|(0<<6)|(1<<5);
      break;
    case U2D_R2L://从上到下,从右到左
      regval|=(0<<7)|(1<<6)|(1<<5);
      break;
    case D2U_L2R://从下到上,从左到右
      regval|=(1<<7)|(0<<6)|(1<<5);
      break;
    case D2U_R2L://从下到上,从右到左
      regval|=(1<<7)|(1<<6)|(1<<5);
      break;
    }
    if(lcddev.id==0X5510)dirreg=0X3600;
    else dirreg=0X36;
    if((lcddev.id!=0X5310)&&(lcddev.id!=0X5510)&&(lcddev.id!=0X1963))regval|=0X08;//5310/5510/1963不需要BGR
    if(lcddev.id==0X6804)regval|=0x02;//6804的BIT6和9341的反了
    LCD_WriteReg(dirreg,regval);
    if(lcddev.id!=0X1963)//1963不做坐标处理
    {
      if(regval&0X20)
      {
        if(lcddev.width<lcddev.height)//交换X,Y
        {
          temp=lcddev.width;
          lcddev.width=lcddev.height;
          lcddev.height=temp;
        }
      }else
      {
        if(lcddev.width>lcddev.height)//交换X,Y
        {
          temp=lcddev.width;
          lcddev.width=lcddev.height;
          lcddev.height=temp;
        }
      }
    }
    if(lcddev.id==0X5510)
    {
      LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(0);
      LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(0);
      LCD_WR_REG(lcddev.setxcmd+2);LCD_WR_DATA((lcddev.width-1)>>8);
      LCD_WR_REG(lcddev.setxcmd+3);LCD_WR_DATA((lcddev.width-1)&0XFF);
      LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(0);
      LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(0);
      LCD_WR_REG(lcddev.setycmd+2);LCD_WR_DATA((lcddev.height-1)>>8);
      LCD_WR_REG(lcddev.setycmd+3);LCD_WR_DATA((lcddev.height-1)&0XFF);
    }else
    {
      LCD_WR_REG(lcddev.setxcmd);
      LCD_WR_DATA(0);LCD_WR_DATA(0);
      LCD_WR_DATA((lcddev.width-1)>>8);LCD_WR_DATA((lcddev.width-1)&0XFF);
      LCD_WR_REG(lcddev.setycmd);
      LCD_WR_DATA(0);LCD_WR_DATA(0);
      LCD_WR_DATA((lcddev.height-1)>>8);LCD_WR_DATA((lcddev.height-1)&0XFF);
    }
  }else
  {
    switch(dir)
    {
    case L2R_U2D://从左到右,从上到下
      regval|=(1<<5)|(1<<4)|(0<<3);
      break;
    case L2R_D2U://从左到右,从下到上
      regval|=(0<<5)|(1<<4)|(0<<3);
      break;
    case R2L_U2D://从右到左,从上到下
      regval|=(1<<5)|(0<<4)|(0<<3);
      break;
    case R2L_D2U://从右到左,从下到上
      regval|=(0<<5)|(0<<4)|(0<<3);
      break;
    case U2D_L2R://从上到下,从左到右
      regval|=(1<<5)|(1<<4)|(1<<3);
      break;
    case U2D_R2L://从上到下,从右到左
      regval|=(1<<5)|(0<<4)|(1<<3);
      break;
    case D2U_L2R://从下到上,从左到右
      regval|=(0<<5)|(1<<4)|(1<<3);
      break;
    case D2U_R2L://从下到上,从右到左
      regval|=(0<<5)|(0<<4)|(1<<3);
      break;
    }
    dirreg=0X03;
    regval|=1<<12;
    LCD_WriteReg(dirreg,regval);
  }
}
//画点
//x,y:坐标
//POINT_COLOR:此点的颜色
void LCD_DrawPoint(uint16_t x,uint16_t y)
{
  LCD_SetCursor(x,y);		//设置光标位置
  LCD_WriteRAM_Prepare();	//开始写入GRAM
  TFTLCD->LCD_RAM=POINT_COLOR;
}
//快速画点
//x,y:坐标
//color:颜色
void LCD_Fast_DrawPoint(uint16_t x,uint16_t y,uint16_t color)
{
	LCD_SetCursor(x,y);		//设置光标位置(0x2A 0x2B)
  LCD_WriteRAM_Prepare();	//开始写入GRAM(0x2C)
  TFTLCD->LCD_RAM=color;  //写显示颜色
}
//SSD1963 背光设置
//pwm:背光等级,0~100.越大越亮.
void LCD_SSD_BackLightSet(uint8_t pwm)
{
  LCD_WR_REG(0xBE);	//配置PWM输出
  LCD_WR_DATA(0x05);	//1设置PWM频率
  LCD_WR_DATA((uint16_t)(pwm*2.55));//2设置PWM占空比
  LCD_WR_DATA(0x01);	//3设置C
  LCD_WR_DATA(0xFF);	//4设置D
  LCD_WR_DATA(0x00);	//5设置E
  LCD_WR_DATA(0x00);	//6设置F
}

//设置LCD显示方向
//dir:0,竖屏;1,横屏
void LCD_Display_Dir(uint8_t dir)
{
  if(dir==0)			//竖屏
  {
    lcddev.dir=0;	//竖屏
    lcddev.width=240;
    lcddev.height=320;
    if(lcddev.id==0X9341||lcddev.id==0X9486||lcddev.id==0X6804||lcddev.id==0X5310)
    {
      lcddev.wramcmd=0X2C;
      lcddev.setxcmd=0X2A;
      lcddev.setycmd=0X2B;
      if(lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X9486)
      {
        lcddev.width=320;
        lcddev.height=480;
      }
    }else if(lcddev.id==0x5510)
    {
      lcddev.wramcmd=0X2C00;
      lcddev.setxcmd=0X2A00;
      lcddev.setycmd=0X2B00;
      lcddev.width=480;
      lcddev.height=800;
    }else if(lcddev.id==0X1963)
    {
      lcddev.wramcmd=0X2C;	//设置写入GRAM的指令
      lcddev.setxcmd=0X2B;	//设置写X坐标指令
      lcddev.setycmd=0X2A;	//设置写Y坐标指令
      lcddev.width=480;		//设置宽度480
      lcddev.height=800;		//设置高度800
    }else
    {
      lcddev.wramcmd=0X22;
      lcddev.setxcmd=0X20;
      lcddev.setycmd=0X21;
    }
  }else 				//横屏
  {
    lcddev.dir=1;	//横屏
    lcddev.width=320;
    lcddev.height=240;
    if(lcddev.id==0X9341||lcddev.id==0X9486||lcddev.id==0X5310)
    {
      lcddev.wramcmd=0X2C;
      lcddev.setxcmd=0X2A;
      lcddev.setycmd=0X2B;
    }else if(lcddev.id==0X6804)
    {
      lcddev.wramcmd=0X2C;
      lcddev.setxcmd=0X2B;
      lcddev.setycmd=0X2A;
    }else if(lcddev.id==0x5510)
    {
      lcddev.wramcmd=0X2C00;
      lcddev.setxcmd=0X2A00;
      lcddev.setycmd=0X2B00;
      lcddev.width=800;
      lcddev.height=480;
    }else if(lcddev.id==0X1963)
    {
      lcddev.wramcmd=0X2C;	//设置写入GRAM的指令
      lcddev.setxcmd=0X2A;	//设置写X坐标指令
      lcddev.setycmd=0X2B;	//设置写Y坐标指令
      lcddev.width=800;		//设置宽度800
      lcddev.height=480;		//设置高度480
    }else
    {
      lcddev.wramcmd=0X22;
      lcddev.setxcmd=0X21;
      lcddev.setycmd=0X20;
    }
    if(lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X9486)
    {
      lcddev.width=480;
      lcddev.height=320;
    }
  }
  LCD_Scan_Dir(DFT_SCAN_DIR);	//默认扫描方向
}
//设置窗口,并自动设置画点坐标到窗口左上角(sx,sy).
//sx,sy:窗口起始坐标(左上角)
//width,height:窗口宽度和高度,必须大于0!!
//窗体大小:width*height.
void LCD_Set_Window(uint16_t sx,uint16_t sy,uint16_t width,uint16_t height)
{
  uint8_t hsareg,heareg,vsareg,veareg;
  uint16_t hsaval,heaval,vsaval,veaval;
  uint16_t twidth,theight;
  twidth=sx+width-1;
  theight=sy+height-1;
  if(lcddev.id==0X9341||lcddev.id==0X9486||lcddev.id==0X5310||lcddev.id==0X6804||(lcddev.dir==1&&lcddev.id==0X1963))
  {
    LCD_WR_REG(lcddev.setxcmd);
    LCD_WR_DATA(sx>>8);
    LCD_WR_DATA(sx&0XFF);
    LCD_WR_DATA(twidth>>8);
    LCD_WR_DATA(twidth&0XFF);
    LCD_WR_REG(lcddev.setycmd);
    LCD_WR_DATA(sy>>8);
    LCD_WR_DATA(sy&0XFF);
    LCD_WR_DATA(theight>>8);
    LCD_WR_DATA(theight&0XFF);
  }else if(lcddev.id==0X1963)//1963竖屏特殊处理
  {
    sx=lcddev.width-width-sx;
    height=sy+height-1;
    LCD_WR_REG(lcddev.setxcmd);
    LCD_WR_DATA(sx>>8);
    LCD_WR_DATA(sx&0XFF);
    LCD_WR_DATA((sx+width-1)>>8);
    LCD_WR_DATA((sx+width-1)&0XFF);
    LCD_WR_REG(lcddev.setycmd);
    LCD_WR_DATA(sy>>8);
    LCD_WR_DATA(sy&0XFF);
    LCD_WR_DATA(height>>8);
    LCD_WR_DATA(height&0XFF);
  }else if(lcddev.id==0X5510)
  {
    LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(sx>>8);
    LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(sx&0XFF);
    LCD_WR_REG(lcddev.setxcmd+2);LCD_WR_DATA(twidth>>8);
    LCD_WR_REG(lcddev.setxcmd+3);LCD_WR_DATA(twidth&0XFF);
    LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(sy>>8);
    LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(sy&0XFF);
    LCD_WR_REG(lcddev.setycmd+2);LCD_WR_DATA(theight>>8);
    LCD_WR_REG(lcddev.setycmd+3);LCD_WR_DATA(theight&0XFF);
  }else	//其他驱动IC
  {
    if(lcddev.dir==1)//横屏
    {
      //窗口值
      hsaval=sy;
      heaval=theight;
      vsaval=lcddev.width-twidth-1;
      veaval=lcddev.width-sx-1;
    }else
    {
      hsaval=sx;
      heaval=twidth;
      vsaval=sy;
      veaval=theight;
    }
    hsareg=0X50;heareg=0X51;//水平方向窗口寄存器
    vsareg=0X52;veareg=0X53;//垂直方向窗口寄存器
    //设置寄存器值
    LCD_WriteReg(hsareg,hsaval);
    LCD_WriteReg(heareg,heaval);
    LCD_WriteReg(vsareg,vsaval);
    LCD_WriteReg(veareg,veaval);
    LCD_SetCursor(sx,sy);	//设置光标位置
  }
}
//初始化lcd
//该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!!
//在其他型号的驱动芯片上没有测试!
void TFTLCD_Init(void)
{
  volatile uint32_t i=0;
	/*IO配置*/
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟
	RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟
	
  GPIO_InitTypeDef  GPIO_InitStructure;
  //PB15 推挽输出,控制背光 LCD_BL
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 //PB15 推挽输出,控制背光

	//D0~D3 D13~D15 FSMC_NEW FSMC_NOE
	GPIO_InitStructure.GPIO_Pin = (3<<0)|(3<<4)|(7<<8)|(3<<14);//PD0,1,4,5,8,9,10,14,15 AF OUT
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
  //D4~D12
	GPIO_InitStructure.GPIO_Pin = (0X1FF<<7);//PE7~15,AF OUT
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
	
	
  //PF12,FSMC_A6
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化
	
  //PG12,FSMC_NE4
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化

//复用映射到FSMC
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);//PD0,AF12
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);//PD1,AF12
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15,AF12

	GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);//PE7,AF12
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15,AF12

	GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);//PF12,AF12
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC);

  //读写时序
	FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
	FSMC_NORSRAMTimingInitTypeDef  writeTiming;
  //读时序
	readWriteTiming.FSMC_AddressSetupTime = 0X0F;	 //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns
	readWriteTiming.FSMC_AddressHoldTime = 0x00;	 //地址保持时间(ADDHLD)模式A未用到
	readWriteTiming.FSMC_DataSetupTime = 0x3C;			//数据保存时间为60个HCLK	=6*60=360ns
	readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
	readWriteTiming.FSMC_CLKDivision = 0x00;
	readWriteTiming.FSMC_DataLatency = 0x00;
	readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;	 //模式A
  //写时序
	writeTiming.FSMC_AddressSetupTime =0x09;	      //地址建立时间(ADDSET)为9个HCLK =54ns
	writeTiming.FSMC_AddressHoldTime = 0x00;	 //地址保持时间(A
	writeTiming.FSMC_DataSetupTime = 0x08;		 //数据保存时间为6ns*9个HCLK=54ns
	writeTiming.FSMC_BusTurnAroundDuration = 0x00;
	writeTiming.FSMC_CLKDivision = 0x00;
	writeTiming.FSMC_DataLatency = 0x00;
	writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;	 //模式A

	FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
	
	FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  这里我们使用NE4 ,也就对应BTCR[6],[7]。
	FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
	FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM
	FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit
	FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
	FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
	FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
	FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
	FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
	FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;	//  存储器写使能
	FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
	FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
	FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
	FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
	FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序

	FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

	FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);  // 使能BANK1




  Delay_ms(50); // delay 50 ms
  LCD_WriteReg(0x0000,0x0001);
  Delay_ms(50); // delay 50 ms
  lcddev.id = LCD_ReadReg(0x0000);
  if(lcddev.id<0XFF||lcddev.id==0XFFFF||lcddev.id==0X9300||lcddev.id==0X9400)//读到ID不正确,新增lcddev.id==0X9300判断,因为9341在未被复位的情况下会被读成9300
  {
    //尝试9341 ID的读取
    LCD_WR_REG(0XD3);
    lcddev.id=LCD_RD_DATA();	//dummy read
    lcddev.id=LCD_RD_DATA();	//读到0X00
    lcddev.id=LCD_RD_DATA();   	//读取93
    lcddev.id<<=8;
    lcddev.id|=LCD_RD_DATA();  	//读取41
    if(lcddev.id!=0X9341 && lcddev.id!=0X9486)		//非9341,尝试是不是6804
    {
      LCD_WR_REG(0XBF);
      lcddev.id=LCD_RD_DATA(); 	//dummy read
      lcddev.id=LCD_RD_DATA();   	//读回0X01
      lcddev.id=LCD_RD_DATA(); 	//读回0XD0
      lcddev.id=LCD_RD_DATA();	//这里读回0X68
      lcddev.id<<=8;
      lcddev.id|=LCD_RD_DATA();	//这里读回0X04
      if(lcddev.id!=0X6804)		//也不是6804,尝试看看是不是NT35310
      {
        LCD_WR_REG(0XD4);
        lcddev.id=LCD_RD_DATA();//dummy read
        lcddev.id=LCD_RD_DATA();//读回0X01
        lcddev.id=LCD_RD_DATA();//读回0X53
        lcddev.id<<=8;
        lcddev.id|=LCD_RD_DATA();	//这里读回0X10
        if(lcddev.id!=0X5310)		//也不是NT35310,尝试看看是不是NT35510
        {
          LCD_WR_REG(0XDA00);
          lcddev.id=LCD_RD_DATA();		//读回0X00
          LCD_WR_REG(0XDB00);
          lcddev.id=LCD_RD_DATA();		//读回0X80
          lcddev.id<<=8;
          LCD_WR_REG(0XDC00);
          lcddev.id|=LCD_RD_DATA();		//读回0X00
          if(lcddev.id==0x8000)lcddev.id=0x5510;//NT35510读回的ID是8000H,为方便区分,我们强制设置为5510
          if(lcddev.id!=0X5510)			//也不是NT5510,尝试看看是不是SSD1963
          {
            LCD_WR_REG(0XA1);
            lcddev.id=LCD_RD_DATA();
            lcddev.id=LCD_RD_DATA();	//读回0X57
            lcddev.id<<=8;
            lcddev.id|=LCD_RD_DATA();	//读回0X61
            if(lcddev.id==0X5761)lcddev.id=0X1963;//SSD1963读回的ID是5761H,为方便区分,我们强制设置为1963
          }
        }
      }
    }
  }
  if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510||lcddev.id==0X1963)//如果是这几个IC,则设置WR时序为最快
  {
    //重新配置写时序控制寄存器的时序
    FSMC_Bank1E->BWTR[6]&=~(0XF<<0);//地址建立时间(ADDSET)清零
    FSMC_Bank1E->BWTR[6]&=~(0XF<<8);//数据保存时间清零
    FSMC_Bank1E->BWTR[6]|=3<<0;		//地址建立时间(ADDSET)为3个HCLK =18ns
    FSMC_Bank1E->BWTR[6]|=2<<8; 	//数据保存时间(DATAST)为6ns*3个HCLK=18ns
  }else if(lcddev.id==0X6804||lcddev.id==0XC505)	//6804/C505速度上不去,得降低
  {
    //重新配置写时序控制寄存器的时序
    FSMC_Bank1E->BWTR[6]&=~(0XF<<0);//地址建立时间(ADDSET)清零
    FSMC_Bank1E->BWTR[6]&=~(0XF<<8);//数据保存时间清零
    FSMC_Bank1E->BWTR[6]|=10<<0;	//地址建立时间(ADDSET)为10个HCLK =60ns
    FSMC_Bank1E->BWTR[6]|=12<<8; 	//数据保存时间(DATAST)为6ns*13个HCLK=78ns
  }
//  printf(" TFTLCD ID:%x\r\n",lcddev.id); //打印LCD ID
  if(lcddev.id==0X9341)	//9341初始化
  {
    LCD_WR_REG(0xCF);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xC1);
    LCD_WR_DATA(0X30);
    LCD_WR_REG(0xED);
    LCD_WR_DATA(0x64);
    LCD_WR_DATA(0x03);
    LCD_WR_DATA(0X12);
    LCD_WR_DATA(0X81);
    LCD_WR_REG(0xE8);
    LCD_WR_DATA(0x85);
    LCD_WR_DATA(0x10);
    LCD_WR_DATA(0x7A);
    LCD_WR_REG(0xCB);
    LCD_WR_DATA(0x39);
    LCD_WR_DATA(0x2C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x34);
    LCD_WR_DATA(0x02);
    LCD_WR_REG(0xF7);
    LCD_WR_DATA(0x20);
    LCD_WR_REG(0xEA);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_REG(0xC0);    //Power control
    LCD_WR_DATA(0x1B);   //VRH[5:0]
    LCD_WR_REG(0xC1);    //Power control
    LCD_WR_DATA(0x01);   //SAP[2:0];BT[3:0]
    LCD_WR_REG(0xC5);    //VCM control
    LCD_WR_DATA(0x30); 	 //3F
    LCD_WR_DATA(0x30); 	 //3C
    LCD_WR_REG(0xC7);    //VCM control2
    LCD_WR_DATA(0XB7);
    LCD_WR_REG(0x36);    // Memory Access Control
    LCD_WR_DATA(0x48);
    LCD_WR_REG(0x3A);
    LCD_WR_DATA(0x55);
    LCD_WR_REG(0xB1);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x1A);
    LCD_WR_REG(0xB6);    // Display Function Control
    LCD_WR_DATA(0x0A);
    LCD_WR_DATA(0xA2);
    LCD_WR_REG(0xF2);    // 3Gamma Function Disable
    LCD_WR_DATA(0x00);
    LCD_WR_REG(0x26);    //Gamma curve selected
    LCD_WR_DATA(0x01);
    LCD_WR_REG(0xE0);    //Set Gamma
    LCD_WR_DATA(0x0F);
    LCD_WR_DATA(0x2A);
    LCD_WR_DATA(0x28);
    LCD_WR_DATA(0x08);
    LCD_WR_DATA(0x0E);
    LCD_WR_DATA(0x08);
    LCD_WR_DATA(0x54);
    LCD_WR_DATA(0XA9);
    LCD_WR_DATA(0x43);
    LCD_WR_DATA(0x0A);
    LCD_WR_DATA(0x0F);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_REG(0XE1);    //Set Gamma
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x15);
    LCD_WR_DATA(0x17);
    LCD_WR_DATA(0x07);
    LCD_WR_DATA(0x11);
    LCD_WR_DATA(0x06);
    LCD_WR_DATA(0x2B);
    LCD_WR_DATA(0x56);
    LCD_WR_DATA(0x3C);
    LCD_WR_DATA(0x05);
    LCD_WR_DATA(0x10);
    LCD_WR_DATA(0x0F);
    LCD_WR_DATA(0x3F);
    LCD_WR_DATA(0x3F);
    LCD_WR_DATA(0x0F);
    LCD_WR_REG(0x2B);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x01);
    LCD_WR_DATA(0x3f);
    LCD_WR_REG(0x2A);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xef);
    LCD_WR_REG(0x11); //Exit Sleep
    Delay_ms(120);
    LCD_WR_REG(0x29); //display on
  }
	else if (lcddev.id==0x9486)
	{
		LCD_WR_REG(0XF2);
		LCD_WR_DATA(0x18);
		LCD_WR_DATA(0xA3);
		LCD_WR_DATA(0x12);
		LCD_WR_DATA(0x02);
		LCD_WR_DATA(0XB2);
		LCD_WR_DATA(0x12);
		LCD_WR_DATA(0xFF);
		LCD_WR_DATA(0x10);
		LCD_WR_DATA(0x00);
		LCD_WR_REG(0XF8);
		LCD_WR_DATA(0x21);
		LCD_WR_DATA(0x04);
		LCD_WR_REG(0XF9);
		LCD_WR_DATA(0x00);
		LCD_WR_DATA(0x08);
		LCD_WR_REG(0x36);
		LCD_WR_DATA(0x08);   //设置RGB,含排线的屏
//		LCD_WR_DATA(0x00);   //设置RGB,不含排线的屏
		LCD_WR_REG(0x3A);
		LCD_WR_DATA(0x05);   //设置16位BPP
		LCD_WR_REG(0xB4);
		LCD_WR_DATA(0x01);//0x00
		LCD_WR_REG(0xB6);
		LCD_WR_DATA(0x02);
		LCD_WR_DATA(0x22);
		LCD_WR_REG(0xC1);
		LCD_WR_DATA(0x41);
		LCD_WR_REG(0xC5);
		LCD_WR_DATA(0x00);
		LCD_WR_DATA(0x07);//0X18
		LCD_WR_REG(0xE0);
		LCD_WR_DATA(0x0F);
		LCD_WR_DATA(0x1F);
		LCD_WR_DATA(0x1C);
		LCD_WR_DATA(0x0C);
		LCD_WR_DATA(0x0F);
		LCD_WR_DATA(0x08);
		LCD_WR_DATA(0x48);
		LCD_WR_DATA(0x98);
		LCD_WR_DATA(0x37);
		LCD_WR_DATA(0x0A);
		LCD_WR_DATA(0x13);
		LCD_WR_DATA(0x04);
		LCD_WR_DATA(0x11);
		LCD_WR_DATA(0x0D);
		LCD_WR_DATA(0x00);
		LCD_WR_REG(0xE1);
		LCD_WR_DATA(0x0F);
		LCD_WR_DATA(0x32);
		LCD_WR_DATA(0x2E);
		LCD_WR_DATA(0x0B);
		LCD_WR_DATA(0x0D);
		LCD_WR_DATA(0x05);
		LCD_WR_DATA(0x47);
		LCD_WR_DATA(0x75);
		LCD_WR_DATA(0x37);
		LCD_WR_DATA(0x06);
		LCD_WR_DATA(0x10);
		LCD_WR_DATA(0x03);
		LCD_WR_DATA(0x24);
		LCD_WR_DATA(0x20);
		LCD_WR_DATA(0x00);
		LCD_WR_REG(0x11);   //退出睡眠
		Delay_ms(120);
		LCD_WR_REG(0x29);   //开启显示
	}
	else if(lcddev.id==0x6804) //6804初始化
  {
    LCD_WR_REG(0X11);
    Delay_ms(20);
    LCD_WR_REG(0XD0);//VCI1  VCL  VGH  VGL DDVDH VREG1OUT power amplitude setting
    LCD_WR_DATA(0X07);
    LCD_WR_DATA(0X42);
    LCD_WR_DATA(0X1D);
    LCD_WR_REG(0XD1);//VCOMH VCOM_AC amplitude setting
    LCD_WR_DATA(0X00);
    LCD_WR_DATA(0X1a);
    LCD_WR_DATA(0X09);
    LCD_WR_REG(0XD2);//Operational Amplifier Circuit Constant Current Adjust , charge pump frequency setting
    LCD_WR_DATA(0X01);
    LCD_WR_DATA(0X22);
    LCD_WR_REG(0XC0);//REV SM GS
    LCD_WR_DATA(0X10);
    LCD_WR_DATA(0X3B);
    LCD_WR_DATA(0X00);
    LCD_WR_DATA(0X02);
    LCD_WR_DATA(0X11);

    LCD_WR_REG(0XC5);// Frame rate setting = 72HZ  when setting 0x03
    LCD_WR_DATA(0X03);

    LCD_WR_REG(0XC8);//Gamma setting
    LCD_WR_DATA(0X00);
    LCD_WR_DATA(0X25);
    LCD_WR_DATA(0X21);
    LCD_WR_DATA(0X05);
    LCD_WR_DATA(0X00);
    LCD_WR_DATA(0X0a);
    LCD_WR_DATA(0X65);
    LCD_WR_DATA(0X25);
    LCD_WR_DATA(0X77);
    LCD_WR_DATA(0X50);
    LCD_WR_DATA(0X0f);
    LCD_WR_DATA(0X00);

    LCD_WR_REG(0XF8);
    LCD_WR_DATA(0X01);

    LCD_WR_REG(0XFE);
    LCD_WR_DATA(0X00);
    LCD_WR_DATA(0X02);

    LCD_WR_REG(0X20);//Exit invert mode

    LCD_WR_REG(0X36);
    LCD_WR_DATA(0X08);//原来是a

    LCD_WR_REG(0X3A);
    LCD_WR_DATA(0X55);//16位模式
    LCD_WR_REG(0X2B);
    LCD_WR_DATA(0X00);
    LCD_WR_DATA(0X00);
    LCD_WR_DATA(0X01);
    LCD_WR_DATA(0X3F);

    LCD_WR_REG(0X2A);
    LCD_WR_DATA(0X00);
    LCD_WR_DATA(0X00);
    LCD_WR_DATA(0X01);
    LCD_WR_DATA(0XDF);
    Delay_ms(120);
    LCD_WR_REG(0X29);
  }else if(lcddev.id==0x5310)
  {
    LCD_WR_REG(0xED);
    LCD_WR_DATA(0x01);
    LCD_WR_DATA(0xFE);

    LCD_WR_REG(0xEE);
    LCD_WR_DATA(0xDE);
    LCD_WR_DATA(0x21);

    LCD_WR_REG(0xF1);
    LCD_WR_DATA(0x01);
    LCD_WR_REG(0xDF);
    LCD_WR_DATA(0x10);

    //VCOMvoltage//
    LCD_WR_REG(0xC4);
    LCD_WR_DATA(0x8F);	  //5f

    LCD_WR_REG(0xC6);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xE2);
    LCD_WR_DATA(0xE2);
    LCD_WR_DATA(0xE2);
    LCD_WR_REG(0xBF);
    LCD_WR_DATA(0xAA);

    LCD_WR_REG(0xB0);
    LCD_WR_DATA(0x0D);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x0D);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x11);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x19);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x21);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x2D);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x3D);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x5D);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x5D);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xB1);
    LCD_WR_DATA(0x80);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x8B);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x96);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xB2);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x02);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x03);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xB3);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xB4);
    LCD_WR_DATA(0x8B);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x96);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xA1);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xB5);
    LCD_WR_DATA(0x02);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x03);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x04);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xB6);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xB7);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x3F);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x5E);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x64);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x8C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xAC);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xDC);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x70);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x90);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xEB);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xDC);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xB8);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xBA);
    LCD_WR_DATA(0x24);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xC1);
    LCD_WR_DATA(0x20);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x54);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xFF);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xC2);
    LCD_WR_DATA(0x0A);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x04);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xC3);
    LCD_WR_DATA(0x3C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x3A);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x39);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x37);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x3C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x36);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x32);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x2F);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x2C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x29);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x26);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x24);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x24);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x23);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x3C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x36);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x32);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x2F);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x2C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x29);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x26);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x24);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x24);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x23);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xC4);
    LCD_WR_DATA(0x62);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x05);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x84);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xF0);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x18);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xA4);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x18);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x50);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x0C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x17);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x95);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xF3);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xE6);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xC5);
    LCD_WR_DATA(0x32);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x44);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x65);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x76);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x88);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xC6);
    LCD_WR_DATA(0x20);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x17);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x01);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xC7);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xC8);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xC9);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xE0);
    LCD_WR_DATA(0x16);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x1C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x21);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x36);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x46);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x52);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x64);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x7A);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x8B);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x99);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xA8);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xB9);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xC4);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xCA);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xD2);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xD9);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xE0);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xF3);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xE1);
    LCD_WR_DATA(0x16);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x1C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x22);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x36);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x45);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x52);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x64);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x7A);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x8B);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x99);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xA8);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xB9);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xC4);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xCA);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xD2);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xD8);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xE0);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xF3);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xE2);
    LCD_WR_DATA(0x05);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x0B);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x1B);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x34);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x44);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x4F);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x61);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x79);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x88);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x97);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xA6);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xB7);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xC2);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xC7);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xD1);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xD6);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xDD);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xF3);
    LCD_WR_DATA(0x00);
    LCD_WR_REG(0xE3);
    LCD_WR_DATA(0x05);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xA);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x1C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x33);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x44);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x50);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x62);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x78);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x88);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x97);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xA6);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xB7);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xC2);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xC7);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xD1);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xD5);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xDD);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xF3);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xE4);
    LCD_WR_DATA(0x01);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x01);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x02);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x2A);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x3C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x4B);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x5D);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x74);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x84);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x93);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xA2);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xB3);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xBE);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xC4);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xCD);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xD3);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xDD);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xF3);
    LCD_WR_DATA(0x00);
    LCD_WR_REG(0xE5);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x02);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x29);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x3C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x4B);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x5D);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x74);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x84);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x93);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xA2);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xB3);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xBE);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xC4);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xCD);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xD3);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xDC);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xF3);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xE6);
    LCD_WR_DATA(0x11);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x34);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x56);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x76);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x77);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x66);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x88);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x99);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xBB);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x99);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x66);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x55);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x55);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x45);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x43);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x44);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xE7);
    LCD_WR_DATA(0x32);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x55);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x76);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x66);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x67);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x67);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x87);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x99);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xBB);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x99);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x77);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x44);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x56);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x23);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x33);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x45);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xE8);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x99);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x87);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x88);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x77);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x66);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x88);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xAA);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0xBB);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x99);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x66);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x55);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x55);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x44);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x44);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x55);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xE9);
    LCD_WR_DATA(0xAA);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0x00);
    LCD_WR_DATA(0xAA);

    LCD_WR_REG(0xCF);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xF0);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x50);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xF3);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xF9);
    LCD_WR_DATA(0x06);
    LCD_WR_DATA(0x10);
    LCD_WR_DATA(0x29);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0x3A);
    LCD_WR_DATA(0x55);	//66

    LCD_WR_REG(0x11);
    Delay_ms(100);
    LCD_WR_REG(0x29);
    LCD_WR_REG(0x35);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0x51);
    LCD_WR_DATA(0xFF);
    LCD_WR_REG(0x53);
    LCD_WR_DATA(0x2C);
    LCD_WR_REG(0x55);
    LCD_WR_DATA(0x82);
    LCD_WR_REG(0x2c);
  }else if(lcddev.id==0x5510)
  {
    LCD_WriteReg(0xF000,0x55);
    LCD_WriteReg(0xF001,0xAA);
    LCD_WriteReg(0xF002,0x52);
    LCD_WriteReg(0xF003,0x08);
    LCD_WriteReg(0xF004,0x01);
    //AVDD Set AVDD 5.2V
    LCD_WriteReg(0xB000,0x0D);
    LCD_WriteReg(0xB001,0x0D);
    LCD_WriteReg(0xB002,0x0D);
    //AVDD ratio
    LCD_WriteReg(0xB600,0x34);
    LCD_WriteReg(0xB601,0x34);
    LCD_WriteReg(0xB602,0x34);
    //AVEE -5.2V
    LCD_WriteReg(0xB100,0x0D);
    LCD_WriteReg(0xB101,0x0D);
    LCD_WriteReg(0xB102,0x0D);
    //AVEE ratio
    LCD_WriteReg(0xB700,0x34);
    LCD_WriteReg(0xB701,0x34);
    LCD_WriteReg(0xB702,0x34);
    //VCL -2.5V
    LCD_WriteReg(0xB200,0x00);
    LCD_WriteReg(0xB201,0x00);
    LCD_WriteReg(0xB202,0x00);
    //VCL ratio
    LCD_WriteReg(0xB800,0x24);
    LCD_WriteReg(0xB801,0x24);
    LCD_WriteReg(0xB802,0x24);
    //VGH 15V (Free pump)
    LCD_WriteReg(0xBF00,0x01);
    LCD_WriteReg(0xB300,0x0F);
    LCD_WriteReg(0xB301,0x0F);
    LCD_WriteReg(0xB302,0x0F);
    //VGH ratio
    LCD_WriteReg(0xB900,0x34);
    LCD_WriteReg(0xB901,0x34);
    LCD_WriteReg(0xB902,0x34);
    //VGL_REG -10V
    LCD_WriteReg(0xB500,0x08);
    LCD_WriteReg(0xB501,0x08);
    LCD_WriteReg(0xB502,0x08);
    LCD_WriteReg(0xC200,0x03);
    //VGLX ratio
    LCD_WriteReg(0xBA00,0x24);
    LCD_WriteReg(0xBA01,0x24);
    LCD_WriteReg(0xBA02,0x24);
    //VGMP/VGSP 4.5V/0V
    LCD_WriteReg(0xBC00,0x00);
    LCD_WriteReg(0xBC01,0x78);
    LCD_WriteReg(0xBC02,0x00);
    //VGMN/VGSN -4.5V/0V
    LCD_WriteReg(0xBD00,0x00);
    LCD_WriteReg(0xBD01,0x78);
    LCD_WriteReg(0xBD02,0x00);
    //VCOM
    LCD_WriteReg(0xBE00,0x00);
    LCD_WriteReg(0xBE01,0x64);
    //Gamma Setting
    LCD_WriteReg(0xD100,0x00);
    LCD_WriteReg(0xD101,0x33);
    LCD_WriteReg(0xD102,0x00);
    LCD_WriteReg(0xD103,0x34);
    LCD_WriteReg(0xD104,0x00);
    LCD_WriteReg(0xD105,0x3A);
    LCD_WriteReg(0xD106,0x00);
    LCD_WriteReg(0xD107,0x4A);
    LCD_WriteReg(0xD108,0x00);
    LCD_WriteReg(0xD109,0x5C);
    LCD_WriteReg(0xD10A,0x00);
    LCD_WriteReg(0xD10B,0x81);
    LCD_WriteReg(0xD10C,0x00);
    LCD_WriteReg(0xD10D,0xA6);
    LCD_WriteReg(0xD10E,0x00);
    LCD_WriteReg(0xD10F,0xE5);
    LCD_WriteReg(0xD110,0x01);
    LCD_WriteReg(0xD111,0x13);
    LCD_WriteReg(0xD112,0x01);
    LCD_WriteReg(0xD113,0x54);
    LCD_WriteReg(0xD114,0x01);
    LCD_WriteReg(0xD115,0x82);
    LCD_WriteReg(0xD116,0x01);
    LCD_WriteReg(0xD117,0xCA);
    LCD_WriteReg(0xD118,0x02);
    LCD_WriteReg(0xD119,0x00);
    LCD_WriteReg(0xD11A,0x02);
    LCD_WriteReg(0xD11B,0x01);
    LCD_WriteReg(0xD11C,0x02);
    LCD_WriteReg(0xD11D,0x34);
    LCD_WriteReg(0xD11E,0x02);
    LCD_WriteReg(0xD11F,0x67);
    LCD_WriteReg(0xD120,0x02);
    LCD_WriteReg(0xD121,0x84);
    LCD_WriteReg(0xD122,0x02);
    LCD_WriteReg(0xD123,0xA4);
    LCD_WriteReg(0xD124,0x02);
    LCD_WriteReg(0xD125,0xB7);
    LCD_WriteReg(0xD126,0x02);
    LCD_WriteReg(0xD127,0xCF);
    LCD_WriteReg(0xD128,0x02);
    LCD_WriteReg(0xD129,0xDE);
    LCD_WriteReg(0xD12A,0x02);
    LCD_WriteReg(0xD12B,0xF2);
    LCD_WriteReg(0xD12C,0x02);
    LCD_WriteReg(0xD12D,0xFE);
    LCD_WriteReg(0xD12E,0x03);
    LCD_WriteReg(0xD12F,0x10);
    LCD_WriteReg(0xD130,0x03);
    LCD_WriteReg(0xD131,0x33);
    LCD_WriteReg(0xD132,0x03);
    LCD_WriteReg(0xD133,0x6D);
    LCD_WriteReg(0xD200,0x00);
    LCD_WriteReg(0xD201,0x33);
    LCD_WriteReg(0xD202,0x00);
    LCD_WriteReg(0xD203,0x34);
    LCD_WriteReg(0xD204,0x00);
    LCD_WriteReg(0xD205,0x3A);
    LCD_WriteReg(0xD206,0x00);
    LCD_WriteReg(0xD207,0x4A);
    LCD_WriteReg(0xD208,0x00);
    LCD_WriteReg(0xD209,0x5C);
    LCD_WriteReg(0xD20A,0x00);

    LCD_WriteReg(0xD20B,0x81);
    LCD_WriteReg(0xD20C,0x00);
    LCD_WriteReg(0xD20D,0xA6);
    LCD_WriteReg(0xD20E,0x00);
    LCD_WriteReg(0xD20F,0xE5);
    LCD_WriteReg(0xD210,0x01);
    LCD_WriteReg(0xD211,0x13);
    LCD_WriteReg(0xD212,0x01);
    LCD_WriteReg(0xD213,0x54);
    LCD_WriteReg(0xD214,0x01);
    LCD_WriteReg(0xD215,0x82);
    LCD_WriteReg(0xD216,0x01);
    LCD_WriteReg(0xD217,0xCA);
    LCD_WriteReg(0xD218,0x02);
    LCD_WriteReg(0xD219,0x00);
    LCD_WriteReg(0xD21A,0x02);
    LCD_WriteReg(0xD21B,0x01);
    LCD_WriteReg(0xD21C,0x02);
    LCD_WriteReg(0xD21D,0x34);
    LCD_WriteReg(0xD21E,0x02);
    LCD_WriteReg(0xD21F,0x67);
    LCD_WriteReg(0xD220,0x02);
    LCD_WriteReg(0xD221,0x84);
    LCD_WriteReg(0xD222,0x02);
    LCD_WriteReg(0xD223,0xA4);
    LCD_WriteReg(0xD224,0x02);
    LCD_WriteReg(0xD225,0xB7);
    LCD_WriteReg(0xD226,0x02);
    LCD_WriteReg(0xD227,0xCF);
    LCD_WriteReg(0xD228,0x02);
    LCD_WriteReg(0xD229,0xDE);
    LCD_WriteReg(0xD22A,0x02);
    LCD_WriteReg(0xD22B,0xF2);
    LCD_WriteReg(0xD22C,0x02);
    LCD_WriteReg(0xD22D,0xFE);
    LCD_WriteReg(0xD22E,0x03);
    LCD_WriteReg(0xD22F,0x10);
    LCD_WriteReg(0xD230,0x03);
    LCD_WriteReg(0xD231,0x33);
    LCD_WriteReg(0xD232,0x03);
    LCD_WriteReg(0xD233,0x6D);
    LCD_WriteReg(0xD300,0x00);
    LCD_WriteReg(0xD301,0x33);
    LCD_WriteReg(0xD302,0x00);
    LCD_WriteReg(0xD303,0x34);
    LCD_WriteReg(0xD304,0x00);
    LCD_WriteReg(0xD305,0x3A);
    LCD_WriteReg(0xD306,0x00);
    LCD_WriteReg(0xD307,0x4A);
    LCD_WriteReg(0xD308,0x00);
    LCD_WriteReg(0xD309,0x5C);
    LCD_WriteReg(0xD30A,0x00);

    LCD_WriteReg(0xD30B,0x81);
    LCD_WriteReg(0xD30C,0x00);
    LCD_WriteReg(0xD30D,0xA6);
    LCD_WriteReg(0xD30E,0x00);
    LCD_WriteReg(0xD30F,0xE5);
    LCD_WriteReg(0xD310,0x01);
    LCD_WriteReg(0xD311,0x13);
    LCD_WriteReg(0xD312,0x01);
    LCD_WriteReg(0xD313,0x54);
    LCD_WriteReg(0xD314,0x01);
    LCD_WriteReg(0xD315,0x82);
    LCD_WriteReg(0xD316,0x01);
    LCD_WriteReg(0xD317,0xCA);
    LCD_WriteReg(0xD318,0x02);
    LCD_WriteReg(0xD319,0x00);
    LCD_WriteReg(0xD31A,0x02);
    LCD_WriteReg(0xD31B,0x01);
    LCD_WriteReg(0xD31C,0x02);
    LCD_WriteReg(0xD31D,0x34);
    LCD_WriteReg(0xD31E,0x02);
    LCD_WriteReg(0xD31F,0x67);
    LCD_WriteReg(0xD320,0x02);
    LCD_WriteReg(0xD321,0x84);
    LCD_WriteReg(0xD322,0x02);
    LCD_WriteReg(0xD323,0xA4);
    LCD_WriteReg(0xD324,0x02);
    LCD_WriteReg(0xD325,0xB7);
    LCD_WriteReg(0xD326,0x02);
    LCD_WriteReg(0xD327,0xCF);
    LCD_WriteReg(0xD328,0x02);
    LCD_WriteReg(0xD329,0xDE);
    LCD_WriteReg(0xD32A,0x02);
    LCD_WriteReg(0xD32B,0xF2);
    LCD_WriteReg(0xD32C,0x02);
    LCD_WriteReg(0xD32D,0xFE);
    LCD_WriteReg(0xD32E,0x03);
    LCD_WriteReg(0xD32F,0x10);
    LCD_WriteReg(0xD330,0x03);
    LCD_WriteReg(0xD331,0x33);
    LCD_WriteReg(0xD332,0x03);
    LCD_WriteReg(0xD333,0x6D);
    LCD_WriteReg(0xD400,0x00);
    LCD_WriteReg(0xD401,0x33);
    LCD_WriteReg(0xD402,0x00);
    LCD_WriteReg(0xD403,0x34);
    LCD_WriteReg(0xD404,0x00);
    LCD_WriteReg(0xD405,0x3A);
    LCD_WriteReg(0xD406,0x00);
    LCD_WriteReg(0xD407,0x4A);
    LCD_WriteReg(0xD408,0x00);
    LCD_WriteReg(0xD409,0x5C);
    LCD_WriteReg(0xD40A,0x00);
    LCD_WriteReg(0xD40B,0x81);

    LCD_WriteReg(0xD40C,0x00);
    LCD_WriteReg(0xD40D,0xA6);
    LCD_WriteReg(0xD40E,0x00);
    LCD_WriteReg(0xD40F,0xE5);
    LCD_WriteReg(0xD410,0x01);
    LCD_WriteReg(0xD411,0x13);
    LCD_WriteReg(0xD412,0x01);
    LCD_WriteReg(0xD413,0x54);
    LCD_WriteReg(0xD414,0x01);
    LCD_WriteReg(0xD415,0x82);
    LCD_WriteReg(0xD416,0x01);
    LCD_WriteReg(0xD417,0xCA);
    LCD_WriteReg(0xD418,0x02);
    LCD_WriteReg(0xD419,0x00);
    LCD_WriteReg(0xD41A,0x02);
    LCD_WriteReg(0xD41B,0x01);
    LCD_WriteReg(0xD41C,0x02);
    LCD_WriteReg(0xD41D,0x34);
    LCD_WriteReg(0xD41E,0x02);
    LCD_WriteReg(0xD41F,0x67);
    LCD_WriteReg(0xD420,0x02);
    LCD_WriteReg(0xD421,0x84);
    LCD_WriteReg(0xD422,0x02);
    LCD_WriteReg(0xD423,0xA4);
    LCD_WriteReg(0xD424,0x02);
    LCD_WriteReg(0xD425,0xB7);
    LCD_WriteReg(0xD426,0x02);
    LCD_WriteReg(0xD427,0xCF);
    LCD_WriteReg(0xD428,0x02);
    LCD_WriteReg(0xD429,0xDE);
    LCD_WriteReg(0xD42A,0x02);
    LCD_WriteReg(0xD42B,0xF2);
    LCD_WriteReg(0xD42C,0x02);
    LCD_WriteReg(0xD42D,0xFE);
    LCD_WriteReg(0xD42E,0x03);
    LCD_WriteReg(0xD42F,0x10);
    LCD_WriteReg(0xD430,0x03);
    LCD_WriteReg(0xD431,0x33);
    LCD_WriteReg(0xD432,0x03);
    LCD_WriteReg(0xD433,0x6D);
    LCD_WriteReg(0xD500,0x00);
    LCD_WriteReg(0xD501,0x33);
    LCD_WriteReg(0xD502,0x00);
    LCD_WriteReg(0xD503,0x34);
    LCD_WriteReg(0xD504,0x00);
    LCD_WriteReg(0xD505,0x3A);
    LCD_WriteReg(0xD506,0x00);
    LCD_WriteReg(0xD507,0x4A);
    LCD_WriteReg(0xD508,0x00);
    LCD_WriteReg(0xD509,0x5C);
    LCD_WriteReg(0xD50A,0x00);
    LCD_WriteReg(0xD50B,0x81);

    LCD_WriteReg(0xD50C,0x00);
    LCD_WriteReg(0xD50D,0xA6);
    LCD_WriteReg(0xD50E,0x00);
    LCD_WriteReg(0xD50F,0xE5);
    LCD_WriteReg(0xD510,0x01);
    LCD_WriteReg(0xD511,0x13);
    LCD_WriteReg(0xD512,0x01);
    LCD_WriteReg(0xD513,0x54);
    LCD_WriteReg(0xD514,0x01);
    LCD_WriteReg(0xD515,0x82);
    LCD_WriteReg(0xD516,0x01);
    LCD_WriteReg(0xD517,0xCA);
    LCD_WriteReg(0xD518,0x02);
    LCD_WriteReg(0xD519,0x00);
    LCD_WriteReg(0xD51A,0x02);
    LCD_WriteReg(0xD51B,0x01);
    LCD_WriteReg(0xD51C,0x02);
    LCD_WriteReg(0xD51D,0x34);
    LCD_WriteReg(0xD51E,0x02);
    LCD_WriteReg(0xD51F,0x67);
    LCD_WriteReg(0xD520,0x02);
    LCD_WriteReg(0xD521,0x84);
    LCD_WriteReg(0xD522,0x02);
    LCD_WriteReg(0xD523,0xA4);
    LCD_WriteReg(0xD524,0x02);
    LCD_WriteReg(0xD525,0xB7);
    LCD_WriteReg(0xD526,0x02);
    LCD_WriteReg(0xD527,0xCF);
    LCD_WriteReg(0xD528,0x02);
    LCD_WriteReg(0xD529,0xDE);
    LCD_WriteReg(0xD52A,0x02);
    LCD_WriteReg(0xD52B,0xF2);
    LCD_WriteReg(0xD52C,0x02);
    LCD_WriteReg(0xD52D,0xFE);
    LCD_WriteReg(0xD52E,0x03);
    LCD_WriteReg(0xD52F,0x10);
    LCD_WriteReg(0xD530,0x03);
    LCD_WriteReg(0xD531,0x33);
    LCD_WriteReg(0xD532,0x03);
    LCD_WriteReg(0xD533,0x6D);
    LCD_WriteReg(0xD600,0x00);
    LCD_WriteReg(0xD601,0x33);
    LCD_WriteReg(0xD602,0x00);
    LCD_WriteReg(0xD603,0x34);
    LCD_WriteReg(0xD604,0x00);
    LCD_WriteReg(0xD605,0x3A);
    LCD_WriteReg(0xD606,0x00);
    LCD_WriteReg(0xD607,0x4A);
    LCD_WriteReg(0xD608,0x00);
    LCD_WriteReg(0xD609,0x5C);
    LCD_WriteReg(0xD60A,0x00);
    LCD_WriteReg(0xD60B,0x81);

    LCD_WriteReg(0xD60C,0x00);
    LCD_WriteReg(0xD60D,0xA6);
    LCD_WriteReg(0xD60E,0x00);
    LCD_WriteReg(0xD60F,0xE5);
    LCD_WriteReg(0xD610,0x01);
    LCD_WriteReg(0xD611,0x13);
    LCD_WriteReg(0xD612,0x01);
    LCD_WriteReg(0xD613,0x54);
    LCD_WriteReg(0xD614,0x01);
    LCD_WriteReg(0xD615,0x82);
    LCD_WriteReg(0xD616,0x01);
    LCD_WriteReg(0xD617,0xCA);
    LCD_WriteReg(0xD618,0x02);
    LCD_WriteReg(0xD619,0x00);
    LCD_WriteReg(0xD61A,0x02);
    LCD_WriteReg(0xD61B,0x01);
    LCD_WriteReg(0xD61C,0x02);
    LCD_WriteReg(0xD61D,0x34);
    LCD_WriteReg(0xD61E,0x02);
    LCD_WriteReg(0xD61F,0x67);
    LCD_WriteReg(0xD620,0x02);
    LCD_WriteReg(0xD621,0x84);
    LCD_WriteReg(0xD622,0x02);
    LCD_WriteReg(0xD623,0xA4);
    LCD_WriteReg(0xD624,0x02);
    LCD_WriteReg(0xD625,0xB7);
    LCD_WriteReg(0xD626,0x02);
    LCD_WriteReg(0xD627,0xCF);
    LCD_WriteReg(0xD628,0x02);
    LCD_WriteReg(0xD629,0xDE);
    LCD_WriteReg(0xD62A,0x02);
    LCD_WriteReg(0xD62B,0xF2);
    LCD_WriteReg(0xD62C,0x02);
    LCD_WriteReg(0xD62D,0xFE);
    LCD_WriteReg(0xD62E,0x03);
    LCD_WriteReg(0xD62F,0x10);
    LCD_WriteReg(0xD630,0x03);
    LCD_WriteReg(0xD631,0x33);
    LCD_WriteReg(0xD632,0x03);
    LCD_WriteReg(0xD633,0x6D);
    //LV2 Page 0 enable
    LCD_WriteReg(0xF000,0x55);
    LCD_WriteReg(0xF001,0xAA);
    LCD_WriteReg(0xF002,0x52);
    LCD_WriteReg(0xF003,0x08);
    LCD_WriteReg(0xF004,0x00);
    //Display control
    LCD_WriteReg(0xB100, 0xCC);
    LCD_WriteReg(0xB101, 0x00);
    //Source hold time
    LCD_WriteReg(0xB600,0x05);
    //Gate EQ control
    LCD_WriteReg(0xB700,0x70);
    LCD_WriteReg(0xB701,0x70);
    //Source EQ control (Mode 2)
    LCD_WriteReg(0xB800,0x01);
    LCD_WriteReg(0xB801,0x03);
    LCD_WriteReg(0xB802,0x03);
    LCD_WriteReg(0xB803,0x03);
    //Inversion mode (2-dot)
    LCD_WriteReg(0xBC00,0x02);
    LCD_WriteReg(0xBC01,0x00);
    LCD_WriteReg(0xBC02,0x00);
    //Timing control 4H w/ 4-delay
    LCD_WriteReg(0xC900,0xD0);
    LCD_WriteReg(0xC901,0x02);
    LCD_WriteReg(0xC902,0x50);
    LCD_WriteReg(0xC903,0x50);
    LCD_WriteReg(0xC904,0x50);
    LCD_WriteReg(0x3500,0x00);
    LCD_WriteReg(0x3A00,0x55);  //16-bit/pixel
    LCD_WR_REG(0x1100);
    Delay_us(120);
    LCD_WR_REG(0x2900);
  }else if(lcddev.id==0x9325)//9325
  {
    LCD_WriteReg(0x00E5,0x78F0);
    LCD_WriteReg(0x0001,0x0100);
    LCD_WriteReg(0x0002,0x0700);
    LCD_WriteReg(0x0003,0x1030);
    LCD_WriteReg(0x0004,0x0000);
    LCD_WriteReg(0x0008,0x0202);
    LCD_WriteReg(0x0009,0x0000);
    LCD_WriteReg(0x000A,0x0000);
    LCD_WriteReg(0x000C,0x0000);
    LCD_WriteReg(0x000D,0x0000);
    LCD_WriteReg(0x000F,0x0000);
    //power on sequence VGHVGL
    LCD_WriteReg(0x0010,0x0000);
    LCD_WriteReg(0x0011,0x0007);
    LCD_WriteReg(0x0012,0x0000);
    LCD_WriteReg(0x0013,0x0000);
    LCD_WriteReg(0x0007,0x0000);
    //vgh
    LCD_WriteReg(0x0010,0x1690);
    LCD_WriteReg(0x0011,0x0227);
    //delayms(100);
    //vregiout
    LCD_WriteReg(0x0012,0x009D); //0x001b
    //delayms(100);
    //vom amplitude
    LCD_WriteReg(0x0013,0x1900);
    //delayms(100);
    //vom H
    LCD_WriteReg(0x0029,0x0025);
    LCD_WriteReg(0x002B,0x000D);
    //gamma
    LCD_WriteReg(0x0030,0x0007);
    LCD_WriteReg(0x0031,0x0303);
    LCD_WriteReg(0x0032,0x0003);// 0006
    LCD_WriteReg(0x0035,0x0206);
    LCD_WriteReg(0x0036,0x0008);
    LCD_WriteReg(0x0037,0x0406);
    LCD_WriteReg(0x0038,0x0304);//0200
    LCD_WriteReg(0x0039,0x0007);
    LCD_WriteReg(0x003C,0x0602);// 0504
    LCD_WriteReg(0x003D,0x0008);
    //ram
    LCD_WriteReg(0x0050,0x0000);
    LCD_WriteReg(0x0051,0x00EF);
    LCD_WriteReg(0x0052,0x0000);
    LCD_WriteReg(0x0053,0x013F);
    LCD_WriteReg(0x0060,0xA700);
    LCD_WriteReg(0x0061,0x0001);
    LCD_WriteReg(0x006A,0x0000);
    //
    LCD_WriteReg(0x0080,0x0000);
    LCD_WriteReg(0x0081,0x0000);
    LCD_WriteReg(0x0082,0x0000);
    LCD_WriteReg(0x0083,0x0000);
    LCD_WriteReg(0x0084,0x0000);
    LCD_WriteReg(0x0085,0x0000);
    //
    LCD_WriteReg(0x0090,0x0010);
    LCD_WriteReg(0x0092,0x0600);

    LCD_WriteReg(0x0007,0x0133);
    LCD_WriteReg(0x00,0x0022);//
  }else if(lcddev.id==0x9328)//ILI9328   OK
  {
    LCD_WriteReg(0x00EC,0x108F);// internal timeing
    LCD_WriteReg(0x00EF,0x1234);// ADD
    //LCD_WriteReg(0x00e7,0x0010);
    //LCD_WriteReg(0x0000,0x0001);//开启内部时钟
    LCD_WriteReg(0x0001,0x0100);
    LCD_WriteReg(0x0002,0x0700);//电源开启
    //LCD_WriteReg(0x0003,(1<<3)|(1<<4) ); 	//65K  RGB
    //DRIVE TABLE(寄存器 03H)
    //BIT3=AM BIT4:5=ID0:1
    //AM ID0 ID1   FUNCATION
    // 0  0   0	   R->L D->U
    // 1  0   0	   D->U	R->L
    // 0  1   0	   L->R D->U
    // 1  1   0    D->U	L->R
    // 0  0   1	   R->L U->D
    // 1  0   1    U->D	R->L
    // 0  1   1    L->R U->D 正常就用这个.
    // 1  1   1	   U->D	L->R
    LCD_WriteReg(0x0003,(1<<12)|(3<<4)|(0<<3) );//65K
    LCD_WriteReg(0x0004,0x0000);
    LCD_WriteReg(0x0008,0x0202);
    LCD_WriteReg(0x0009,0x0000);
    LCD_WriteReg(0x000a,0x0000);//display setting
    LCD_WriteReg(0x000c,0x0001);//display setting
    LCD_WriteReg(0x000d,0x0000);//0f3c
    LCD_WriteReg(0x000f,0x0000);
    //电源配置
    LCD_WriteReg(0x0010,0x0000);
    LCD_WriteReg(0x0011,0x0007);
    LCD_WriteReg(0x0012,0x0000);
    LCD_WriteReg(0x0013,0x0000);
    LCD_WriteReg(0x0007,0x0001);
    Delay_ms(50);
    LCD_WriteReg(0x0010,0x1490);
    LCD_WriteReg(0x0011,0x0227);
    Delay_ms(50);
    LCD_WriteReg(0x0012,0x008A);
    Delay_ms(50);
    LCD_WriteReg(0x0013,0x1a00);
    LCD_WriteReg(0x0029,0x0006);
    LCD_WriteReg(0x002b,0x000d);
    Delay_ms(50);
    LCD_WriteReg(0x0020,0x0000);
    LCD_WriteReg(0x0021,0x0000);
    Delay_ms(50);
    //伽马校正
    LCD_WriteReg(0x0030,0x0000);
    LCD_WriteReg(0x0031,0x0604);
    LCD_WriteReg(0x0032,0x0305);
    LCD_WriteReg(0x0035,0x0000);
    LCD_WriteReg(0x0036,0x0C09);
    LCD_WriteReg(0x0037,0x0204);
    LCD_WriteReg(0x0038,0x0301);
    LCD_WriteReg(0x0039,0x0707);
    LCD_WriteReg(0x003c,0x0000);
    LCD_WriteReg(0x003d,0x0a0a);
    Delay_ms(50);
    LCD_WriteReg(0x0050,0x0000); //水平GRAM起始位置
    LCD_WriteReg(0x0051,0x00ef); //水平GRAM终止位置
    LCD_WriteReg(0x0052,0x0000); //垂直GRAM起始位置
    LCD_WriteReg(0x0053,0x013f); //垂直GRAM终止位置

    LCD_WriteReg(0x0060,0xa700);
    LCD_WriteReg(0x0061,0x0001);
    LCD_WriteReg(0x006a,0x0000);
    LCD_WriteReg(0x0080,0x0000);
    LCD_WriteReg(0x0081,0x0000);
    LCD_WriteReg(0x0082,0x0000);
    LCD_WriteReg(0x0083,0x0000);
    LCD_WriteReg(0x0084,0x0000);
    LCD_WriteReg(0x0085,0x0000);

    LCD_WriteReg(0x0090,0x0010);
    LCD_WriteReg(0x0092,0x0600);
    //开启显示设置
    LCD_WriteReg(0x0007,0x0133);
  }else if(lcddev.id==0x9320)//测试OK.
  {
    LCD_WriteReg(0x00,0x0000);
    LCD_WriteReg(0x01,0x0100);	//Driver Output Contral.
    LCD_WriteReg(0x02,0x0700);	//TFTLCD Driver Waveform Contral.
    LCD_WriteReg(0x03,0x1030);//Entry Mode Set.
    //LCD_WriteReg(0x03,0x1018);	//Entry Mode Set.

    LCD_WriteReg(0x04,0x0000);	//Scalling Contral.
    LCD_WriteReg(0x08,0x0202);	//Display Contral 2.(0x0207)
    LCD_WriteReg(0x09,0x0000);	//Display Contral 3.(0x0000)
    LCD_WriteReg(0x0a,0x0000);	//Frame Cycle Contal.(0x0000)
    LCD_WriteReg(0x0c,(1<<0));	//Extern Display Interface Contral 1.(0x0000)
    LCD_WriteReg(0x0d,0x0000);	//Frame Maker Position.
    LCD_WriteReg(0x0f,0x0000);	//Extern Display Interface Contral 2.
    Delay_ms(50);
    LCD_WriteReg(0x07,0x0101);	//Display Contral.
    Delay_ms(50);
    LCD_WriteReg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4));	//Power Control 1.(0x16b0)
    LCD_WriteReg(0x11,0x0007);								//Power Control 2.(0x0001)
    LCD_WriteReg(0x12,(1<<8)|(1<<4)|(0<<0));				//Power Control 3.(0x0138)
    LCD_WriteReg(0x13,0x0b00);								//Power Control 4.
    LCD_WriteReg(0x29,0x0000);								//Power Control 7.

    LCD_WriteReg(0x2b,(1<<14)|(1<<4));
    LCD_WriteReg(0x50,0);	//Set X Star
    //水平GRAM终止位置Set X End.
    LCD_WriteReg(0x51,239);	//Set Y Star
    LCD_WriteReg(0x52,0);	//Set Y End.t.
    LCD_WriteReg(0x53,319);	//

    LCD_WriteReg(0x60,0x2700);	//Driver Output Control.
    LCD_WriteReg(0x61,0x0001);	//Driver Output Control.
    LCD_WriteReg(0x6a,0x0000);	//Vertical Srcoll Control.

    LCD_WriteReg(0x80,0x0000);	//Display Position? Partial Display 1.
    LCD_WriteReg(0x81,0x0000);	//RAM Address Start? Partial Display 1.
    LCD_WriteReg(0x82,0x0000);	//RAM Address End-Partial Display 1.
    LCD_WriteReg(0x83,0x0000);	//Displsy Position? Partial Display 2.
    LCD_WriteReg(0x84,0x0000);	//RAM Address Start? Partial Display 2.
    LCD_WriteReg(0x85,0x0000);	//RAM Address End? Partial Display 2.

    LCD_WriteReg(0x90,(0<<7)|(16<<0));	//Frame Cycle Contral.(0x0013)
    LCD_WriteReg(0x92,0x0000);	//Panel Interface Contral 2.(0x0000)
    LCD_WriteReg(0x93,0x0001);	//Panel Interface Contral 3.
    LCD_WriteReg(0x95,0x0110);	//Frame Cycle Contral.(0x0110)
    LCD_WriteReg(0x97,(0<<8));	//
    LCD_WriteReg(0x98,0x0000);	//Frame Cycle Contral.
    LCD_WriteReg(0x07,0x0173);	//(0x0173)
  }else if(lcddev.id==0X9331)//OK |/|/|
  {
    LCD_WriteReg(0x00E7, 0x1014);
    LCD_WriteReg(0x0001, 0x0100); // set SS and SM bit
    LCD_WriteReg(0x0002, 0x0200); // set 1 line inversion
    LCD_WriteReg(0x0003,(1<<12)|(3<<4)|(1<<3));//65K
    //LCD_WriteReg(0x0003, 0x1030); // set GRAM write direction and BGR=1.
    LCD_WriteReg(0x0008, 0x0202); // set the back porch and front porch
    LCD_WriteReg(0x0009, 0x0000); // set non-display area refresh cycle ISC[3:0]
    LCD_WriteReg(0x000A, 0x0000); // FMARK function
    LCD_WriteReg(0x000C, 0x0000); // RGB interface setting
    LCD_WriteReg(0x000D, 0x0000); // Frame marker Position
    LCD_WriteReg(0x000F, 0x0000); // RGB interface polarity
    //*************Power On sequence ****************//
    LCD_WriteReg(0x0010, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB
    LCD_WriteReg(0x0011, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0]
    LCD_WriteReg(0x0012, 0x0000); // VREG1OUT voltage
    LCD_WriteReg(0x0013, 0x0000); // VDV[4:0] for VCOM amplitude
    Delay_ms(200); // Dis-charge capacitor power voltage
    LCD_WriteReg(0x0010, 0x1690); // SAP, BT[3:0], AP, DSTB, SLP, STB
    LCD_WriteReg(0x0011, 0x0227); // DC1[2:0], DC0[2:0], VC[2:0]
    Delay_ms(50); // Delay 50ms
    LCD_WriteReg(0x0012, 0x000C); // Internal reference voltage= Vci;
    Delay_ms(50); // Delay 50ms
    LCD_WriteReg(0x0013, 0x0800); // Set VDV[4:0] for VCOM amplitude
    LCD_WriteReg(0x0029, 0x0011); // Set VCM[5:0] for VCOMH
    LCD_WriteReg(0x002B, 0x000B); // Set Frame Rate
    Delay_ms(50); // Delay 50ms
    LCD_WriteReg(0x0020, 0x0000); // GRAM horizontal Address
    LCD_WriteReg(0x0021, 0x013f); // GRAM Vertical Address
    // ----------- Adjust the Gamma Curve ----------//
    LCD_WriteReg(0x0030, 0x0000);
    LCD_WriteReg(0x0031, 0x0106);
    LCD_WriteReg(0x0032, 0x0000);
    LCD_WriteReg(0x0035, 0x0204);
    LCD_WriteReg(0x0036, 0x160A);
    LCD_WriteReg(0x0037, 0x0707);
    LCD_WriteReg(0x0038, 0x0106);
    LCD_WriteReg(0x0039, 0x0707);
    LCD_WriteReg(0x003C, 0x0402);
    LCD_WriteReg(0x003D, 0x0C0F);
    //------------------ Set GRAM area ---------------//
    LCD_WriteReg(0x0050, 0x0000); // Horizontal GRAM Start Address
    LCD_WriteReg(0x0051, 0x00EF); // Horizontal GRAM End Address
    LCD_WriteReg(0x0052, 0x0000); // Vertical GRAM Start Address
    LCD_WriteReg(0x0053, 0x013F); // Vertical GRAM Start Address
    LCD_WriteReg(0x0060, 0x2700); // Gate Scan Line
    LCD_WriteReg(0x0061, 0x0001); // NDL,VLE, REV
    LCD_WriteReg(0x006A, 0x0000); // set scrolling line
    //-------------- Partial Display Control ---------//
    LCD_WriteReg(0x0080, 0x0000);
    LCD_WriteReg(0x0081, 0x0000);
    LCD_WriteReg(0x0082, 0x0000);
    LCD_WriteReg(0x0083, 0x0000);
    LCD_WriteReg(0x0084, 0x0000);
    LCD_WriteReg(0x0085, 0x0000);
    //-------------- Panel Control -------------------//
    LCD_WriteReg(0x0090, 0x0010);
    LCD_WriteReg(0x0092, 0x0600);
    LCD_WriteReg(0x0007, 0x0133); // 262K color and display ON
  }else if(lcddev.id==0x5408)
  {
    LCD_WriteReg(0x01,0x0100);
    LCD_WriteReg(0x02,0x0700);//TFTLCD Driving Waveform Contral
    LCD_WriteReg(0x03,0x1030);//Entry Mode设置
    //指针从左至右自上而下的自动增模式
    //Normal Mode(Window Mode disable)
    //RGB格式
    //16位数据2次传输的8总线设置
    LCD_WriteReg(0x04,0x0000); //Scalling Control register
    LCD_WriteReg(0x08,0x0207); //Display Control 2
    LCD_WriteReg(0x09,0x0000); //Display Control 3
    LCD_WriteReg(0x0A,0x0000); //Frame Cycle Control
    LCD_WriteReg(0x0C,0x0000); //External Display Interface Control 1
    LCD_WriteReg(0x0D,0x0000); //Frame Maker Position
    LCD_WriteReg(0x0F,0x0000); //External Display Interface Control 2
    Delay_ms(20);
    //TFT 液晶彩色图像显示方法14
    LCD_WriteReg(0x10,0x16B0); //0x14B0 //Power Control 1
    LCD_WriteReg(0x11,0x0001); //0x0007 //Power Control 2
    LCD_WriteReg(0x17,0x0001); //0x0000 //Power Control 3
    LCD_WriteReg(0x12,0x0138); //0x013B //Power Control 4
    LCD_WriteReg(0x13,0x0800); //0x0800 //Power Control 5
    LCD_WriteReg(0x29,0x0009); //NVM read data 2
    LCD_WriteReg(0x2a,0x0009); //NVM read data 3
    LCD_WriteReg(0xa4,0x0000);
    LCD_WriteReg(0x50,0x0000); //设置操作窗口的X轴开始列
    LCD_WriteReg(0x51,0x00EF); //设置操作窗口的X轴结束列
    LCD_WriteReg(0x52,0x0000); //设置操作窗口的Y轴开始行
    LCD_WriteReg(0x53,0x013F); //设置操作窗口的Y轴结束行
    LCD_WriteReg(0x60,0x2700); //Driver Output Control
    //设置屏幕的点数以及扫描的起始行
    LCD_WriteReg(0x61,0x0001); //Driver Output Control
    LCD_WriteReg(0x6A,0x0000); //Vertical Scroll Control
    LCD_WriteReg(0x80,0x0000); //Display Position – Partial Display 1
    LCD_WriteReg(0x81,0x0000); //RAM Address Start – Partial Display 1
    LCD_WriteReg(0x82,0x0000); //RAM address End - Partial Display 1
    LCD_WriteReg(0x83,0x0000); //Display Position – Partial Display 2
    LCD_WriteReg(0x84,0x0000); //RAM Address Start – Partial Display 2
    LCD_WriteReg(0x85,0x0000); //RAM address End – Partail Display2
    LCD_WriteReg(0x90,0x0013); //Frame Cycle Control
    LCD_WriteReg(0x92,0x0000);  //Panel Interface Control 2
    LCD_WriteReg(0x93,0x0003); //Panel Interface control 3
    LCD_WriteReg(0x95,0x0110);  //Frame Cycle Control
    LCD_WriteReg(0x07,0x0173);
    Delay_ms(50);
  }
  else if(lcddev.id==0x1505)//OK
  {
    // second release on 3/5  ,luminance is acceptable,water wave appear during camera preview
    LCD_WriteReg(0x0007,0x0000);
    Delay_ms(50);
    LCD_WriteReg(0x0012,0x011C);//0x011A   why need to set several times?
    LCD_WriteReg(0x00A4,0x0001);//NVM
    LCD_WriteReg(0x0008,0x000F);
    LCD_WriteReg(0x000A,0x0008);
    LCD_WriteReg(0x000D,0x0008);
    //伽马校正
    LCD_WriteReg(0x0030,0x0707);
    LCD_WriteReg(0x0031,0x0007); //0x0707
    LCD_WriteReg(0x0032,0x0603);
    LCD_WriteReg(0x0033,0x0700);
    LCD_WriteReg(0x0034,0x0202);
    LCD_WriteReg(0x0035,0x0002); //?0x0606
    LCD_WriteReg(0x0036,0x1F0F);
    LCD_WriteReg(0x0037,0x0707); //0x0f0f  0x0105
    LCD_WriteReg(0x0038,0x0000);
    LCD_WriteReg(0x0039,0x0000);
    LCD_WriteReg(0x003A,0x0707);
    LCD_WriteReg(0x003B,0x0000); //0x0303
    LCD_WriteReg(0x003C,0x0007); //?0x0707
    LCD_WriteReg(0x003D,0x0000); //0x1313//0x1f08
    Delay_ms(50);
    LCD_WriteReg(0x0007,0x0001);
    LCD_WriteReg(0x0017,0x0001);//开启电源
    Delay_ms(50);
    //电源配置
    LCD_WriteReg(0x0010,0x17A0);
    LCD_WriteReg(0x0011,0x0217);//reference voltage VC[2:0]   Vciout = 1.00*Vcivl
    LCD_WriteReg(0x0012,0x011E);//0x011c  //Vreg1out = Vcilvl*1.80   is it the same as Vgama1out ?
    LCD_WriteReg(0x0013,0x0F00);//VDV[4:0]-->VCOM Amplitude VcomL = VcomH - Vcom Ampl
    LCD_WriteReg(0x002A,0x0000);
    LCD_WriteReg(0x0029,0x000A);//0x0001F  Vcomh = VCM1[4:0]*Vreg1out    gate source voltage??
    LCD_WriteReg(0x0012,0x013E);// 0x013C  power supply on
    //Coordinates Control//
    LCD_WriteReg(0x0050,0x0000);//0x0e00
    LCD_WriteReg(0x0051,0x00EF);
    LCD_WriteReg(0x0052,0x0000);
    LCD_WriteReg(0x0053,0x013F);
    //Pannel Image Control//
    LCD_WriteReg(0x0060,0x2700);
    LCD_WriteReg(0x0061,0x0001);
    LCD_WriteReg(0x006A,0x0000);
    LCD_WriteReg(0x0080,0x0000);
    //Partial Image Control//
    LCD_WriteReg(0x0081,0x0000);
    LCD_WriteReg(0x0082,0x0000);
    LCD_WriteReg(0x0083,0x0000);
    LCD_WriteReg(0x0084,0x0000);
    LCD_WriteReg(0x0085,0x0000);
    //Panel Interface Control//
    LCD_WriteReg(0x0090,0x0013);//0x0010 frenqucy
    LCD_WriteReg(0x0092,0x0300);
    LCD_WriteReg(0x0093,0x0005);
    LCD_WriteReg(0x0095,0x0000);
    LCD_WriteReg(0x0097,0x0000);
    LCD_WriteReg(0x0098,0x0000);

    LCD_WriteReg(0x0001,0x0100);
    LCD_WriteReg(0x0002,0x0700);
    LCD_WriteReg(0x0003,0x1038);//扫描方向 上->下  左->右
    LCD_WriteReg(0x0004,0x0000);
    LCD_WriteReg(0x000C,0x0000);
    LCD_WriteReg(0x000F,0x0000);
    LCD_WriteReg(0x0020,0x0000);
    LCD_WriteReg(0x0021,0x0000);
    LCD_WriteReg(0x0007,0x0021);
    Delay_ms(20);
    LCD_WriteReg(0x0007,0x0061);
    Delay_ms(20);
    LCD_WriteReg(0x0007,0x0173);
    Delay_ms(20);
  }else if(lcddev.id==0xB505)
  {
    LCD_WriteReg(0x0000,0x0000);
    LCD_WriteReg(0x0000,0x0000);
    LCD_WriteReg(0x0000,0x0000);
    LCD_WriteReg(0x0000,0x0000);

    LCD_WriteReg(0x00a4,0x0001);
    Delay_ms(20);
    LCD_WriteReg(0x0060,0x2700);
    LCD_WriteReg(0x0008,0x0202);

    LCD_WriteReg(0x0030,0x0214);
    LCD_WriteReg(0x0031,0x3715);
    LCD_WriteReg(0x0032,0x0604);
    LCD_WriteReg(0x0033,0x0e16);
    LCD_WriteReg(0x0034,0x2211);
    LCD_WriteReg(0x0035,0x1500);
    LCD_WriteReg(0x0036,0x8507);
    LCD_WriteReg(0x0037,0x1407);
    LCD_WriteReg(0x0038,0x1403);
    LCD_WriteReg(0x0039,0x0020);

    LCD_WriteReg(0x0090,0x001a);
    LCD_WriteReg(0x0010,0x0000);
    LCD_WriteReg(0x0011,0x0007);
    LCD_WriteReg(0x0012,0x0000);
    LCD_WriteReg(0x0013,0x0000);
    Delay_ms(20);

    LCD_WriteReg(0x0010,0x0730);
    LCD_WriteReg(0x0011,0x0137);
    Delay_ms(20);

    LCD_WriteReg(0x0012,0x01b8);
    Delay_ms(20);

    LCD_WriteReg(0x0013,0x0f00);
    LCD_WriteReg(0x002a,0x0080);
    LCD_WriteReg(0x0029,0x0048);
    Delay_ms(20);

    LCD_WriteReg(0x0001,0x0100);
    LCD_WriteReg(0x0002,0x0700);
    LCD_WriteReg(0x0003,0x1038);//扫描方向 上->下  左->右
    LCD_WriteReg(0x0008,0x0202);
    LCD_WriteReg(0x000a,0x0000);
    LCD_WriteReg(0x000c,0x0000);
    LCD_WriteReg(0x000d,0x0000);
    LCD_WriteReg(0x000e,0x0030);
    LCD_WriteReg(0x0050,0x0000);
    LCD_WriteReg(0x0051,0x00ef);
    LCD_WriteReg(0x0052,0x0000);
    LCD_WriteReg(0x0053,0x013f);
    LCD_WriteReg(0x0060,0x2700);
    LCD_WriteReg(0x0061,0x0001);
    LCD_WriteReg(0x006a,0x0000);
    //LCD_WriteReg(0x0080,0x0000);
    //LCD_WriteReg(0x0081,0x0000);
    LCD_WriteReg(0x0090,0X0011);
    LCD_WriteReg(0x0092,0x0600);
    LCD_WriteReg(0x0093,0x0402);
    LCD_WriteReg(0x0094,0x0002);
    Delay_ms(20);

    LCD_WriteReg(0x0007,0x0001);
    Delay_ms(20);
    LCD_WriteReg(0x0007,0x0061);
    LCD_WriteReg(0x0007,0x0173);

    LCD_WriteReg(0x0020,0x0000);
    LCD_WriteReg(0x0021,0x0000);
    LCD_WriteReg(0x00,0x22);
  }else if(lcddev.id==0xC505)
  {
    LCD_WriteReg(0x0000,0x0000);
    LCD_WriteReg(0x0000,0x0000);
    Delay_ms(20);
    LCD_WriteReg(0x0000,0x0000);
    LCD_WriteReg(0x0000,0x0000);
    LCD_WriteReg(0x0000,0x0000);
    LCD_WriteReg(0x0000,0x0000);
    LCD_WriteReg(0x00a4,0x0001);
    Delay_ms(20);
    LCD_WriteReg(0x0060,0x2700);
    LCD_WriteReg(0x0008,0x0806);

    LCD_WriteReg(0x0030,0x0703);//gamma setting
    LCD_WriteReg(0x0031,0x0001);
    LCD_WriteReg(0x0032,0x0004);
    LCD_WriteReg(0x0033,0x0102);
    LCD_WriteReg(0x0034,0x0300);
    LCD_WriteReg(0x0035,0x0103);
    LCD_WriteReg(0x0036,0x001F);
    LCD_WriteReg(0x0037,0x0703);
    LCD_WriteReg(0x0038,0x0001);
    LCD_WriteReg(0x0039,0x0004);



    LCD_WriteReg(0x0090, 0x0015);	//80Hz
    LCD_WriteReg(0x0010, 0X0410);	//BT,AP
    LCD_WriteReg(0x0011,0x0247);	//DC1,DC0,VC
    LCD_WriteReg(0x0012, 0x01BC);
    LCD_WriteReg(0x0013, 0x0e00);
    Delay_ms(120);
    LCD_WriteReg(0x0001, 0x0100);
    LCD_WriteReg(0x0002, 0x0200);
    LCD_WriteReg(0x0003, 0x1030);

    LCD_WriteReg(0x000A, 0x0008);
    LCD_WriteReg(0x000C, 0x0000);

    LCD_WriteReg(0x000E, 0x0020);
    LCD_WriteReg(0x000F, 0x0000);
    LCD_WriteReg(0x0020, 0x0000);	//H Start
    LCD_WriteReg(0x0021, 0x0000);	//V Start
    LCD_WriteReg(0x002A,0x003D);	//vcom2
    Delay_ms(20);
    LCD_WriteReg(0x0029, 0x002d);
    LCD_WriteReg(0x0050, 0x0000);
    LCD_WriteReg(0x0051, 0xD0EF);
    LCD_WriteReg(0x0052, 0x0000);
    LCD_WriteReg(0x0053, 0x013F);
    LCD_WriteReg(0x0061, 0x0000);
    LCD_WriteReg(0x006A, 0x0000);
    LCD_WriteReg(0x0092,0x0300);

    LCD_WriteReg(0x0093, 0x0005);
    LCD_WriteReg(0x0007, 0x0100);
  }else if(lcddev.id==0x4531)//OK |/|/|
  {
    LCD_WriteReg(0X00,0X0001);
    Delay_ms(10);
    LCD_WriteReg(0X10,0X1628);
    LCD_WriteReg(0X12,0X000e);//0x0006
    LCD_WriteReg(0X13,0X0A39);
    Delay_ms(10);
    LCD_WriteReg(0X11,0X0040);
    LCD_WriteReg(0X15,0X0050);
    Delay_ms(10);
    LCD_WriteReg(0X12,0X001e);//16
    Delay_ms(10);
    LCD_WriteReg(0X10,0X1620);
    LCD_WriteReg(0X13,0X2A39);
    Delay_ms(10);
    LCD_WriteReg(0X01,0X0100);
    LCD_WriteReg(0X02,0X0300);
    LCD_WriteReg(0X03,0X1038);//改变方向的
    LCD_WriteReg(0X08,0X0202);
    LCD_WriteReg(0X0A,0X0008);
    LCD_WriteReg(0X30,0X0000);
    LCD_WriteReg(0X31,0X0402);
    LCD_WriteReg(0X32,0X0106);
    LCD_WriteReg(0X33,0X0503);
    LCD_WriteReg(0X34,0X0104);
    LCD_WriteReg(0X35,0X0301);
    LCD_WriteReg(0X36,0X0707);
    LCD_WriteReg(0X37,0X0305);
    LCD_WriteReg(0X38,0X0208);
    LCD_WriteReg(0X39,0X0F0B);
    LCD_WriteReg(0X41,0X0002);
    LCD_WriteReg(0X60,0X2700);
    LCD_WriteReg(0X61,0X0001);
    LCD_WriteReg(0X90,0X0210);
    LCD_WriteReg(0X92,0X010A);
    LCD_WriteReg(0X93,0X0004);
    LCD_WriteReg(0XA0,0X0100);
    LCD_WriteReg(0X07,0X0001);
    LCD_WriteReg(0X07,0X0021);
    LCD_WriteReg(0X07,0X0023);
    LCD_WriteReg(0X07,0X0033);
    LCD_WriteReg(0X07,0X0133);
    LCD_WriteReg(0XA0,0X0000);
  }else if(lcddev.id==0x4535)
  {
    LCD_WriteReg(0X15,0X0030);
    LCD_WriteReg(0X9A,0X0010);
    LCD_WriteReg(0X11,0X0020);
    LCD_WriteReg(0X10,0X3428);
    LCD_WriteReg(0X12,0X0002);//16
    LCD_WriteReg(0X13,0X1038);
    Delay_ms(40);
    LCD_WriteReg(0X12,0X0012);//16
    Delay_ms(40);
    LCD_WriteReg(0X10,0X3420);
    LCD_WriteReg(0X13,0X3038);
    Delay_ms(70);
    LCD_WriteReg(0X30,0X0000);
    LCD_WriteReg(0X31,0X0402);
    LCD_WriteReg(0X32,0X0307);
    LCD_WriteReg(0X33,0X0304);
    LCD_WriteReg(0X34,0X0004);
    LCD_WriteReg(0X35,0X0401);
    LCD_WriteReg(0X36,0X0707);
    LCD_WriteReg(0X37,0X0305);
    LCD_WriteReg(0X38,0X0610);
    LCD_WriteReg(0X39,0X0610);

    LCD_WriteReg(0X01,0X0100);
    LCD_WriteReg(0X02,0X0300);
    LCD_WriteReg(0X03,0X1030);//改变方向的
    LCD_WriteReg(0X08,0X0808);
    LCD_WriteReg(0X0A,0X0008);
    LCD_WriteReg(0X60,0X2700);
    LCD_WriteReg(0X61,0X0001);
    LCD_WriteReg(0X90,0X013E);
    LCD_WriteReg(0X92,0X0100);
    LCD_WriteReg(0X93,0X0100);
    LCD_WriteReg(0XA0,0X3000);
    LCD_WriteReg(0XA3,0X0010);
    LCD_WriteReg(0X07,0X0001);
    LCD_WriteReg(0X07,0X0021);
    LCD_WriteReg(0X07,0X0023);
    LCD_WriteReg(0X07,0X0033);
    LCD_WriteReg(0X07,0X0133);
  }else if(lcddev.id==0X1963)
  {
    LCD_WR_REG(0xE2);		//Set PLL with OSC = 10MHz (hardware),	Multiplier N = 35, 250MHz < VCO < 800MHz = OSC*(N+1), VCO = 300MHz
    LCD_WR_DATA(0x1D);		//参数1
    LCD_WR_DATA(0x02);		//参数2 Divider M = 2, PLL = 300/(M+1) = 100MHz
    LCD_WR_DATA(0x04);		//参数3 Validate M and N values
    Delay_us(100);
    LCD_WR_REG(0xE0);		// Start PLL command
    LCD_WR_DATA(0x01);		// enable PLL
    Delay_ms(10);
    LCD_WR_REG(0xE0);		// Start PLL command again
    LCD_WR_DATA(0x03);		// now, use PLL output as system clock
    Delay_ms(12);
    LCD_WR_REG(0x01);		//软复位
    Delay_ms(10);

    LCD_WR_REG(0xE6);		//设置像素频率,33Mhz
    LCD_WR_DATA(0x2F);
    LCD_WR_DATA(0xFF);
    LCD_WR_DATA(0xFF);

    LCD_WR_REG(0xB0);		//设置LCD模式
    LCD_WR_DATA(0x20);		//24位模式
    LCD_WR_DATA(0x00);		//TFT 模式

    LCD_WR_DATA((SSD_HOR_RESOLUTION-1)>>8);//设置LCD水平像素
    LCD_WR_DATA(SSD_HOR_RESOLUTION-1);
    LCD_WR_DATA((SSD_VER_RESOLUTION-1)>>8);//设置LCD垂直像素
    LCD_WR_DATA(SSD_VER_RESOLUTION-1);
    LCD_WR_DATA(0x00);		//RGB序列

    LCD_WR_REG(0xB4);		//Set horizontal period
    LCD_WR_DATA((SSD_HT-1)>>8);
    LCD_WR_DATA(SSD_HT-1);
    LCD_WR_DATA(SSD_HPS>>8);
    LCD_WR_DATA(SSD_HPS);
    LCD_WR_DATA(SSD_HOR_PULSE_WIDTH-1);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);
    LCD_WR_REG(0xB6);		//Set vertical period
    LCD_WR_DATA((SSD_VT-1)>>8);
    LCD_WR_DATA(SSD_VT-1);
    LCD_WR_DATA(SSD_VPS>>8);
    LCD_WR_DATA(SSD_VPS);
    LCD_WR_DATA(SSD_VER_FRONT_PORCH-1);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0xF0);	//设置SSD1963与CPU接口为16bit
    LCD_WR_DATA(0x03);	//16-bit(565 format) data for 16bpp

    LCD_WR_REG(0x29);	//开启显示
    //设置PWM输出  背光通过占空比可调
    LCD_WR_REG(0xD0);	//设置自动白平衡DBC
    LCD_WR_DATA(0x00);	//disable

    LCD_WR_REG(0xBE);	//配置PWM输出
    LCD_WR_DATA(0x05);	//1设置PWM频率
    LCD_WR_DATA(0xFE);	//2设置PWM占空比
    LCD_WR_DATA(0x01);	//3设置C
    LCD_WR_DATA(0x00);	//4设置D
    LCD_WR_DATA(0x00);	//5设置E
    LCD_WR_DATA(0x00);	//6设置F

    LCD_WR_REG(0xB8);	//设置GPIO配置
    LCD_WR_DATA(0x03);	//2个IO口设置成输出
    LCD_WR_DATA(0x01);	//GPIO使用正常的IO功能
    LCD_WR_REG(0xBA);
    LCD_WR_DATA(0X01);	//GPIO[1:0]=01,控制LCD方向

    LCD_SSD_BackLightSet(100);//背光设置为最亮
  }
  LCD_Display_Dir(0);		//默认为竖屏
  LCD_LED_ON();				//点亮背光
  LCD_Clear(WHITE);
}
//清屏函数
//color:要清屏的填充色
void LCD_Clear(uint16_t color)
{
  uint32_t index=0;
  uint32_t totalpoint=lcddev.width;
  totalpoint*=lcddev.height; 			//得到总点数
  if((lcddev.id==0X6804)&&(lcddev.dir==1))//6804横屏的时候特殊处理
  {
    lcddev.dir=0;
    lcddev.setxcmd=0X2A;
    lcddev.setycmd=0X2B;
    LCD_SetCursor(0x00,0x0000);		//设置光标位置
    lcddev.dir=1;
    lcddev.setxcmd=0X2B;
    lcddev.setycmd=0X2A;
  }else LCD_SetCursor(0x00,0x0000);	//设置光标位置
  LCD_WriteRAM_Prepare();     		//开始写入GRAM
  for(index=0;index<totalpoint;index++)
  {
    TFTLCD->LCD_RAM=color;
  }
}
//在指定区域内填充单个颜色
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)
//color:要填充的颜色
void LCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color)
{
  uint16_t i,j;
  uint16_t xlen=0;
  uint16_t temp;
  if((lcddev.id==0X6804)&&(lcddev.dir==1))	//6804横屏的时候特殊处理
  {
    temp=sx;
    sx=sy;
    sy=lcddev.width-ex-1;
    ex=ey;
    ey=lcddev.width-temp-1;
    lcddev.dir=0;
    lcddev.setxcmd=0X2A;
    lcddev.setycmd=0X2B;
    LCD_Fill(sx,sy,ex,ey,color);
    lcddev.dir=1;
    lcddev.setxcmd=0X2B;
    lcddev.setycmd=0X2A;
  }else
  {
    xlen=ex-sx+1;
    for(i=sy;i<=ey;i++)
    {
      LCD_SetCursor(sx,i);      				//设置光标位置
      LCD_WriteRAM_Prepare();     			//开始写入GRAM
      for(j=0;j<xlen;j++)TFTLCD->LCD_RAM=color;	//显示颜色
    }
  }
}
//在指定区域内填充指定颜色块
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)
//color:要填充的颜色
void LCD_Color_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color)
{
  uint16_t height,width;
  uint16_t i,j;
  width=ex-sx+1; 			//得到填充的宽度
  height=ey-sy+1;			//高度
  for(i=0;i<height;i++)
  {
    LCD_SetCursor(sx,sy+i);   	//设置光标位置
    LCD_WriteRAM_Prepare();     //开始写入GRAM
    for(j=0;j<width;j++)TFTLCD->LCD_RAM=color[i*width+j];//写入数据
  }
}
//画线
//x1,y1:起点坐标
//x2,y2:终点坐标
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
  uint16_t t;
  int xerr=0,yerr=0,delta_x,delta_y,distance;
  int incx,incy,uRow,uCol;
  delta_x=x2-x1; //计算坐标增量
  delta_y=y2-y1;
  uRow=x1;
  uCol=y1;
  if(delta_x>0)incx=1; //设置单步方向
  else if(delta_x==0)incx=0;//垂直线
  else {incx=-1;delta_x=-delta_x;}
  if(delta_y>0)incy=1;
  else if(delta_y==0)incy=0;//水平线
  else{incy=-1;delta_y=-delta_y;}
  if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  else distance=delta_y;
  for(t=0;t<=distance+1;t++ )//画线输出
  {
    LCD_DrawPoint(uRow,uCol);//画点
    xerr+=delta_x ;
    yerr+=delta_y ;
    if(xerr>distance)
    {
      xerr-=distance;
      uRow+=incx;
    }
    if(yerr>distance)
    {
      yerr-=distance;
      uCol+=incy;
    }
  }
}
//画矩形
//(x1,y1),(x2,y2):矩形的对角坐标
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
  LCD_DrawLine(x1,y1,x2,y1);
  LCD_DrawLine(x1,y1,x1,y2);
  LCD_DrawLine(x1,y2,x2,y2);
  LCD_DrawLine(x2,y1,x2,y2);
}
//在指定位置画一个指定大小的圆
//(x,y):中心点
//r    :半径
void LCD_Draw_Circle(uint16_t x0,uint16_t y0,uint8_t r)
{
  int a,b;
  int di;
  a=0;b=r;
  di=3-(r<<1);             //判断下个点位置的标志
  while(a<=b)
  {
    LCD_DrawPoint(x0+a,y0-b);             //5
    LCD_DrawPoint(x0+b,y0-a);             //0
    LCD_DrawPoint(x0+b,y0+a);             //4
    LCD_DrawPoint(x0+a,y0+b);             //6
    LCD_DrawPoint(x0-a,y0+b);             //1
    LCD_DrawPoint(x0-b,y0+a);
    LCD_DrawPoint(x0-a,y0-b);             //2
    LCD_DrawPoint(x0-b,y0-a);             //7
    a++;
    //使用Bresenham算法画圆
    if(di<0)di +=4*a+6;
    else
    {
      di+=10+4*(a-b);
      b--;
    }
  }
}
//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t size,uint8_t mode)
{
  uint8_t temp,t1,t;
  uint16_t y0=y;
  uint8_t csize=(size/8+((size%8)?1:0))*(size/2);		//得到字体一个字符对应点阵集所占的字节数
  num=num-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
  for(t=0;t<csize;t++)
  {
    if(size==12)temp=asc2_1206[num][t]; 	 	//调用1206字体
    else if(size==16)temp=asc2_1608[num][t];	//调用1608字体
    else if(size==24)temp=asc2_2412[num][t];	//调用2412字体
    else return;								//没有的字库
    for(t1=0;t1<8;t1++)
    {
      if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
      else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);
      temp<<=1;
      y++;
      if(y>=lcddev.height)return;		//超区域了
      if((y-y0)==size)
      {
        y=y0;
        x++;
        if(x>=lcddev.width)return;	//超区域了
        break;
      }
    }
  }
}
//m^n函数
//返回值:m^n次方.
uint32_t LCD_Pow(uint8_t m,uint8_t n)
{
  uint32_t result=1;
  while(n--)result*=m;
  return result;
}
//显示数字,高位为0,则不显示
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//color:颜色
//num:数值(0~4294967295);
void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size)
{
  uint8_t t,temp;
  uint8_t enshow=0;
  for(t=0;t<len;t++)
  {
    temp=(num/LCD_Pow(10,len-t-1))%10;
    if(enshow==0&&t<(len-1))
    {
      if(temp==0)
      {
        LCD_ShowChar(x+(size/2)*t,y,' ',size,0);
        continue;
      }else enshow=1;

    }
    LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,0);
  }
}
//显示数字,高位为0,还是显示
//x,y:起点坐标
//num:数值(0~999999999);
//len:长度(即要显示的位数)
//size:字体大小
//mode:
//[7]:0,不填充;1,填充0.
//[6:1]:保留
//[0]:0,非叠加显示;1,叠加显示.
void LCD_ShowxNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size,uint8_t mode)
{
  uint8_t t,temp;
  uint8_t enshow=0;
  for(t=0;t<len;t++)
  {
    temp=(num/LCD_Pow(10,len-t-1))%10;
    if(enshow==0&&t<(len-1))
    {
      if(temp==0)
      {
        if(mode&0X80)LCD_ShowChar(x+(size/2)*t,y,'0',size,mode&0X01);
        else LCD_ShowChar(x+(size/2)*t,y,' ',size,mode&0X01);
        continue;
      }else enshow=1;

    }
    LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,mode&0X01);
  }
}
//显示字符串
//x,y:起点坐标
//width,height:区域大小
//size:字体大小
//*p:字符串起始地址
void LCD_ShowString(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8_t size,uint8_t *p)
{
  uint8_t x0=x;
  width+=x;
  height+=y;
  while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
  {
    if(x>=width){x=x0;y+=size;}
    if(y>=height)break;//退出
    LCD_ShowChar(x,y,*p,size,0);
    x+=size/2;
    p++;
  }
}
//设置显示区域
//begine_x,begine_y:起点坐标
//end_x,end_y:终点坐标
void LCD_SetShowArea(uint16_t begine_x,uint16_t end_x,uint16_t begine_y,uint16_t end_y)
{
	//设置显示区域
	//设置光标位置(0x2A 0x2B)
	LCD_WR_REG(lcddev.setxcmd);//设置页地址命令
	LCD_WR_DATA(begine_x>>8);//设置页的开始地址 高字节
	LCD_WR_DATA(begine_x&0XFF); //设置页的开始地址 低字节
	LCD_WR_DATA((end_x-1)>>8);//设置页的结束地址 高字节
	LCD_WR_DATA((end_x-1)&0xFF);//设置页的结束地址 低字节		
	LCD_WR_REG(lcddev.setycmd);//设置列地址命令
	LCD_WR_DATA(begine_y>>8);//设置列的开始地址 高字节
	LCD_WR_DATA(begine_y&0XFF);//设置列的开始地址 低字节
	LCD_WR_DATA((end_y-1)>>8);//设置列的结束地址 高字节
	LCD_WR_DATA((end_y-1)&0xFF);//设置列的结束地址 低字节
}
//显示图片
//x,y:起点坐标
//width,height:区域大小
//*p:图片起始地址
void LCD_ShowPicture(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8_t *p)
{
	uint16_t i=0,j=0;
	uint16_t pcolor = 0;
	//设置显示区域
	//设置光标位置(0x2A 0x2B)
	LCD_SetShowArea(x,x+width,y,y+height);
	TFTLCD->LCD_REG=lcddev.wramcmd;//开始写入GRAM(0x2C)
	for(j=0;j<height;j++)
	{
		for(i=0;i<width;i++)
		{
			pcolor = (*p<<8)|(*(p+1));
			TFTLCD->LCD_RAM=pcolor;  //写显示颜色
			p+=2;
		}
	}
}
//显示图片
//x,y:起点坐标
//width,height:区域大小
//b_color -- 背景色 f_color -- 前景色
//*p:字模起始地址
void LCD_ShowxXx(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint16_t b_color,uint16_t f_color,uint8_t *p)
{
	uint16_t i,j,k;
	//设置显示区域
	//设置光标位置(0x2A 0x2B)
	LCD_SetShowArea(x,x+width,y,y+height);
	TFTLCD->LCD_REG=lcddev.wramcmd;//开始写入GRAM(0x2C)
	for(j=0;j<height;j++)//行 -- 页
	{                              
		for(i=0;i<width/8;i++)//列
		{
				for(k=0;k<8;k++)
				{
					//画点
					if(*p & (0x80>>k)) //从最高开描点,只须判断一位
						TFTLCD->LCD_RAM=f_color;//描字符颜色
					else
						TFTLCD->LCD_RAM=b_color;//描背景颜色   
				}
				p++;
		}
		
	}
}



bsp_lcd.h

#ifndef __LCD_H
#define __LCD_H
#include "main.h"

//LCD重要参数集
typedef struct
{
  uint16_t width;			//LCD 宽度
  uint16_t height;			//LCD 高度
  uint16_t id;				//LCD ID
  uint8_t  dir;			//横屏还是竖屏控制:0,竖屏;1,横屏。
  uint16_t	wramcmd;		//开始写gram指令
  uint16_t  setxcmd;		//设置x坐标指令
  uint16_t  setycmd;		//设置y坐标指令
}_lcd_dev;

//LCD参数
extern _lcd_dev lcddev;	//管理LCD重要参数
//LCD的画笔颜色和背景色
extern uint16_t  POINT_COLOR;//默认红色
extern uint16_t  BACK_COLOR; //背景颜色.默认为白色


//
//-----------------LCD端口定义----------------
#define	LCD_LED_ON()     GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_SET)
#define	LCD_LED_OFF()    GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_RESET)//LCD背光
//LCD地址结构体
typedef struct
{
  volatile uint16_t LCD_REG;//HADDR7 = A6 = 0 给LCD屏发送指令//0x6C00 007E
  volatile uint16_t LCD_RAM;//HADDR7 = A6 = 1 给LCD屏发送数据//0x6C00 0080
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A6作为数据命令区分线
//注意设置时STM32内部会右移一位对其! 0X7E = 0111 1110(HADDR7~HADDR0)(A6~A0)
#define LCD_BASE        ((uint32_t)(0x6C000000 | 0x0000007E))//结构体变量递增
#define TFTLCD          ((LCD_TypeDef *) LCD_BASE)
//

//扫描方向定义
#define L2R_U2D  0 //从左到右,从上到下
#define L2R_D2U  1 //从左到右,从下到上
#define R2L_U2D  2 //从右到左,从上到下
#define R2L_D2U  3 //从右到左,从下到上

#define U2D_L2R  4 //从上到下,从左到右
#define U2D_R2L  5 //从上到下,从右到左
#define D2U_L2R  6 //从下到上,从左到右
#define D2U_R2L  7 //从下到上,从右到左

#define DFT_SCAN_DIR  L2R_U2D  //默认的扫描方向

//画笔颜色
#define WHITE         	 0xFFFF
#define BLACK         	 0x0000
#define BLUE         	 0x001F
#define BRED             0XF81F
#define GRED 			      0XFFE0
#define GBLUE			       0X07FF
#define RED           	 0xF800
#define MAGENTA       	 0xF81F
#define GREEN         	 0x07E0
#define CYAN          	 0x7FFF
#define YELLOW        	 0xFFE0
#define BROWN 			 0XBC40 //棕色
#define BRRED 			 0XFC07 //棕红色
#define GRAY  			 0X8430 //灰色
//GUI颜色

#define DARKBLUE      	 0X01CF	//深蓝色
#define LIGHTBLUE      	 0X7D7C	//浅蓝色
#define GRAYBLUE       	 0X5458 //灰蓝色
//以上三色为PANEL的颜色

#define LIGHTGREEN     	 0X841F //浅绿色
//#define LIGHTGRAY        0XEF5B //浅灰色(PANNEL)
#define LGRAY 			 0XC618 //浅灰色(PANNEL),窗体背景色

#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)

void TFTLCD_Init(void);													   	//初始化
void LCD_DisplayOn(void);													//开显示
void LCD_DisplayOff(void);													//关显示
void LCD_Clear(uint16_t Color);	 												//清屏
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos);										//设置光标
void LCD_DrawPoint(uint16_t x,uint16_t y);											//画点
void LCD_Fast_DrawPoint(uint16_t x,uint16_t y,uint16_t color);								//快速画点
uint16_t  LCD_ReadPoint(uint16_t x,uint16_t y); 											//读点
void LCD_Draw_Circle(uint16_t x0,uint16_t y0,uint8_t r);						 			//画圆
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);							//画线
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);		   				//画矩形
void LCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color);		   				//填充单色
void LCD_Color_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color);				//填充指定颜色
void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t size,uint8_t mode);						//显示一个字符
void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size);  						//显示一个数字
void LCD_ShowxNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size,uint8_t mode);				//显示 数字
void LCD_ShowString(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8_t size,uint8_t *p);		//显示一个字符串,12/16字体
void LCD_ShowPicture(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8_t *p);
void LCD_ShowxXx(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint16_t b_color,uint16_t f_color,uint8_t *p);
void LCD_WR_REG(volatile uint16_t regval);
void LCD_WR_DATA(volatile uint16_t data);
uint16_t LCD_RD_DATA(void);
void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue);
uint16_t LCD_ReadReg(uint16_t LCD_Reg);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(uint16_t RGB_Code);
void LCD_SSD_BackLightSet(uint8_t pwm);							//SSD1963 背光控制
void LCD_Scan_Dir(uint8_t dir);									//设置屏扫描方向
void LCD_Display_Dir(uint8_t dir);								//设置屏幕显示方向
void LCD_Set_Window(uint16_t sx,uint16_t sy,uint16_t width,uint16_t height);	//设置窗口
//LCD分辨率设置
#define SSD_HOR_RESOLUTION		320		//LCD水平分辨率
#define SSD_VER_RESOLUTION		480		//LCD垂直分辨率
//LCD驱动参数设置
#define SSD_HOR_PULSE_WIDTH		1		//水平脉宽
#define SSD_HOR_BACK_PORCH		46		//水平前廊
#define SSD_HOR_FRONT_PORCH		210		//水平后廊

#define SSD_VER_PULSE_WIDTH		1		//垂直脉宽
#define SSD_VER_BACK_PORCH		23		//垂直前廊
#define SSD_VER_FRONT_PORCH		22		//垂直前廊
//如下几个参数,自动计算
#define SSD_HT	(SSD_HOR_RESOLUTION+SSD_HOR_BACK_PORCH+SSD_HOR_FRONT_PORCH)
#define SSD_HPS	(SSD_HOR_BACK_PORCH)
#define SSD_VT 	(SSD_VER_RESOLUTION+SSD_VER_BACK_PORCH+SSD_VER_FRONT_PORCH)
#define SSD_VPS (SSD_VER_BACK_PORCH)

#endif

以上纯个人笔记,感谢评阅,欢迎交流指正。

上一篇:自制操作系统(二)


下一篇:C#中的lock关键字有何作用