stm32CubeIDE FMC 驱动LCD(8080)
一,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.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(); //开始写入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;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(); //开始写入GRAMfor(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); //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<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博客
相关文章:
stm32CubeIDE FMC 驱动LCD(8080)
一,TFT屏硬件接口16位,80并口。二,FMC介绍。FSMC(Flexible Static Memory Controller),译为灵活的静态存储控制器。STM32F1 系列芯片使用 FSMC 外设来管理扩展的存储器,它可以用于驱动包括 SRAM…...
Java 数据类型
数据类型用于对数据归类,以便开发者理解和操作。 基本数据类型 Java 确定了每种基本数据类型所占存储空间的大小,不会像其它语言那样随机器硬件架构的变化而变化,这使 Java 程序更具可移植性。 Java 中定义了如下的基本数据类型。 byte …...
Prometheus 监控云Mysql和自建Mysql(多实例)
本文您将了解到 Prometheus如何配置才能监控云Mysql(包括阿里云、腾讯云、华为云)和自建Mysql。 Prometheus 提供了很多种Exporter,用于监控第三方系统指标,如果没有提供也可以根据Exporter规范自定义Exporter。 本文将通过MySQL server exporter 来监控…...
Vue3中的h函数
文章目录简介简单使用参数使用计数器进阶使用函数组件插槽专栏目录请点击 简介 众所周知,vue内部构建的其实是虚拟DOM,而虚拟DOM是由虚拟节点生成的,实质上虚拟节点也就是一个js对象事实上,我们在vue中写的template,最终也是经过…...
阿尔法开发板 IMX6ULL 说明
一. IMX6ULL开发板 IMX6ULL开发板即正点原子的阿尔法(ALPHA)开发板,采用恩智浦芯片,cortex-A7架构的。 二. IM6ULL开发板说明 1. IO说明 对于IMX6ULL芯片,一个IO对应两个寄存器,第一个寄存器负责配置其复用功能,…...
Altium Designer19 #学习笔记# | 基础应用技巧汇总
全文目录一.元件符号库二.元件封装库1.AD09 集成元件库/封装库三.电路原理图1. 巧用查找"相似对象功能"1.1 查找相同元件1.2. 查找相同文本1.3. 查找相同网络 :E - S - C四.PCB原理图【AD PCB模式下的常用快捷键】PCB视图放大/缩小PCB视图左/右移动PCB切换…...
Python 元类编程实现一个简单的 ORM
概述 什么是ORM? ORM全称“Object Relational Mapping”,即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句。 现在我们就要实…...
《C++ Primer Plus》第18章:探讨 C++ 新标准(7)
C11 新增的其他功能 C11 增加了很多功能,本书无法全面介绍;另外,本书编写期间,其中很多功能还未得到广泛实现。然而,有些功能有必要简要地介绍一下。 并行编程 当前,为提高计算机性能,增加处…...
Redis学习(二):Redis安装测试
概述 Redis是什么 Redis, Remote Dictionary Server, 即远程字典服务。免费开源的数据库。 由C语言编写,支持网络,可基于内存亦可持久化的日志型、KV数据库,并提供所种语言的API。 Redis能干嘛 用于内存存储,持久化。rdb、ao…...
Vector - CAPL - 简介及数据结构
对于想进入车载行业或者已经在车载行业工作的朋友对于CAPL这个词都会相当的熟悉,都知道他是做车载网络测试脚本的语言,并且跟C有点类似,但是它到底是什么呢?CAPL全称(Communication Access Programming Language&#…...
20230304英语学习
What Would Happen if the Moon Disappeared Tomorrow? 如果明天月球消失了会怎样? The closest object to our planet, the Moon, may seem like Earth’s little sibling.Since its birth, the satellite has mostly just hung around, playing gravitational t…...
【基础算法】单链表的OJ练习(3) # 移除链表元素 # 相交链表 #
文章目录前言移除链表元素相交链表写在最后前言 本章的OJ练习也是相对简单的,只要能够理解解题的思路,并且依照这个思路能够快速的写出代码,我相信,你的链表水平已经足够了。 对于OJ练习(2) : ->传送门…...
【自用】SpringBoot项目通用类整理
文章目录全局Json序列化Controller日志切面全局异常拦截GlobalExceptionHandlerApiResultBusinessExceptionResponseEntityUtil全局返回体包装MP自动填充接口文档配置类自定义Async异步线程池本文主要整理各类项目中通用的配置类、工具类,便于复查自用。 全局Json序…...
动态规划法(总述)多阶段决策最优化问题
动态规划: 研究最优控制问题提出的 该问题有n个输入,问题的解由这n个输入组成,这个子集必须满足事先给定的条件,这些条件称为约束条件,满足约束条件的可行解可能不只有一个为了衡量可行解的优劣,通常以一些函数的形式&…...
MySQL跨服务器数据映射
MySQL跨服务器数据映射环境准备1. 首先是要查看数据库的federated引擎 开启/关闭 状态2. 打开任务管理器,并重启mysql服务3. 再次查看FEDERATED引擎状态,引擎已启动映射实现问题总结在日常的开发中经常进行跨数据库进行查询数据。 同服务器下跨数据库进…...
利用反射实现通过读取配置文件对类进行实例化-课后程序(JAVA基础案例教程-黑马程序员编著-第十二章-课后作业)
【案例12-3】:利用反射实现通过读取配置文件对类进行实例化 【案例介绍】 1.案例描述 现在有一个项目,项目中创建了一个Person类,在Person类中定义了一个sleep()方法。在工程中还定义了一个Student类继承Person类,在Student类中…...
1.2 CSS文本属性
CSS Text(文本)属性: 定义文本外观,颜色,装饰,缩进,行间距来修饰文本 文本样式 文本缩进 text-indent文本水平对齐方式:text-align文本修饰:text-decoration行高 line-height CSS文本颜色属性…...
SpringCloud之认识微服务
文章目录一、传统项目转型二、走进 SpringCloud三、微服务项目搭建3.1 创建一个 SpringBoot 项目3.2 创建三个 Maven 子工程3.3 为子工程创建 application.yml3.4 引入依赖3.5 数据库 建库建表3.6 编写业务提示:以下是本篇文章正文内容,SpringCloud系列学…...
【go语言之thrift协议二之server端分析】
go语言之thrift协议二serverthrift.TProtocolFactoryTTransportReadWriteCloserContextFlusherReadSizeProviderTProtocolrunServerNewTServerSocketNewCalculatorHandlerNewCalculatorProcessorNewTSimpleServer4server.ServeListenAcceptLoopprocessRequests在上一篇文章分析…...
【办公类05-03】Python批量修改文件名前面的序号(已有的序号错了,需要改成正确的号码)
背景需求下载教程,手动输入编号,有一个编号错误,导致后面所有编号都错了。30实际是29,以此类推怎样才能快速修改编号数字?前期考虑到可能要改编号,所以在每个编号后面加“ ”(空格)&…...
定向模糊测试工具Beacon基本用法
Beacon是一个定向模糊测试工具,给定行号,能够定向探索行号附近的代码区域。主要思想是采用静态分析的方法获取到与目标有关的变量的最弱前置条件(weakest precondition)的信息,并在相关位置插入断言,来提前…...
《程序员面试金典(第6版)》面试题 02.01. 移除重复节点
题目描述 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。 示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3] -示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, 2] 提示: 链表长度在[0, 20000]范…...
如何对web系统开展无障碍测试
Accessibility test(无障碍测试)是一种测试方法,旨在评估软件、网站或其他数字产品的可访问性,以确保它们能够被身体残障或其他特殊需求的用户使用。这些测试通常包括使用辅助技术,如屏幕阅读器和放大器,以…...
使用vite+vue3.0 创建一个cesium基础应用 ----01 项目搭建
使用vitevue3.0 创建一个cesium基础应用 ----01 项目搭建 1.使用yarn创建一个vite项目 我们可以在vite官网找到vite创建项目的命令 https://cn.vitejs.dev/ 可以使用yarn创建项目选择使用vue3.0框架,语言使用js 创建完成后结构如下: 2.找到vite社区中的…...
【Python学习笔记】第二十七节 Python 多线程
一、进程和线程进程:是程序的一次执行,每个进程都有自己的地址空间、内存、数据栈及其他记录运行轨迹的辅助数据。线程:所有的线程都运行在同一个进程当中,共享相同的运行环境。线程有开始、顺序执行和结束三个部分, …...
【id:18】【20分】B. DS顺序表--连续操作
题目描述建立顺序表的类,属性包括:数组、实际长度、最大长度(设定为1000)该类具有以下成员函数:构造函数:实现顺序表的初始化。插入多个数据的multiinsert(int i, int n, int item[])函数,实现在…...
vi编辑器操作指令分享
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方…...
OSPF与BFD联动配置
13.1.1BFD概念 BFD提供了一个通用的、标准化的、介质无关的、协议无关的快速故障检测机制,有以下两大优点: 对相邻转发引擎之间的通道提供轻负荷、快速故障检测。 用单一的机制对任何介质、任何协议层进行实时检测。 BFD是一个简单的“Hello”协议。两个系统之间建立BFD会…...
jQuery基础
> 🥲 🥸 🤌 🫀 🫁 🥷 🐻❄️🦤 🪶 🦭 🪲 🪳 🪰 🪱 🪴 🫐 🫒 …...
day39|139.单词拆分 背包问题ending
139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: s "leetcode",…...
中央建设举报网站/小说网站排名
问题 : 线程池中的 coreSize 和 maxSize 的作用分别是什么?未执行的线程池存在在哪种数据类型,为什么使用这种类型的数据结构ThreadPoolExecutor概述 ThreadPoolExecutor 下文简称 TPE ,我们使用它都是从Executror 这个类中的方法 ࿱…...
容桂最新消息/吉林网络seo
1082. Read Number in Chinese (25) 时间限制400 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueGiven an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output "Fu" first if it is ne…...
佛山网站建设专家/seo代码优化工具
答案:请安装以下步骤在Windws XP进行释放并重新获得一个ID地址的操作:1。点击“开始”按钮,然后点击“附件”选项再点击“命令提示符”。2。在DOS命令行模式输入以下命令“ipconfig /release”然后按回车键,使用此命令可以释放IP地…...
企业网站制作机构排名/百度网络营销中心官网
2020年3月9日,明道云私有部署版通过了腾讯云的审核,正式上架腾讯云应用镜像市场。安装和介绍页面:https://market.cloud.tencent.com/products/19148这意味着,如果您想要使用明道云私有部署版,只需要一个腾讯云账号&am…...
网站 备案号查询/北京出大大事了
tar常用选项-c(create) 表示创建用来生成文件包-x:表示提取,从文件包中提取文件-t可以查看压缩的文件。-z使用gzip方式进行处理,它与”c“结合就表示压缩,与”x“结合就表示解压缩。-j使用bzip2方式进行处理,它与”c“…...
请专业做网站的老师/最新最好的磁力搜索
HBase版本:0.94.15-cdh4.7.0 在 HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入、删除、查询数据都需要先找到相应的 RegionServer。什么叫相应的RegionServer?就是管理你要操作的那个Region的RegionServer。Cli…...