stm32CubeIDE FMC 驱动LCD(8080)

news2024/12/24 21:10:44

一,TFT屏硬件接口

16位,80并口。

二,FMC介绍。

FSMC(Flexible Static Memory Controller),译为灵活的静态存储控制器。STM32F1 系列芯片使用 FSMC 外设来管理扩展的存储器,它可以用于驱动包括 SRAM、NOR FLASH 以及 NAND FLSAH 类型的存储器,不能驱动如 SDRAM 这种动态的存储器而在 STM32F429 系列的控制器中,它具有 FMC 外设,支持控制 SDRAM 存储器。

由于 FSMC 外设可以用于控制扩展的外部存储器,而 MCU 对液晶屏的操作实际上就是把显示数据写入到显存中,与控制存储器非常类似,且 8080 接口的通讯时序完全可以使用 FSMC 外设产生,因而非常适合使用 FSMC 控制液晶屏。

/** FMC GPIO Configuration

PE7 ------> FMC_D4

PE8 ------> FMC_D5

PE9 ------> FMC_D6

PE10 ------> FMC_D7

PE11 ------> FMC_D8

PE12 ------> FMC_D9

PE13 ------> FMC_D10

PE14 ------> FMC_D11

PE15 ------> FMC_D12

PD8 ------> FMC_D13

PD9 ------> FMC_D14

PD10 ------> FMC_D15

PD13 ------> FMC_A18

PD14 ------> FMC_D0

PD15 ------> FMC_D1

PD0 ------> FMC_D2

PD1 ------> FMC_D3

PD4 ------> FMC_NOE

PD5 ------> FMC_NWE

PD7 ------> FMC_NE1

*/

三,STM32CubeIDE设置

设置FMC之前,先配置GPIO引脚,不然可能不能配置FMC,可能吧。

四,时序

参考文章

(23条消息) STM32CubeIDE TFT-LCD显示_stm32cubeidestm32f407lcd_sudaroot的博客-CSDN博客

五,程序。

参考原子开发板。

lcd.h

#ifndef __LCD_H
#define __LCD_H        
#include "sys.h"     
#include "stdlib.h" 
//     
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//2.8寸/3.5寸/4.3寸/7寸 TFT液晶驱动      
//支持驱动IC型号包括:ILI9341/NT35310/NT35510/SSD1963等            
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2015/12/10
//版本:V1.5
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved    
//********************************************************************************
//升级说明
//V1.2  20170623
//简化了LCD_Init函数部分代码
//V1.3 20211111
//1,新增对ST7789驱动IC的支持
//V1.4 20211208
//修改NT5510 ID读取方式,改为先发送秘钥,然后读取C500和C501,从而获取正确的ID(0X5510)
//V1.5 20211222
//解决因NT5510 ID读取(发送C501指令)导致SSD1963误触发软件复位进而读取不到ID问题,加延时解决
//     

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

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

//LCD MPU保护参数
#define LCD_REGION_NUMBER        MPU_REGION_NUMBER0        //LCD使用region0
#define LCD_ADDRESS_START        (0X60000000)            //LCD区的首地址
#define LCD_REGION_SIZE            MPU_REGION_SIZE_256MB   //LCD区大小

//     
//-----------------MCU屏 LCD端口定义---------------- 
//LCD背光    PB5    
#define LCD_LED(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET))         
//LCD地址结构体
typedef struct
{
    vu16 LCD_REG;
    vu16 LCD_RAM;
} LCD_TypeDef;

//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A18作为数据命令区分线 
//注意设置时STM32内部会右移一位对其!                 
#define LCD_BASE        ((u32)(0x60000000 | 0x0007FFFE))
#define LCD             ((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 LCD_Init(void);                                                           //初始化
void LCD_DisplayOn(void);                                                    //开显示
void LCD_DisplayOff(void);                                                    //关显示
void LCD_Clear(u32 Color);                                                     //清屏
void LCD_SetCursor(u16 Xpos, u16 Ypos);                                        //设置光标
void LCD_DrawPoint(u16 x,u16 y);                                            //画点
void LCD_Fast_DrawPoint(u16 x,u16 y,u32 color);                                //快速画点
u32  LCD_ReadPoint(u16 x,u16 y);                                             //读点 
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r);                                     //画圆
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);                            //画线
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);                           //画矩形
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u32 color);                           //填充单色
void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color);                //填充指定颜色
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode);                        //显示一个字符
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);                          //显示一个数字
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);                //显示 数字
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p);        //显示一个字符串,12/16字体

void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue);
u16 LCD_ReadReg(u16 LCD_Reg);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(u16 RGB_Code);
void LCD_SSD_BackLightSet(u8 pwm);                            //SSD1963 背光控制
void LCD_Scan_Dir(u8 dir);                                    //设置屏扫描方向
void LCD_Display_Dir(u8 dir);                                //设置屏幕显示方向
void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height);    //设置窗口                                                                                                                               
//LCD分辨率设置
#define SSD_HOR_RESOLUTION        800        //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  
     
     



lcd.c

#include "lcd.h"
#include "stdlib.h"
#include "font.h" 
#include "usart.h"     
#include "delay.h"     
//     
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//2.8寸/3.5寸/4.3寸/7寸 TFT液晶驱动      
//支持驱动IC型号包括:ILI9341/NT35310/NT35510/SSD1963等            
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2015/12/10
//版本:V1.5
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved     
//     
//升级说明 
//V1.1  20170625
//简化了LCD_Init函数部分代码
//V1.2 20211111
//1,新增对ST7789驱动IC的支持
//V1.3 20211208
//修改NT5510 ID读取方式,改为先发送秘钥,然后读取C500和C501,从而获取正确的ID(0X5510)
//V1.4 20211222
//解决因NT5510 ID读取(发送C501指令)导致SSD1963误触发软件复位进而读取不到ID问题,加延时解决
//     

SRAM_HandleTypeDef SRAM_Handler;    //SRAM句柄(用于控制LCD)
//LCD的画笔颜色和背景色       
u32 POINT_COLOR=0xFF000000;        //画笔颜色
u32 BACK_COLOR =0xFFFFFFFF;      //背景色 
  
//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;
     
//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(vu16 regval)
{   
    regval=regval;        //使用-O2优化的时候,必须插入的延时
    LCD->LCD_REG=regval;//写入要写的寄存器序号     
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(vu16 data)
{      
    data=data;            //使用-O2优化的时候,必须插入的延时
    LCD->LCD_RAM=data;         
}
//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
    vu16 ram;            //防止被优化
    ram=LCD->LCD_RAM;    
    return ram;     
}                       
//写寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)
{    
    LCD->LCD_REG = LCD_Reg;        //写入要写的寄存器序号     
    LCD->LCD_RAM = LCD_RegValue;//写入数据                 
}       
//读寄存器
//LCD_Reg:寄存器地址
//返回值:读到的数据
u16 LCD_ReadReg(u16 LCD_Reg)
{                                           
    LCD_WR_REG(LCD_Reg);        //写入要读的寄存器序号
    delay_us(5);          
    return LCD_RD_DATA();        //返回读到的值
}   
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
     LCD->LCD_REG=lcddev.wramcmd;      
}     
//LCD写GRAM
//RGB_Code:颜色值
void LCD_WriteRAM(u16 RGB_Code)
{                                
    LCD->LCD_RAM = RGB_Code;//写十六位GRAM
}
//从ILI93xx读出的数据为GBR格式,而我们写入的时候为RGB格式。
//通过该函数转换
//c:GBR格式的颜色值
//返回值:RGB格式的颜色值
u16 LCD_BGR2RGB(u16 c)
{
    u16  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(u8 i)
{
    while(i--);
}
//读取个某点的颜色值     
//x,y:坐标
//返回值:此点的颜色
u32 LCD_ReadPoint(u16 x,u16 y)
{
     u16 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==0X5310||lcddev.id==0X1963||lcddev.id==0x7789)LCD_WR_REG(0X2E);//9341/3510/1963/7789 发送读GRAM指令
    else if(lcddev.id==0X5510)LCD_WR_REG(0X2E00);    //5510 发送读GRAM指令
     r=LCD_RD_DATA();                                //dummy Read       
    if(lcddev.id==0X1963)return r;                    //1963直接读就可以 
    opt_delay(2);      
     r=LCD_RD_DATA();                                    //实际坐标颜色
    //9341/NT35310/NT35510要分2次读出 
    opt_delay(2);      
    b=LCD_RD_DATA(); 
    g=r&0XFF;        //对于9341/5310/5510,第一次读取的是RG的值,R在前,G在后,各占8位
    g<<=8; 
    return (((r>>11)<<11)|((g>>10)<<5)|(b>>11));    //ILI9341/NT35310/NT35510需要公式转换一下
}             
//LCD开启显示
void LCD_DisplayOn(void)
{                       
    if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X1963||lcddev.id==0x7789)LCD_WR_REG(0X29);    //开启显示
    else if(lcddev.id==0X5510)LCD_WR_REG(0X2900);    //开启显示
}     
//LCD关闭显示
void LCD_DisplayOff(void)
{       
  if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X1963||lcddev.id==0x7789)LCD_WR_REG(0X28);    //关闭显示
    else if(lcddev.id==0X5510)LCD_WR_REG(0X2800);    //关闭显示
}   
//设置光标位置(对RGB屏无效)
//Xpos:横坐标
//Ypos:纵坐标
void LCD_SetCursor(u16 Xpos, u16 Ypos)
{     
     if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0x7789)
    {            
        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);            
    } 
}          
//设置LCD的自动扫描方向(对RGB屏无效)
//注意:其他函数可能会受到此函数设置的影响(尤其是9341),
//所以,一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
//dir:0~7,代表8个方向(具体定义见lcd.h)
//9341/5310/5510/1963等IC已经实际测试              
void LCD_Scan_Dir(u8 dir)
{
    u16 regval=0;
    u16 dirreg=0;
    u16 temp;  
    if((lcddev.dir==1&&lcddev.id!=0X1963)||(lcddev.dir==0&&lcddev.id==0X1963))//横屏时,对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==0X5310||lcddev.id==0X5510||lcddev.id==0X1963||lcddev.id==0x7789)//9341/5310/5510/1963/7789,特殊处理
    {
        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   
         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);  
        }
      } 
}     
//画点
//x,y:坐标
//POINT_COLOR:此点的颜色
void LCD_DrawPoint(u16 x,u16 y)
{
        LCD_SetCursor(x,y);        //设置光标位置 
        LCD_WriteRAM_Prepare();    //开始写入GRAM
        LCD->LCD_RAM=POINT_COLOR; 
}
//快速画点
//x,y:坐标
//color:颜色
void LCD_Fast_DrawPoint(u16 x,u16 y,u32 color)
{       
 if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0x7789)
    {
        LCD_WR_REG(lcddev.setxcmd); 
        LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);               
        LCD_WR_REG(lcddev.setycmd); 
        LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);               
    }else if(lcddev.id==0X5510)
    {
        LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(x>>8);  
        LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(x&0XFF);      
        LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(y>>8);  
        LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(y&0XFF); 
    }else if(lcddev.id==0X1963)
    {
        if(lcddev.dir==0)x=lcddev.width-1-x;
        LCD_WR_REG(lcddev.setxcmd); 
        LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);         
        LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);         
        LCD_WR_REG(lcddev.setycmd); 
        LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);         
        LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);         
    }         
    LCD->LCD_REG=lcddev.wramcmd; 
    LCD->LCD_RAM=color; 
}     
//SSD1963 背光设置
//pwm:背光等级,0~100.越大越亮.
void LCD_SSD_BackLightSet(u8 pwm)
{    
    LCD_WR_REG(0xBE);    //配置PWM输出
    LCD_WR_DATA(0x05);    //1设置PWM频率
    LCD_WR_DATA(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(u8 dir)
{
    lcddev.dir=dir;         //横屏/竖屏
    if(dir==0)            //竖屏
    {
        lcddev.width=240;
        lcddev.height=320;
        if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0x7789)
        {
            lcddev.wramcmd=0X2C;
             lcddev.setxcmd=0X2A;
            lcddev.setycmd=0X2B;       
            if(lcddev.id==0X5310)
            {
                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.width=320;
        lcddev.height=240;
        if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0x7789)
        {
            lcddev.wramcmd=0X2C;
             lcddev.setxcmd=0X2A;
            lcddev.setycmd=0X2B;       
        }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  
        }
        if(lcddev.id==0X5310)
        {      
            lcddev.width=480;
            lcddev.height=320;             
        }
    } 
    LCD_Scan_Dir(DFT_SCAN_DIR);    //默认扫描方向
}     
//设置窗口(对RGB屏无效),并自动设置画点坐标到窗口左上角(sx,sy).
//sx,sy:窗口起始坐标(左上角)
//width,height:窗口宽度和高度,必须大于0!!
//窗体大小:width*height. 
void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height)
{     
    u16 twidth,theight;
    twidth=sx+width-1;
    theight=sy+height-1;
    if(lcddev.id==0X9341||lcddev.id==0X5310||(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);  
    } 
}

