择天记 小说 无弹窗:STM32液晶屏驱动程序

来源:百度文库 编辑:中财网 时间:2024/05/04 08:05:09

相应引脚宏定义:#define CS_TFT_H()   GPIO_SetBits(GPIOD, GPIO_Pin_0);
#define CS_TFT_L()   GPIO_ResetBits(GPIOD, GPIO_Pin_0);
#define RS_TFT_H()   GPIO_SetBits(GPIOD, GPIO_Pin_1);
#define RS_TFT_L()   GPIO_ResetBits(GPIOD, GPIO_Pin_1);
#define WR_TFT_H()   GPIO_SetBits(GPIOD, GPIO_Pin_2);
#define WR_TFT_L()   GPIO_ResetBits(GPIOD, GPIO_Pin_2);
#define RD_TFT_H()   GPIO_SetBits(GPIOD, GPIO_Pin_3);
#define RD_TFT_L()   GPIO_ResetBits(GPIOD, GPIO_Pin_3);
#define RST_TFT_H()  GPIO_SetBits(GPIOD,GPIO_Pin_4);
#define RST_TFT_L()  GPIO_ResetBits(GPIOD,GPIO_Pin_4);
#define DataToWrite(dat)  {GPIOE->ODR = dat;}
#define LCD_Light_ON()   GPIO_SetBits(GPIOD,GPIO_Pin_5);
#define LCD_Light_OFF()  GPIO_ResetBits(GPIOD,GPIO_Pin_5);
IO口初始化函数:
void gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启相应时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);
/*所有LCD引脚配置为推挽输出*/
/*16位数据低8位*//*16位数据高8位*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/*控制脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/*背光控制*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
关于TFT的一些函数:
void Delay_nms(int n)
{
u32 f = n, k;
for (; f != 0; f--)
{
for (k = 0xFFF; k != 0; k--)
;
}
}
void LCD_WR_CmdPar(u16 Index, u16 par)//向地址内些数据
{
CS_TFT_L();//片选(低有效)
RS_TFT_L();//数据or地址(低为地址,高为数据)
DataToWrite(Index);//写入地址
WR_TFT_L();//写时序(上升沿有效)
WR_TFT_H();
RS_TFT_H();//RS=1(接下来要写的为数据)
//----------------------
DataToWrite(par);
WR_TFT_L();//写时序(上升沿有效)
WR_TFT_H();
CS_TFT_H();//CS=0
}
void tft_init(void)//TFT初始化程序
{
gpio_init();
LCD_Light_ON();
DataToWrite(0xffff);//数据线全高
RST_TFT_H();
WR_TFT_H();
CS_TFT_H();
RS_TFT_H();
RD_TFT_H();
RST_TFT_H();
Delay_nms(1);
RST_TFT_L();
Delay_nms(1);
RST_TFT_H();
Delay_nms(1);
LCD_WR_CmdPar(0x0000, 0x0001);            //启动振荡
LCD_WR_CmdPar(0x0001, 0x0100);       //ss=1(输出方向为S720-S1,在屏上体现为从左到右)
LCD_WR_CmdPar(0x0002, 0x0700);            //power on sequence
LCD_WR_CmdPar(0x0003, (1 << 12) | (1 << 5) | (1 << 4));  //65K
LCD_WR_CmdPar(0x0004, 0x0000);            //调整显示图片比例
LCD_WR_CmdPar(0x0007, 0x0133);
LCD_WR_CmdPar(0x0008, 0x0207);            //页眉页脚
LCD_WR_CmdPar(0x0009, 0x0000);           //........
LCD_WR_CmdPar(0x000a, 0x0000);            //display setting
LCD_WR_CmdPar(0x000c, 0x0001);            //display setting
LCD_WR_CmdPar(0x000d, 0x0000);            //0f3c
LCD_WR_CmdPar(0x000f, 0x0000);
LCD_WR_CmdPar(0x0010, 0x0000);     /****************/
LCD_WR_CmdPar(0x0011, 0x0007);   /**功率控制部分**/
LCD_WR_CmdPar(0x0012, 0x0000);            /*****初始化*****/
LCD_WR_CmdPar(0x0013, 0x0000);            /****************/
Delay_nms(1);
LCD_WR_CmdPar(0x0010, 0x1590);
LCD_WR_CmdPar(0x0011, 0x0227);
Delay_nms(10);
LCD_WR_CmdPar(0x0012, 0x009c);
Delay_nms(1);
LCD_WR_CmdPar(0x0013, 0x1900);
LCD_WR_CmdPar(0x0029, 0x0023); //电力控制
LCD_WR_CmdPar(0x002b, 0x000e);
Delay_nms(10);
/****伽马控制****/
LCD_WR_CmdPar(0x0030, 0x0007);
LCD_WR_CmdPar(0x0031, 0x0707);
LCD_WR_CmdPar(0x0032, 0x0006);
LCD_WR_CmdPar(0x0035, 0x0704);
LCD_WR_CmdPar(0x0036, 0x1f04);
LCD_WR_CmdPar(0x0037, 0x0004);
LCD_WR_CmdPar(0x0038, 0x0000);
LCD_WR_CmdPar(0x0039, 0x0706);
LCD_WR_CmdPar(0x003c, 0x0701);
LCD_WR_CmdPar(0x003d, 0x000f);
Delay_nms(10);
/*****水平和垂直RAM地址*****/
LCD_WR_CmdPar(0x0050, 0x0000);
LCD_WR_CmdPar(0x0051, 0x00ef); //240
LCD_WR_CmdPar(0x0052, 0x0000);
LCD_WR_CmdPar(0x0053, 0x013f); //320
/****扫描控制****/
LCD_WR_CmdPar(0x0060, 0xa700); //扫描控制 G320-G1(垂直扫描方向)
LCD_WR_CmdPar(0x0061, 0x0001);
LCD_WR_CmdPar(0x006a, 0x0000);
LCD_WR_CmdPar(0x0080, 0x0000);
LCD_WR_CmdPar(0x0081, 0x0000);
LCD_WR_CmdPar(0x0082, 0x0000);
LCD_WR_CmdPar(0x0083, 0x0000);
LCD_WR_CmdPar(0x0084, 0x0000);
LCD_WR_CmdPar(0x0085, 0x0000);
LCD_WR_CmdPar(0x0090, 0x0010);
LCD_WR_CmdPar(0x0092, 0x0000);
LCD_WR_CmdPar(0x0093, 0x0003);
LCD_WR_CmdPar(0x0095, 0x0110);
LCD_WR_CmdPar(0x0097, 0x0000);
LCD_WR_CmdPar(0x0098, 0x0000);
}
void LCD_WR_Cmd(u16 cmd)//只写命令
{
CS_TFT_L();
RS_TFT_L();
DataToWrite(cmd);
WR_TFT_L();
WR_TFT_H();
RS_TFT_H();
CS_TFT_H();
}
void LCD_WR_DATA(u16 par)//只写数据
{
CS_TFT_L();
DataToWrite(par);
WR_TFT_L();
WR_TFT_H();
CS_TFT_H();
}
void FillSolidRect(u16 x, u16 y, u16 Width, u16 Height,  u16 Color) //背景函数
{
u32 i;
LCD_WR_CmdPar(0x20, x);//起始X坐标
LCD_WR_CmdPar(0x21, y);//起始Y坐标
LCD_WR_CmdPar(0x0050, x);//水平 GRAM起始位置
LCD_WR_CmdPar(0x0051, x+Width-1);//水平GRAM终止位置
LCD_WR_CmdPar(0x0052, y);//垂直GRAM起始位置
LCD_WR_CmdPar(0x0053, y+Height-1);//垂直GRAM终止位置
LCD_WR_Cmd(0x0022);//开始读/写
for(i=0; i<(u32)Width*Height; i++)
{
LCD_WR_DATA(Color);
}
}
void LCD_WriteBlock(u16 x, u16 y, u16 w, u16 h, u16 *pbuf)//画图函数
{
u32 i;
LCD_WR_CmdPar(0x20, x);//起始X坐标
LCD_WR_CmdPar(0x21, y);//起始Y坐标
LCD_WR_CmdPar(0x0050, x);//水平 GRAM起始位置
LCD_WR_CmdPar(0x0051, x+w-1);//水平GRAM终止位置
LCD_WR_CmdPar(0x0052, y);//垂直GRAM起始位置
LCD_WR_CmdPar(0x0053, y+h-1);//垂直GRAM终止位置
LCD_WR_Cmd(0x0022);//开始读/写
for(i=0; i<(u32)w*h; i++)
{
LCD_WR_DATA(*pbuf++);
}
}
void LCD_WriteMin(u16 x, u16 y,u16 w, u16 h, u16 *pbuf)//缩小比例画图函数
{
u32 i;
LCD_WR_CmdPar(0x20, x);//起始X坐标
LCD_WR_CmdPar(0x21, y);//起始Y坐标
LCD_WR_CmdPar(0x0050, 0);//水平 GRAM起始位置
LCD_WR_CmdPar(0x0051, 54);//水平GRAM终止位置
LCD_WR_CmdPar(0x0052, 170);//垂直GRAM起始位置
LCD_WR_CmdPar(0x0053, 244);//垂直GRAM终止位置
LCD_WR_Cmd(0x0022);//开始读/写
for(i=0; i<(u32)w*h; i++)
{
LCD_WR_DATA(*pbuf++);
}
}
主函数:
int main(void)
{
SystemInit();
tft_init();
FillSolidRect(0, 0, 240, 320, GREEN);//GREY
LCD_WriteBlock(0, 16, 110, 150,(u16 *)gImage_girl);这里是显示一张完整的图
LCD_WR_CmdPar(0x0004,0x0001); 设置缩小比例参数
LCD_WriteMin(0,170,110,150,(u16 *)gImage_girl);这里显示一张缩小之后的图像
while(1)
{
}
}
附上效果图: