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

在这里插入图片描述

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_PP
	GPIO_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_PP
	GPIO_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_PP
	GPIO_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_PP
	GPIO_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_PP
	GPIO_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();//使用模拟SPI
	Lcd_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_HORIZONTAL
		 Lcd_WriteData(0xE8);//横屏参数
	#else
		 Lcd_WriteData(0x48);//竖屏参数 
	#endif

	Lcd_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;}//起另外一行,240
			j++;
	}
}
//在指定位置显示一个字符,包括部分字符
//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;}//起另外一行,240
			j++;
	}
}

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);
	}		
}


猜你喜欢

转载自blog.csdn.net/lmf666/article/details/111767671