//配置MPU的region,外部SRAM区配置为透写模式
void LCD_MPU_Config(void)
{    
    MPU_Region_InitTypeDef MPU_Initure;

    HAL_MPU_Disable();                            //配置MPU之前先关闭MPU,配置完成以后在使能MPU    
    //外部SRAM为region0,大小为2MB,此区域可读写
    MPU_Initure.Enable=MPU_REGION_ENABLE;        //使能region
    MPU_Initure.Number=LCD_REGION_NUMBER;        //设置region,外部SRAM使用的region0
    MPU_Initure.BaseAddress=LCD_ADDRESS_START;    //region基地址
    MPU_Initure.Size=LCD_REGION_SIZE;            //region大小
    MPU_Initure.SubRegionDisable=0X00;
    MPU_Initure.TypeExtField=MPU_TEX_LEVEL0;
    MPU_Initure.AccessPermission=MPU_REGION_FULL_ACCESS;    //此region可读写
    MPU_Initure.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE;    //允许读取此区域中的指令
    MPU_Initure.IsShareable=MPU_ACCESS_NOT_SHAREABLE;
    MPU_Initure.IsCacheable=MPU_ACCESS_NOT_CACHEABLE;
    MPU_Initure.IsBufferable=MPU_ACCESS_BUFFERABLE;
    HAL_MPU_ConfigRegion(&MPU_Initure);
    HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);     //开启MPU
}
//SRAM底层驱动,时钟使能,引脚分配
//此函数会被HAL_SRAM_Init()调用
//hsram:SRAM句柄
void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
{
    GPIO_InitTypeDef GPIO_Initure;
    
    __HAL_RCC_FMC_CLK_ENABLE();                //使能FMC时钟
    __HAL_RCC_GPIOD_CLK_ENABLE();            //使能GPIOD时钟
    __HAL_RCC_GPIOE_CLK_ENABLE();            //使能GPIOE时钟
    
    //初始化PD0,1,4,5,7,8,9,10,13,14,15
    GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_8|\
                     GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;         //复用
    GPIO_Initure.Pull=GPIO_PULLUP;            //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;        //高速
    GPIO_Initure.Alternate=GPIO_AF12_FMC;    //复用为FMC
    HAL_GPIO_Init(GPIOD,&GPIO_Initure);
    
    //初始化PE7,8,9,10,11,12,13,14,15
    GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|\
                     GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
    HAL_GPIO_Init(GPIOE,&GPIO_Initure);
}
        
