LCD_Driver.h

#ifndef _LCD_DRIVER_H_
#define _LCD_DRIVER_H_#include "stm32f4xx.h"
#include "sys.h"
#include "delay.h"
/用户配置区///
//支持横竖屏快速定义切换
#define USE_HORIZONTAL          0   //定义是否使用横屏      0,不使用.1,使用.//-----------------------------SPI 总线配置--------------------------------------//
#define USE_HARDWARE_SPI     0 //1:Enable Hardware SPI;0:USE Soft SPI//-------------------------屏幕物理像素设置--------------------------------------//
#define LCD_X_SIZE          240
#define LCD_Y_SIZE          320#if USE_HORIZONTAL//如果定义了横屏
#define X_MAX_PIXEL         LCD_Y_SIZE
#define Y_MAX_PIXEL         LCD_X_SIZE
#else
#define X_MAX_PIXEL         LCD_X_SIZE
#define Y_MAX_PIXEL         LCD_Y_SIZE
#endif
//颜色定义#define RED   0xf800
#define GREEN   0x07e0
#define BLUE    0x001f
#define WHITE   0xffff
#define BLACK   0x0000
#define YELLOW  0xFFE0
#define GRAY0   0xEF7D      //灰色0 3165 00110 001011 00101
#define GRAY1   0x8410          //灰色1      00000 000000 00000
#define GRAY2   0x4208          //灰色2  1111111111011111
//本测试程序使用的是模拟SPI接口驱动
//可自由更改接口IO配置,使用任意最少4 IO即可完成本款液晶驱动显示
/******************************************************************************
接口定义在Lcd_Driver.h内定义,请根据接线修改并修改相应IO初始化LCD_GPIO_Init()
*******************************************************************************/
#define LCD_SCL_PORT        GPIOE   //需要根据实际修改:端口
#define LCD_SCL_PIN       GPIO_Pin_4    //需要根据修改:引脚号
#define LCD_SCL_CLK_ENA() {RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE ,ENABLE);}//根据实际修改:时钟线,时钟使能#define LCD_SDA_PORT        GPIOE  //定义TFT数据端口
#define LCD_SDA_PIN        GPIO_Pin_3   //PE0--->>TFT --SDA/DIN
#define LCD_SDA_CLK_ENA() {RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE ,ENABLE);}//时钟使能#define LCD_RS_PORT          GPIOE  //定义TFT数据端口
#define LCD_RS_PIN         GPIO_Pin_2   //PE2--->>TFT --RS/DC
#define LCD_RS_CLK_ENA()  {RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE ,ENABLE);}//时钟使能#define LCD_RST_PORT         GPIOE  //定义TFT数据端口
#define LCD_RST_PIN            GPIO_Pin_0   //PE3--->>TFT --RST
#define LCD_RST_CLK_ENA() {RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE ,ENABLE);}//时钟使能#define LCD_CS_PORT         GPIOE   //定义TFT数据端口
#define LCD_CS_PIN         GPIO_Pin_1 //PE4--->>TFT --CS/CE
#define LCD_CS_CLK_ENA()  {RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE ,ENABLE);}//时钟使能//*********************************************************************************************************************
//SDO可以悬空
//#define LCD_LED           GPIO_Pin_9  //接3.3V
#define LCD_SCL_SET()  {GPIO_SetBits(LCD_SCL_PORT,LCD_SCL_PIN);}  //PG7输出低电平
#define LCD_SDA_SET()  {GPIO_SetBits(LCD_SDA_PORT,LCD_SDA_PIN);}
#define LCD_RS_SET()   {GPIO_SetBits(LCD_RS_PORT,LCD_RS_PIN);}
#define LCD_RST_SET()  {GPIO_SetBits(LCD_RST_PORT,LCD_RST_PIN);}
#define LCD_CS_SET()   {GPIO_SetBits(LCD_CS_PORT,LCD_CS_PIN);}   #define    LCD_SCL_CLR()   {GPIO_ResetBits(LCD_SCL_PORT,LCD_SCL_PIN); }
#define LCD_SDA_CLR()   { GPIO_ResetBits(LCD_SDA_PORT,LCD_SDA_PIN);}
#define LCD_RS_CLR()      { GPIO_ResetBits(LCD_RS_PORT,LCD_RS_PIN); }
#define LCD_RST_CLR()   { GPIO_ResetBits(LCD_RST_PORT,LCD_RST_PIN); }
#define LCD_CS_CLR()    { GPIO_ResetBits(LCD_CS_PORT,LCD_CS_PIN);} void LCD_GPIO_Init(void);void Lcd_WriteIndex(u8 Index);
void Lcd_WriteData(u8 Data);
void Lcd_WriteReg(u8 Index,u8 Data);
u16 Lcd_ReadReg(u8 LCD_Reg);
void Lcd_Reset(void);
void Lcd_Init(void);
void Lcd_Clear(u16 Color);
void Lcd_SetXY(u16 x,u16 y);
void Gui_DrawPoint(u16 x,u16 y,u16 Data);
unsigned int Lcd_ReadPoint(u16 x,u16 y);
void Lcd_SetRegion(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd);
void Lcd_WriteData_16Bit(u16 Data);void LCD_ShowCharAsc16(u8 x,u8 y,u16 fc, u16 bc,u8 chr);
void LCD_ShowStringAsc16(u8 x,u8 y,u16 fc, u16 bc,u8 *chr);
void LCD_ShowNumAsc16(u8 x,u8 y,u16 fc, u16 bc,u16 num,u8 len);void LCD_ShowCharAsc32(u16 x,u16 y,u16 fc, u16 bc,u8 chr);
void LCD_ShowStringAsc32(u16 x,u16 y,u16 fc, u16 bc,u8 *chr);
void LCD_ShowNumAsc32(u16 x,u16 y,u16 fc, u16 bc,u16 num,u8 len);
void LCD_ShowFloatAsc32(u16 x,u16 y,u16 fc, u16 bc,float num,u8 len);void Gui_DrawFont_Num96(u16 x, u16 y, u16 fc, u16 bc, u16 num);
#endif

LCD_Driver.c

#include "Lcd_Driver.h"
#include "font.h"
#include "stdio.h"
/***************************************************************************************
STM32测试平台介绍:
开发板:正点原子MiniSTM32开发板
MCU :STM32_F103_RBT6
晶振 :12MHZ
主频 :72MHZ
接线说明:
//-------------------------------------------------------------------------------------
#define LCD_CTRL        GPIOB       //定义TFT数据端口
#define LCD_LED         GPIO_Pin_9  //PB9 连接至TFT -LED
#define LCD_RS          GPIO_Pin_10 //PB10连接至TFT --RS
#define LCD_CS          GPIO_Pin_11 //PB11 连接至TFT --CS
#define LCD_RST           GPIO_Pin_12   //PB12连接至TFT --RST
#define LCD_SCL         GPIO_Pin_13 //PB13连接至TFT -- CLK
#define LCD_SDA         GPIO_Pin_15 //PB15连接至TFT - SDI
//VCC:可以接5V也可以接3.3V
//LED:可以接5V也可以接3.3V或者使用任意空闲IO控制(高电平使能)
//GND:接电源地
//说明:如需要尽可能少占用IO,可以将LCD_CS接地,LCD_LED接3.3V,LCD_RST接至单片机复位端,
//将可以释放3个可用IO
//接口定义在Lcd_Driver.h内定义,
//如需变更IO接法,请根据您的实际接线修改相应IO初始化LCD_GPIO_Init()
//-----------------------------------------------------------------------------------------
例程功能说明:
1.  简单刷屏测试
2.  英文显示测试示例
3.  中文显示测试示例
4.  数码管字体显示示例
5.  图片显示示例
6.  2D按键菜单示例
7.  本例程支持横屏/竖屏切换(开启宏USE_HORIZONTAL,详见Lcd_Driver.h)
8.  本例程支持软件模拟SPI/硬件SPI切换(开启宏USE_HARDWARE_SPI,详见Lcd_Driver.h)
**********************************************************************************************///---------------------------------function----------------------------------------------------///****************************************************************************
* 名    称:void LCD_GPIO_Init(void)
* 功    能:STM32_模拟SPI所用到的GPIO初始化
* 入口参数:无
* 出口参数:无
* 说    明:初始化模拟SPI所用的GPIO
****************************************************************************/
void LCD_GPIO_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;      LCD_SCL_CLK_ENA();GPIO_InitStructure.GPIO_Pin = LCD_SCL_PIN;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;   //输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //推挽输出GPIO_OType_OD  GPIO_OType_PPGPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;  //上拉GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度选择   GPIO_Init(LCD_SCL_PORT, &GPIO_InitStructure);LCD_SDA_CLK_ENA();GPIO_InitStructure.GPIO_Pin = LCD_SDA_PIN;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;   //输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //推挽输出GPIO_OType_OD  GPIO_OType_PPGPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; //上拉GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度选择   GPIO_Init(LCD_SDA_PORT, &GPIO_InitStructure);LCD_RS_CLK_ENA();GPIO_InitStructure.GPIO_Pin = LCD_RS_PIN;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;   //输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //推挽输出GPIO_OType_OD  GPIO_OType_PPGPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;   //上拉GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度选择   GPIO_Init(LCD_RS_PORT, &GPIO_InitStructure);LCD_RST_CLK_ENA();GPIO_InitStructure.GPIO_Pin = LCD_RST_PIN;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;   //输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //推挽输出GPIO_OType_OD  GPIO_OType_PPGPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;  //上拉GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度选择   GPIO_Init(LCD_RST_PORT, &GPIO_InitStructure);LCD_CS_CLK_ENA();GPIO_InitStructure.GPIO_Pin = LCD_CS_PIN;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;   //输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //推挽输出GPIO_OType_OD  GPIO_OType_PPGPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;   //上拉GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度选择   GPIO_Init(LCD_CS_PORT, &GPIO_InitStructure);}
/****************************************************************************
* 名    称:void  SPIv_WriteData(u8 Data)
* 功    能:STM32_模拟SPI写一个字节数据底层函数
* 入口参数:Data
* 出口参数:无
* 说    明:STM32_模拟SPI读写一个字节数据底层函数
****************************************************************************/
void  SPIv_WriteData(unsigned char Data)
{unsigned char i=0;for(i=8;i>0;i--){//      if(Data&0x80)
//        LCD_SDA_SET;//输出数据
//     else
//           LCD_SDA_CLR;if(Data&0x80)  LCD_SDA_SET();if((Data&0x80)==0)LCD_SDA_CLR();LCD_SCL_CLR();       LCD_SCL_SET();Data<<=1; }
}
/****************************************************************************
* 名    称:Lcd_WriteIndex(u8 Index)
* 功    能:向液晶屏写一个8位指令
* 入口参数:Index   寄存器地址
* 出口参数:无
* 说    明:调用前需先选中控制器,内部函数
****************************************************************************/
void Lcd_WriteIndex(u8 Index)
{LCD_CS_CLR();LCD_RS_CLR();SPIv_WriteData(Index);LCD_CS_SET();
}/****************************************************************************
* 名    称:Lcd_WriteData(u8 Data)
* 功    能:向液晶屏写一个8位数据
* 入口参数:dat     寄存器数据
* 出口参数:无
* 说    明:向控制器指定地址写入数据,内部函数
****************************************************************************/
void Lcd_WriteData(u8 Data)
{LCD_CS_CLR();LCD_RS_SET();SPIv_WriteData(Data);LCD_CS_SET();
}/****************************************************************************
* 名    称:void LCD_WriteReg(u8 Index,u16 Data)
* 功    能:写寄存器数据
* 入口参数:Index,Data
* 出口参数:无
* 说    明:本函数为组合函数,向Index地址的寄存器写入Data值
****************************************************************************/
void LCD_WriteReg(u8 Index,u16 Data)
{Lcd_WriteIndex(Index);Lcd_WriteData_16Bit(Data);
}/****************************************************************************
* 名    称:void Lcd_WriteData_16Bit(u16 Data)
* 功    能:向液晶屏写一个16位数据
* 入口参数:Data
* 出口参数:无
* 说    明:向控制器指定地址写入一个16位数据
****************************************************************************/
void Lcd_WriteData_16Bit(u16 Data)
{   Lcd_WriteData(Data>>8);Lcd_WriteData(Data);
}/****************************************************************************
* 名    称:void Lcd_Reset(void)
* 功    能:液晶硬复位函数
* 入口参数:无
* 出口参数:无
* 说    明:液晶初始化前需执行一次复位操作
****************************************************************************/
void Lcd_Reset(void)
{LCD_RST_CLR();Delay_ms(100);LCD_RST_SET();Delay_ms(50);
}
/****************************************************************************
* 名    称:void Lcd_Init(void)
* 功    能:液晶初始化函数
* 入口参数:无
* 出口参数:无
* 说    明:液晶初始化_ILI9225_176X220
****************************************************************************/
void Lcd_Init(void)
{   LCD_GPIO_Init();//使用模拟SPILcd_Reset(); //Reset before LCD Init.//2.2inch TM2.2-G2.2 Init 20171020 Lcd_WriteIndex(0x11);  Lcd_WriteData(0x00); Lcd_WriteIndex(0xCF);  Lcd_WriteData(0X00); Lcd_WriteData(0XC1); Lcd_WriteData(0X30);Lcd_WriteIndex(0xED);  Lcd_WriteData(0X64); Lcd_WriteData(0X03); Lcd_WriteData(0X12);Lcd_WriteData(0X81);Lcd_WriteIndex(0xE8);  Lcd_WriteData(0X85); Lcd_WriteData(0X11); Lcd_WriteData(0X78);Lcd_WriteIndex(0xF6);  Lcd_WriteData(0X01); Lcd_WriteData(0X30); Lcd_WriteData(0X00);Lcd_WriteIndex(0xCB);  Lcd_WriteData(0X39); Lcd_WriteData(0X2C); Lcd_WriteData(0X00);Lcd_WriteData(0X34);Lcd_WriteData(0X05);Lcd_WriteIndex(0xF7);  Lcd_WriteData(0X20); Lcd_WriteIndex(0xEA);  Lcd_WriteData(0X00); Lcd_WriteData(0X00); Lcd_WriteIndex(0xC0);  Lcd_WriteData(0X20); Lcd_WriteIndex(0xC1);  Lcd_WriteData(0X11); Lcd_WriteIndex(0xC5);  Lcd_WriteData(0X31); Lcd_WriteData(0X3C); Lcd_WriteIndex(0xC7);  Lcd_WriteData(0XA9); Lcd_WriteIndex(0x3A);  Lcd_WriteData(0X55); Lcd_WriteIndex(0x36);  #if USE_HORIZONTALLcd_WriteData(0xE8);//横屏参数#elseLcd_WriteData(0x48);//竖屏参数 #endifLcd_WriteIndex(0xB1);  Lcd_WriteData(0X00); Lcd_WriteData(0X18); Lcd_WriteIndex(0xB4);  Lcd_WriteData(0X00); Lcd_WriteData(0X00); Lcd_WriteIndex(0xF2);  Lcd_WriteData(0X00); Lcd_WriteIndex(0x26);  Lcd_WriteData(0X01); Lcd_WriteIndex(0xE0);  Lcd_WriteData(0X0F); Lcd_WriteData(0X17); Lcd_WriteData(0X14); Lcd_WriteData(0X09); Lcd_WriteData(0X0C); Lcd_WriteData(0X06); Lcd_WriteData(0X43); Lcd_WriteData(0X75); Lcd_WriteData(0X36); Lcd_WriteData(0X08); Lcd_WriteData(0X13); Lcd_WriteData(0X05); Lcd_WriteData(0X10); Lcd_WriteData(0X0B); Lcd_WriteData(0X08); Lcd_WriteIndex(0xE1);  Lcd_WriteData(0X00); Lcd_WriteData(0X1F); Lcd_WriteData(0X23); Lcd_WriteData(0X03); Lcd_WriteData(0X0E); Lcd_WriteData(0X04); Lcd_WriteData(0X39); Lcd_WriteData(0X25); Lcd_WriteData(0X4D); Lcd_WriteData(0X06); Lcd_WriteData(0X0D); Lcd_WriteData(0X0B); Lcd_WriteData(0X33); Lcd_WriteData(0X37); Lcd_WriteData(0X0F); Lcd_WriteIndex(0x29);
}/*************************************************
函数名:LCD_Set_XY
功能:设置lcd显示起始点
入口参数:xy坐标
返回值:无
*************************************************/
void Lcd_SetXY(u16 Xpos, u16 Ypos)
{   Lcd_WriteIndex(0x2A);Lcd_WriteData_16Bit(Xpos);Lcd_WriteIndex(0x2B);Lcd_WriteData_16Bit(Ypos);Lcd_WriteIndex(0x2c);
}
/*************************************************
函数名:LCD_Set_Region
功能:设置lcd显示区域,在此区域写点数据自动换行
入口参数:xy起点和终点
返回值:无
*************************************************/
//设置显示窗口
void Lcd_SetRegion(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd)
{Lcd_WriteIndex(0x2A);Lcd_WriteData_16Bit(xStar);Lcd_WriteData_16Bit(xEnd);Lcd_WriteIndex(0x2B);Lcd_WriteData_16Bit(yStar);Lcd_WriteData_16Bit(yEnd);Lcd_WriteIndex(0x2c);
}/*************************************************
函数名:LCD_DrawPoint
功能:画一个点
入口参数:xy坐标和颜色数据
返回值:无
*************************************************/
void Gui_DrawPoint(u16 x,u16 y,u16 Data)
{Lcd_SetXY(x,y);Lcd_WriteData_16Bit(Data);}    /*************************************************
函数名:Lcd_Clear
功能:全屏清屏函数
入口参数:填充颜色COLOR
返回值:无
*************************************************/
void Lcd_Clear(u16 Color)
{   unsigned int i;Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);LCD_CS_CLR();LCD_RS_SET();    for(i=0;i<X_MAX_PIXEL*Y_MAX_PIXEL;i++){   SPIv_WriteData(Color>>8);SPIv_WriteData(Color);}   LCD_CS_SET();
}//m^n函数
u16 Lcd_pow(u8 m,u8 n)
{u16 result=1;  while(n--)result*=m;    return result;
}       //从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);}//在指定位置显示一个字符,包括部分字符
//8*16字体
void LCD_ShowCharAsc16(u8 x,u8 y,u16 fc, u16 bc,u8 chr)
{       unsigned char i,j,k,c;for(i=0;i<16;i++)//16  6*8{for(j=0;j<1;j++)//刷一行//为什么小于6?6=48/8...对于48*96字体,横48,纵96,横是纵的一般,按照英文字体;生成的是8个点,一个字节。如0x00..所以横方向要//横方向要是48/8=6个循环,写6次{//取某行的首地址的数组的数据;//为什么是96*6?,因为:一个字库的字符是96行,每行是6*8=48个点;32/8//为什么是i*6?因为间隔第二行,需要6个字节,就是48/8=6,//为什么是+j,是因为:在同一行里面,一个个字节递推加起来。// c=*(F8X16+num*96*6+i*6+j-);//c=*(F8X16)//c=chr-' ';c=*(font816+(chr-' ')*16*1+i*1+j);//  c=chr-' ';//得到偏移后的值   //扫描刷8个点。有数据,刷红色fc字体,没数据,刷白色。for (k=0;k<8;k++)   {if(c&(0x80>>k))  Gui_DrawPoint(x+j*8+k,y+i,fc);else {if (fc!=bc) Gui_DrawPoint(x+j*8+k,y+i,bc);}//}}}
}//m^n函数
u16 LCD_pow(u8 m,u8 n)
{u16 result=1;  while(n--)result*=m;    return result;
}
//显示2个数字
//x,y :起点坐标
//len :数字的位数
//num:数值(0~4294967295);
void LCD_ShowNumAsc16(u8 x,u8 y,u16 fc, u16 bc,u16 num,u8 len)
{           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_ShowCharAsc16(x+9*t,y,fc,bc,' ');//这里我自己修改了一下。不如数据会重叠continue;}else enshow=1; }LCD_ShowCharAsc16(x+9*t,y,fc,bc,temp+'0'); //这里我自己修改了一下。不如数据会重叠}
} //显示一个字符号串
void LCD_ShowStringAsc16(u8 x,u8 y,u16 fc, u16 bc,u8 *chr)
{unsigned char j=0;while (chr[j]!='\0'){        LCD_ShowCharAsc16(x,y,fc,bc,chr[j]);x+=8;if(x>232){x=0;y+=16;}//起另外一行,240j++;}
}
//在指定位置显示一个字符,包括部分字符
//16*32字体
void LCD_ShowCharAsc32(u16 x,u16 y,u16 fc, u16 bc,u8 chr)
{       unsigned char i,j,k,c;
//    x=x*16;
//    y=y*32;for(i=0;i<32;i++)//96行  6*8{for(j=0;j<2;j++)//刷一行=16/8=2{c=*(font1632+(chr-' ')*32*2+i*2+j);//for (k=0;k<8;k++) {if(c&(0x80>>k))  Gui_DrawPoint(x+j*8+k,y+i,fc);else {if (fc!=bc) Gui_DrawPoint(x+j*8+k,y+i,bc);}}}}
}
//显示2个数字
//x,y :起点坐标
//len :数字的位数
//num:数值(0~4294967295);
void LCD_ShowNumAsc32(u16 x,u16 y,u16 fc, u16 bc,u16 num,u8 len)
{           u8 t,temp;u8 enshow=0;
//  x=x*16;
//  y=y*32;    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_ShowCharAsc32(x+17*t,y,fc,bc,' ');//这里我自己修改了一下。不如数据会重叠continue;}else enshow=1; }LCD_ShowCharAsc32(x+17*t,y,fc,bc,temp+'0'); //这里我自己修改了一下。不如数据会重叠}
} //显示一个字符号串
void LCD_ShowStringAsc32(u16 x,u16 y,u16 fc, u16 bc,u8 *chr)
{unsigned char j=0;
//  x=x*16;
//  y=y*32;while (chr[j]!='\0'){        LCD_ShowCharAsc32(x,y,fc,bc,chr[j]);x+=16;if(x>232){x=0;y+=32;}//起另外一行,240j++;}
}void LCD_ShowFloatAsc32(u16 x,u16 y,u16 fc, u16 bc,float num,u8 len)
{char disbuftemp[9];
//  x=x*16;
//  y=y*32;switch(len){case 3: sprintf(disbuftemp,"%.3f",num);break;case 2:  sprintf(disbuftemp,"%.2f",num);break;case 1:  sprintf(disbuftemp,"%.1f",num);break;default: sprintf(disbuftemp,"%.3f",num);break; }LCD_ShowStringAsc32(x,y,fc,bc,disbuftemp);
}
//成功的num64 x横方向,y竖方向48*96
void Gui_DrawFont_Num96(u16 x, u16 y, u16 fc, u16 bc, u16 num)
{unsigned char i,j,k,c;for(i=0;i<96;i++)//96行{for(j=0;j<6;j++)//刷一行//为什么小于6?6=48/8...对于48*96字体,横48,纵96,横是纵的一般,按照英文字体;生成的是8个点,一个字节。如0x00..所以横方向要//横方向要是48/8=6个循环,{//取某行的首地址的数组的数据;//为什么是96*6?,因为:一个字库的字符是96行,每行是6*8=48个点;//为什么是i*6?因为间隔第二行,需要6个字节,就是48/8=6,//为什么是+j,是因为:在同一行里面,一个个字节递推加起来。c=*(zi96+num*96*6+i*6+j);//扫描刷8个点。有数据,刷红色fc字体,没数据,刷白色。for (k=0;k<8;k++)   {if(c&(0x80>>k))  Gui_DrawPoint(x+j*8+k,y+i,fc);else {if (fc!=bc) Gui_DrawPoint(x+j*8+k,y+i,bc);}//}}}
}//简单刷屏测试
void Color_Test(void)
{u8 i=1;Lcd_Clear(GRAY0);Delay_ms(1200);while(i--){Lcd_Clear(WHITE); Delay_ms(500);Lcd_Clear(BLACK); Delay_ms(500);Lcd_Clear(RED);   Delay_ms(500);Lcd_Clear(GREEN); Delay_ms(500);Lcd_Clear(BLUE);  Delay_ms(500);}
}

stm32f407zgt6的2.2LCD实例1.2:LCD屏幕程序讲解之LCD驱动底层代码相关推荐

  1. 基于WT2003H语音芯片在LCD屏幕驱动的应用实例解析

    基于WT2003H语音芯片在LCD屏幕驱动的应用实例解析 随着现代生活节奏的加快,简单快捷的产品越来越受到人们的青睐,产品也越来越注重人机交互和简单明了的用户体验,一款具备LCD屏幕的产品往往更具有竞 ...

  2. STM32F407中的RT-thread系统中移植LCD的程序-FSMC控制

    环境 开发板:正点原子探索者 芯片:STM32F407ZGT6 系统:RT-Thread 屏幕型号:TFTLCD 55510 4.3寸 开发软件:Keil,CubeMX, Env 目的 现在将裸板上的 ...

  3. bmp格式转换lcd屏幕c语言,BMP转成C语言数组文件工具(用image2lcd代替bmp2h.exe)

    学习裸机,到LCD这了,因为LCD屏和别人不一样,参数搞定后图片也要自己弄一个,最先想想来了mini2440光盘中的有一个bmp2h.exe,用它可以的.不过有一点不行,就如下这图: 出现这种情况我还 ...

  4. 蓝桥杯嵌入式--LCD屏幕使用提升

    前言 之前在专栏里已经介绍过LCD相关库文件的移植,今天来介绍一下对于LCD屏幕的使用技巧. 屏幕基本配置与函数 一.屏幕初始化 使用lcd前的必要步骤就是对LCD屏幕进行初始化操作,这也是一个容易忘 ...

  5. WF4.0 基础篇 (三) 流程实例WorkflowApplication与设计WF程序的基本原则

    通过本节,可以初步了解WF程序的特性,为以后的WF类应用开发提供一个初步的感性认识 目录 1    流程实例WorkflowApplication与设计WF程序的基本原则    1 1.1    流程 ...

  6. LCD RGB 控制技术讲解 — 时钟篇(上)

    个人笔记,欢迎转载,请注明出处,共同分享 共同进步  http://blog.csdn.net/richard_liujh/article/details/46352857  刘金辉 目录 LCD R ...

  7. lcd屏幕抖动_电视屏幕面板大科普!买电视之前必看!

    BOE知识酷 ?显示技术|显示资讯| PPT|知识管理第856篇推文导读:经常看到什么LCD.LED.OLED.ULED.QLED.SLED.GLED--之类的名词,花里胡哨.别看那么多名词,但从显示 ...

  8. AM335x关于LCD屏幕的时钟PLL配置

    主要参考的是AM335x的TRM的第8章PRCM模块和13章LCD Controller. 这里在LCD Controller里面的配置描述的比较详细了,分频和像素.消影值的设置等等.不在赘述,很多人 ...

  9. iphonex价格_iPhone X竟然可以换LCD屏幕,价格只要一半

    知名拆解和配件商iFixit现在为iPhone X/Xs系列机器提供LCD屏幕,称除了屏幕亮度有点低.色彩有点差别外,其他几乎一致,但价格只要一半,而且终生质保 两块屏幕实拍对比,左侧是iPhone ...

最新文章

  1. ASP.NET MVC – 模型简介
  2. 每个程序员都应该了解的内存知识(3)-虚拟内存
  3. mysql无法插入行_在mysql中数据才插入20多行就报错,求救啊!!!
  4. BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]
  5. JVM-白话聊一聊JVM类加载和双亲委派机制源码解析
  6. shaderlab UV动画所需的变量声明
  7. 快速傅里叶变换(FFT)——按时间抽取DIT的基
  8. ATS push cache 测试
  9. 闲暇所学“表白对话框”
  10. 小爱同学app安卓版_小爱课程表3.0全新升级 课表倒入更简单所有手机能用
  11. 真正的商用量子电脑!IBM推 Q System One
  12. Python 基础课程第四天
  13. LeetCode 343. 整数拆分(Integer Break) 25
  14. php提升并发,php高并发处理
  15. 高效能人士的第三个习惯——要事第一
  16. kettle复杂表头的Excel数据源处理
  17. 重磅!亚马逊创始人贝佐斯将于7月飞往太空,人类征服太空的野心从未停止!| 硅谷速递...
  18. 学渣的刷题之旅 leetcode刷题 2. 两数相加
  19. 2022最新独立版智狐聚合支付v1.0.5.21_聚合支付系统源码
  20. 黑马程序员_Java_线程池

热门文章

  1. 老大告诉我不要用字符串存IP地址,不兴~
  2. Ubuntu不同颜色文件所代表的文件类型
  3. 【转】iOS开发人员必看的精品资料(100个)
  4. 最新PESCMS Ticket客服工单系统源码+全新的设计理念
  5. laravel 5.5 The page has expired due to inactivity. Please refresh and try again
  6. 软件工程——软件总体设计
  7. 多开分身苹果版_苹果手机最新微信分身怎么下载?微信多开地址分享
  8. 李理:详解卷积神经网络
  9. 语音端点检测 php,几种语音端点检测方法简介
  10. 传输线的共模和差模噪声,抑制方法