stm32CubeIDE FMC 驱动LCD(8080)
创始人
2024-05-28 14:28:35
0

一,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 IDu8  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.widthlcddev.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();    //开始写入GRAMLCD->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设置CLCD_WR_DATA(0xFF);    //4设置DLCD_WR_DATA(0x00);    //5设置ELCD_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;        //设置宽度480lcddev.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;        //设置宽度800lcddev.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;        //使能regionMPU_Initure.Number=LCD_REGION_NUMBER;        //设置region,外部SRAM使用的region0MPU_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,15GPIO_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;    //复用为FMCHAL_GPIO_Init(GPIOD,&GPIO_Initure);//初始化PE7,8,9,10,11,12,13,14,15GPIO_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;                     //使用NE1SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE;     //不复用数据线SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM;               //SRAMSRAM_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=69nsFSMC_ReadWriteTim.AddressHoldTime=0x00;FSMC_ReadWriteTim.DataSetupTime=80;           //数据保存时间(DATAST)为85个HCLK    =4.6*80=368nsFSMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A; //模式A//FSMC写时序控制寄存器FSMC_WriteTim.AddressSetupTime=15;            //地址建立时间(ADDSET)为15个HCLK=69nsFSMC_WriteTim.AddressHoldTime=0x00;FSMC_WriteTim.DataSetupTime=15;               //数据保存时间(DATAST)为4.6ns*15个HCLK=69nsFSMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;    //模式AHAL_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();    //读到0X00lcddev.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 readlcddev.id = LCD_RD_DATA();      //读到0X85lcddev.id = LCD_RD_DATA();      //读取0X85lcddev.id <<= 8;lcddev.id |= LCD_RD_DATA();     //读取0X52if (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();      //读回0X55lcddev.id <<= 8;LCD_WR_REG(0xC501);             //读取ID低8位lcddev.id |= LCD_RD_DATA();     //读回0X10delay_ms(5);                    //兼容1963驱动if(lcddev.id==0x8000)lcddev.id=0x5510;//NT35510读回的ID是8000H,为方便区分,我们强制设置为5510if(lcddev.id!=0X5510)            //也不是NT5510,尝试看看是不是SSD1963{LCD_WR_REG(0XA1);lcddev.id=LCD_RD_DATA();lcddev.id=LCD_RD_DATA();    //读回0X57lcddev.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);      //3FLCD_WR_DATA(0x30);      //3CLCD_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 Sleepdelay_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);       //vcomLCD_WR_DATA(0x32);      //30LCD_WR_REG(0xC0);LCD_WR_DATA(0x0C);LCD_WR_REG(0xC2);LCD_WR_DATA(0x01);LCD_WR_REG(0xC3);       //vrhLCD_WR_DATA(0x10);      //17 0DLCD_WR_REG(0xC4);       //vdvLCD_WR_DATA(0x20);      //20LCD_WR_REG(0xC6);LCD_WR_DATA(0x0f);LCD_WR_REG(0xD0);LCD_WR_DATA(0xA4);LCD_WR_DATA(0xA1);LCD_WR_REG(0xE0);       //Set GammaLCD_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 GammaLCD_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);      //5fLCD_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);    //66LCD_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.2VLCD_WriteReg(0xB000,0x0D);LCD_WriteReg(0xB001,0x0D);LCD_WriteReg(0xB002,0x0D);//AVDD ratioLCD_WriteReg(0xB600,0x34);LCD_WriteReg(0xB601,0x34);LCD_WriteReg(0xB602,0x34);//AVEE -5.2VLCD_WriteReg(0xB100,0x0D);LCD_WriteReg(0xB101,0x0D);LCD_WriteReg(0xB102,0x0D);//AVEE ratioLCD_WriteReg(0xB700,0x34);LCD_WriteReg(0xB701,0x34);LCD_WriteReg(0xB702,0x34);//VCL -2.5VLCD_WriteReg(0xB200,0x00);LCD_WriteReg(0xB201,0x00);LCD_WriteReg(0xB202,0x00);//VCL ratioLCD_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 ratioLCD_WriteReg(0xB900,0x34);LCD_WriteReg(0xB901,0x34);LCD_WriteReg(0xB902,0x34);//VGL_REG -10VLCD_WriteReg(0xB500,0x08);LCD_WriteReg(0xB501,0x08);LCD_WriteReg(0xB502,0x08);LCD_WriteReg(0xC200,0x03);//VGLX ratioLCD_WriteReg(0xBA00,0x24);LCD_WriteReg(0xBA01,0x24);LCD_WriteReg(0xBA02,0x24);//VGMP/VGSP 4.5V/0VLCD_WriteReg(0xBC00,0x00);LCD_WriteReg(0xBC01,0x78);LCD_WriteReg(0xBC02,0x00);//VGMN/VGSN -4.5V/0VLCD_WriteReg(0xBD00,0x00);LCD_WriteReg(0xBD01,0x78);LCD_WriteReg(0xBD02,0x00);//VCOMLCD_WriteReg(0xBE00,0x00);LCD_WriteReg(0xBE01,0x64);//Gamma SettingLCD_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 enableLCD_WriteReg(0xF000,0x55);LCD_WriteReg(0xF001,0xAA);LCD_WriteReg(0xF002,0x52);LCD_WriteReg(0xF003,0x08);LCD_WriteReg(0xF004,0x00);//Display controlLCD_WriteReg(0xB100, 0xCC);LCD_WriteReg(0xB101, 0x00);//Source hold timeLCD_WriteReg(0xB600,0x05);//Gate EQ controlLCD_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-delayLCD_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/pixelLCD_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 = 300MHzLCD_WR_DATA(0x1D);        //参数1 LCD_WR_DATA(0x02);        //参数2 Divider M = 2, PLL = 300/(M+1) = 100MHzLCD_WR_DATA(0x04);        //参数3 Validate M and N values   delay_us(100);LCD_WR_REG(0xE0);        // Start PLL commandLCD_WR_DATA(0x01);        // enable PLLdelay_ms(10);LCD_WR_REG(0xE0);        // Start PLL command againLCD_WR_DATA(0x03);        // now, use PLL output as system clock    delay_ms(12);  LCD_WR_REG(0x01);        //软复位delay_ms(10);LCD_WR_REG(0xE6);        //设置像素频率,33MhzLCD_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 periodLCD_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 periodLCD_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);    //设置自动白平衡DBCLCD_WR_DATA(0x00);    //disableLCD_WR_REG(0xBE);    //配置PWM输出LCD_WR_DATA(0x05);    //1设置PWM频率LCD_WR_DATA(0xFE);    //2设置PWM占空比LCD_WR_DATA(0x01);    //3设置CLCD_WR_DATA(0x00);    //4设置DLCD_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;indexLCD_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;jLCD_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;iLCD_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);             //5LCD_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=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=' '))//判断是不是非法字符!{       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博客

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...