//初始化lcd
//该初始化函数可以初始化各种型号的LCD(详见本.c文件最前面的描述)
void LCD_Init(void)
{       
    GPIO_InitTypeDef GPIO_Initure;
    FMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
    FMC_NORSRAM_TimingTypeDef FSMC_WriteTim;
     
        __HAL_RCC_GPIOB_CLK_ENABLE();            //开启GPIOB时钟
        GPIO_Initure.Pin=GPIO_PIN_5;            //PB5,背光控制
        GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
        GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
        GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
        HAL_GPIO_Init(GPIOB,&GPIO_Initure); 
        
        LCD_MPU_Config();                                               //使能MPU保护LCD区域
        SRAM_Handler.Instance=FMC_NORSRAM_DEVICE;       
        SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE;       
        
        SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK1;                     //使用NE1
        SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE;     //不复用数据线
        SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM;               //SRAM
        SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_16; //16位数据宽度
        SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE;    //存储器写使能
        SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE;        //读写使用不同的时序
        
        //FSMC读时序控制寄存器
        FSMC_ReadWriteTim.AddressSetupTime=15;        //地址建立时间(ADDSET)为15个HCLK 1/216M=4.6ns*15=69ns
        FSMC_ReadWriteTim.AddressHoldTime=0x00;
        FSMC_ReadWriteTim.DataSetupTime=80;           //数据保存时间(DATAST)为85个HCLK    =4.6*80=368ns
        FSMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A; //模式A
        //FSMC写时序控制寄存器
        FSMC_WriteTim.AddressSetupTime=15;            //地址建立时间(ADDSET)为15个HCLK=69ns
        FSMC_WriteTim.AddressHoldTime=0x00;
        FSMC_WriteTim.DataSetupTime=15;               //数据保存时间(DATAST)为4.6ns*15个HCLK=69ns
        FSMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;    //模式A
        HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);        
        delay_ms(50); // delay 50 ms 
            
        //尝试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)        //非9341,尝试看看是不是NT35310
        {
            LCD_WR_REG(0X04);
            lcddev.id = LCD_RD_DATA();      //dummy read
            lcddev.id = LCD_RD_DATA();      //读到0X85
            lcddev.id = LCD_RD_DATA();      //读取0X85
            lcddev.id <<= 8;
            lcddev.id |= LCD_RD_DATA();     //读取0X52

            if (lcddev.id == 0X8552)        //将8552的ID转换成7789
            {
                lcddev.id = 0x7789;
            }

            if (lcddev.id != 0x7789)        //也不是ST7789, 尝试是不是 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_WriteReg(0xF000, 0x0055);
                    LCD_WriteReg(0xF001, 0x00AA);
                    LCD_WriteReg(0xF002, 0x0052);
                    LCD_WriteReg(0xF003, 0x0008);
                    LCD_WriteReg(0xF004, 0x0001);

                    LCD_WR_REG(0xC500);             //读取ID高8位
                    lcddev.id = LCD_RD_DATA();      //读回0X55
                    lcddev.id <<= 8;

                    LCD_WR_REG(0xC501);             //读取ID低8位
                    lcddev.id |= LCD_RD_DATA();     //读回0X10
                    delay_ms(5);                    //兼容1963驱动

                    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
                    } 
                }
            }
        }  
        printf(" LCD 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==0x7789)      //7789初始化
        {
             LCD_WR_REG(0x11);

            delay_ms(120);

            LCD_WR_REG(0x36);
            LCD_WR_DATA(0x00);


            LCD_WR_REG(0x3A);
            LCD_WR_DATA(0X05);

            LCD_WR_REG(0xB2);
            LCD_WR_DATA(0x0C);
            LCD_WR_DATA(0x0C);
            LCD_WR_DATA(0x00);
            LCD_WR_DATA(0x33);
            LCD_WR_DATA(0x33);

            LCD_WR_REG(0xB7);
            LCD_WR_DATA(0x35);

            LCD_WR_REG(0xBB);       //vcom
            LCD_WR_DATA(0x32);      //30

            LCD_WR_REG(0xC0);
            LCD_WR_DATA(0x0C);

            LCD_WR_REG(0xC2);
            LCD_WR_DATA(0x01);

            LCD_WR_REG(0xC3);       //vrh
            LCD_WR_DATA(0x10);      //17 0D

            LCD_WR_REG(0xC4);       //vdv
            LCD_WR_DATA(0x20);      //20

            LCD_WR_REG(0xC6);
            LCD_WR_DATA(0x0f);

            LCD_WR_REG(0xD0);
            LCD_WR_DATA(0xA4);
            LCD_WR_DATA(0xA1);

            LCD_WR_REG(0xE0);       //Set Gamma
            LCD_WR_DATA(0xd0);
            LCD_WR_DATA(0x00);
            LCD_WR_DATA(0x02);
            LCD_WR_DATA(0x07);
            LCD_WR_DATA(0x0a);
            LCD_WR_DATA(0x28);
            LCD_WR_DATA(0x32);
            LCD_WR_DATA(0X44);
            LCD_WR_DATA(0x42);
            LCD_WR_DATA(0x06);
            LCD_WR_DATA(0x0e);
            LCD_WR_DATA(0x12);
            LCD_WR_DATA(0x14);
            LCD_WR_DATA(0x17);


            LCD_WR_REG(0XE1);       //Set Gamma
            LCD_WR_DATA(0xd0);
            LCD_WR_DATA(0x00);
            LCD_WR_DATA(0x02);
            LCD_WR_DATA(0x07);
            LCD_WR_DATA(0x0a);
            LCD_WR_DATA(0x28);
            LCD_WR_DATA(0x31);
            LCD_WR_DATA(0x54);
            LCD_WR_DATA(0x47);
            LCD_WR_DATA(0x0e);
            LCD_WR_DATA(0x1c);
            LCD_WR_DATA(0x17);
            LCD_WR_DATA(0x1b);
            LCD_WR_DATA(0x1e);

            LCD_WR_REG(0x2A);
            LCD_WR_DATA(0x00);
            LCD_WR_DATA(0x00);
            LCD_WR_DATA(0x00);
            LCD_WR_DATA(0xef);

            LCD_WR_REG(0x2B);
            LCD_WR_DATA(0x00);
            LCD_WR_DATA(0x00);
            LCD_WR_DATA(0x01);
            LCD_WR_DATA(0x3f);

            LCD_WR_REG(0x29);       //display on
        }
        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==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);//背光设置为最亮
        }        
    //初始化完成以后,提速
    if(lcddev.id==0X9341||lcddev.id==0X7789||lcddev.id==0X5310||lcddev.id==0X5510||lcddev.id==0X1963||lcddev.id==0X7789)//如果是这几个IC,则设置WR时序为最快
    {
        //重新配置写时序控制寄存器的时序                                        
        FMC_Bank1E->BWTR[0]&=~(0XF<<0);    //地址建立时间(ADDSET)清零      
        FMC_Bank1E->BWTR[0]&=~(0XF<<8);    //数据保存时间清零
        FMC_Bank1E->BWTR[0]|=5<<0;         //地址建立时间(ADDSET)为5个HCLK =21ns       
        FMC_Bank1E->BWTR[0]|=5<<8;         //数据保存时间(DATAST)为4.6ns*4个HCLK=21ns
    }     
    LCD_Display_Dir(0);        //默认为竖屏
    LCD_LED(1);                //点亮背光
    LCD_Clear(WHITE);
}  
//清屏函数
//color:要清屏的填充色
void LCD_Clear(u32 color)
{
    u32 index=0;      
    u32 totalpoint=lcddev.width;
        totalpoint*=lcddev.height;             //得到总点数
        LCD_SetCursor(0x00,0x0000);            //设置光标位置 
        LCD_WriteRAM_Prepare();             //开始写入GRAM           
        for(index=0;index<totalpoint;index++)
        {
            LCD->LCD_RAM=color;    
        }
}  
//在指定区域内填充单个颜色
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)   
//color:要填充的颜色
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u32 color)
{          
    u16 i,j;
    u16 xlen=0;    
        xlen=ex-sx+1;     
        for(i=sy;i<=ey;i++)
        {
            LCD_SetCursor(sx,i);                      //设置光标位置 
            LCD_WriteRAM_Prepare();                 //开始写入GRAM      
            for(j=0;j<xlen;j++)LCD->LCD_RAM=color;    //显示颜色         
        } 
}  
//在指定区域内填充指定颜色块             
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)   
//color:要填充的颜色
void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color)
{  
    u16 height,width;
    u16 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++)LCD->LCD_RAM=color[i*width+j];//写入数据 
        }
}  
//画线
//x1,y1:起点坐标
//x2,y2:终点坐标  
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
    u16 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(u16 x1, u16 y1, u16 x2, u16 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(u16 x0,u16 y0,u8 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/32
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{                                
    u8 temp,t1,t;
    u16 y0=y;
    u8 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 if(size==32)temp=asc2_3216[num][t];    //调用3216字体
        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次方.
u32 LCD_Pow(u8 m,u8 n)
{
    u32 result=1;     
    while(n--)result*=m;    
    return result;
}             
//显示数字,高位为0,则不显示
//x,y :起点坐标     
//len :数字的位数
//size:字体大小
//color:颜色 
//num:数值(0~4294967295);     
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
{             
    u8 t,temp;
    u8 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(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)
{  
    u8 t,temp;
    u8 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(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)
{         
    u8 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++;
    }  
}































(42条消息) STM32CubeIDE TFT-LCD显示_stm32cubeide配置5510 tftlcd_sudaroot的博客-CSDN博客

(42条消息) STM32CubeIDE SRAM_sudaroot的博客-CSDN博客

(42条消息) STM32CubeMX之FMC驱动TFT-LCD屏_stm32 cudemx lcd_岳振威的博客-CSDN博客

(42条消息) STM32CubeMX学习笔记(38)——FSMC接口使用(TFT-LCD屏显示)_stm32cubemx开发ili9341_Leung_ManWah的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【halcon】模板匹配参数之金字塔级数

背景 今天&#xff0c;在使用模板匹配的时候&#xff0c;突然程序卡死&#xff0c;CPU直接飙到100%。最后排查发现是模板匹配其中一个参数 NumLevels 导致的&#xff1a; NumLevels: The number of pyramid levels used during the search is determined with numLevels. If n…

java25种设计模式抽象工厂模式

Java设计模式 - 抽象工厂模式 抽象工厂模式是另一个创建模式。 抽象工厂模式&#xff0c;也称为工厂的工厂&#xff0c;有一个工厂创建其他工厂。 当使用抽象工厂模式时&#xff0c;我们首先使用超级工厂创建工厂&#xff0c;然后使用创建的工厂创建对象。 简单来说&#xff0…

事件循环机制(Event Loop)和宏任务(macro-tast)微任务(micro-tast),详细讲解!!!

“事件循环机制” 和 “宏任务微任务” 也是前端面试中常考的面试题了。首先&#xff0c;要深刻理解这些概念的话&#xff0c;需要回顾一些知识点。知识点回顾1、进程与线程进程。 程序运行需要有它自己的专属内存空间&#xff0c;可以把这块内存空间简单的理解为进程每个应用至…

计算机求解满足三角形各边数字之和相等的数字填充

圆圈处不重复的填入1至9&#xff0c;使得每条边的四个数字相加的总和相等。 求解思路&#xff1a; 数组中存放1到9的数字&#xff0c;每次随机交换两个数字&#xff0c;构建出新的数字组合&#xff0c;计算这个数字组合是否符合要求。 #include <stdio.h> #include <…

SpringBoot实现Excel导入导出,简单好用

EasyPoi简介 POI是Java操作MicroOffice&#xff08;如对Excel的导入导出&#xff09;的一个插件。POI的全称是&#xff08;Poor Obfuscation Implementation&#xff09;&#xff0c;POI官网地址是 http://poi.achache.org/index.html 。 EasyPoi对POI进行了优化&#xff0c;…

SVN vs Git 不是技术之争,而是生态之争

师父&#xff08;80 后老员工&#xff09;&#xff1a;小吉啊&#xff0c;我看我们文档越来越多了&#xff0c;手动管理起来很费劲。你去搞一个 SVN 来用一哈&#xff0c;做个版本控制&#xff0c;这样大家都方便。 徒弟&#xff08;95 后新力量&#xff09;&#xff1a;师父啊…

电脑快捷方式删除文件后四种找回方法

快捷指令是一种用作替代快捷键操作的技术。也可以称为“快捷键”&#xff0c;“快捷方式”或“快捷键序列”&#xff0c;它们允许用户在非常快速和方便的方式建立特定操作序列&#xff0c;这对于执行重复性或提高效率非常有用。通过使用快捷指令&#xff0c;您可以执行快速复制…

pod进阶

一.资源限制当定义 Pod时可以选择性地为每个容器设定所需要的资源数量。最常见的可设定资源是CPU和内存大小&#xff0c;以及其他类型的资源。当为 pod 中的容器指定了request资源时&#xff0c;调度器就使用该信息来决定将Pod 调度到哪个节点上。当还为容器指定了limit资源时&…

C++Primer16.1.6节练习

练习16.28&#xff1a; 简易的shared_ptr代码如下 #include <iostream> #include <vector> #include <list> using namespace std;//shared_ptr模板 template<typename T>class SharedPtr {friend SharedPtr<T>& MakeShared(T* t); public…

docker部署MySQL主从服务

一.主从同步流程关于MySQL主从复制主要同步的是binlog日志&#xff0c;涉及到三个线程&#xff0c;一个运行在主节点&#xff08;log dump thread&#xff09;&#xff0c;其余两个(I/O thread, SQL thread)运行在从节点&#xff0c;如下图所示:当主库数据发生变更时&#xff0…

【JavaWeb】EL表达式(191-202)

191.EL表达式-什么是EL表达式&#xff0c;以及它的作用 什么是 EL 表达式&#xff0c;EL 表达式的作用? EL 表达式的全称是&#xff1a;Expression Language。是表达式语言。 EL 表达式的什么作用&#xff1a;输出&#xff0c;EL 表达式主要是代替 jsp 页面中的表达式脚本在…

第三章 opengl之纹理

OpenGL纹理纹理环绕方式纹理过滤多级渐远纹理加载和创建纹理stb_image.h生成纹理纹理的应用纹理单元纹理 用stb_image.h库&#xff0c;原先用SOIL库也可以实现。 可以为每个顶点添加颜色来增加图形的细节。但是想得到一个真实的图形&#xff0c;需要足够多的顶点&#xff0c;…

定时任务调度方案——Xxl-Job

定时任务调度方案 随着系统规模的发展&#xff0c;项目的组织结构以及架构越来越复杂&#xff0c;业务覆盖的范围越来越广&#xff0c;定时任务数量日益增多&#xff0c;任务也变得越来越复杂&#xff0c;尤其是为了满足在用户体量日历增大时&#xff0c;系统能够稳定运行&…

汽车改色避坑指南

关于汽车改色&#xff0c;真的不是只看颜色看价格那么简单。 如何选择一家靠谱的改色店&#xff1f;要看这家店是否正规&#xff0c;是否有完备的售后和质保流程&#xff0c;后续剐蹭、磕碰、划痕是否可以修复&#xff1f;是否提前告知注意事项&#xff0c;以及改色后备案流程&…

浅谈车载测试之智能座舱人机交互

1、引言 目前&#xff0c;汽车不仅在动力源、驱动方式和驾驶体验上发生了变化&#xff0c;驾驶舱也告别了传统的枯燥机械和电子空间&#xff0c;智能化水平飙升&#xff0c;成为继家庭和办公室以外人们生活之后的“第三空间”。通过人脸&#xff1b;指纹识别、语音 / 手势交互…

【线程-J.U.C】

Lock J.U.C最核心组件&#xff0c;Lock接口出现之前&#xff0c;多线程的并发安全只能由synchronized处理&#xff0c;但java5之后&#xff0c;Lock的出现可以解决synchronized的短板&#xff0c;更加灵活。 Lock本质上是一个接口&#xff0c;定义了释放锁&#xff08;unlock&…

解决:centos7如何解决网络不可达和wget: 无法解析主机地址 “downloads.mysql.com”

遇到此类问题可能会有多重解决方法&#xff0c;需要一个一个的去排除。 1、查看自己的网络设置是不是设置的NAT模式&#xff0c;设置完成后再去ping一下网络地址。 2、ping一下百度看能不能拼成功&#xff0c;下图是ping成功的样式。&#xff08;如果不行继续往下走&#xff0…

牛客sql题目练习

Sql3描述 题目&#xff1a;现在运营需要查看用户来自于哪些学校&#xff0c;请从用户信息表中取出学校的去重数据。 示例:user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijing42315femal…

PowerShell攻击指南

文章目录一&#xff1a;PowerShell简介1.1&#xff1a;基本概念1.2&#xff1a;执行策略与绕过1.3&#xff1a;常用命令二&#xff1a;PowerSploit2.1&#xff1a;PowerSploit安装2.2&#xff1a;PowerSploit攻击实战2.2.1&#xff1a;直接shellcode反弹meterpreter shell2.2.2…

【C/C++每日一练】总目录(不断更新中...)

C/C 2023.03 20230303 1. 字符串相乘 ★★ 2. 单词拆分 II ★★★ 3. 串联所有单词的子串 ★★★ 20230302 1. 个位数是6&#xff0c;且能被3整除的五位数共有多少个&#xff1f; ☆ 2. 不同方式求n的阶乘 ★ 3. 报数游戏 ★☆ 20230301 1. 冒泡排序法排序 ★ …