stm32(十八)TFT-LCD

1、TFT-LCD屏简介

LCD( Liquid Crystal Display),即液晶显示器,可分为被动矩阵式和主动矩阵式两种不同的控制方式,主动矩阵式也称为 TFT( Thin Film Transistor)。 主动式 TFT 型的液晶显示器的结构较为复杂包括了:背光管、导光板、偏光板、滤光板、玻璃基板、配向膜、液晶材料和薄模式晶体管等等。

一个完整的 LCD 显示系统由三部分组成:主控系统、 LCD 显示控制器、 LCD 显示屏。市场上,高端一点的主控系统一般内部集成有 LCD 显示控制器;一般的单片机内部往往都是不集成有 LCD 显示控制器。主控内部没有集成 LCD 控制器的,一般需要外置 LCD 控制器或者使用自带有控制器的 LCD 显示屏。



2、LCD屏的参数

  • 分辨率:屏幕上能显示的像素点的个数,包括水平分辨率和垂直分辨率。我的开发板上面用的LCD屏的分辨率是固定的,固定为横向320x纵向480。即:水平方向有 320 个像素点,垂直方向有480个像素点。
  • LCD屏每一个像素点的颜色都是彩色的,可以理解每一个像素点都有3个彩色灯:红色、绿色、蓝色,将红绿蓝以不同的色彩强度进行混合就可以产生千变万化的彩色。
  • 颜色位深:表示 RGB (红绿蓝)颜色的二进制位数,常见的有 16BPP(bit per pixel)如: 16BPP 表示一个像素点的颜色使用 16 个二进制位表示。,总共是16位。
  • RGB565,用5位来表示红色、6位来表示绿色、5位来表示蓝色,关系如下图:

电脑的屏是24BPP的。

颜色位越大则可以显示的颜色的种类越多。

3、TFT-LCD控制器的原理

TFT-LCD控制器的型号是ILI9486,每一款屏都有一个数据手册来描述屏基本的原理。

 ILI9486和CPU通讯的接口有很多,而我们选择用的接口是16位的并口,即需要16个数据管脚来传输数据。

 

3.1、ILI9486接口

 

  • IM[2:0]  选择接口模式的管脚

当IM2管脚接低电平,IM1管脚接高电平,IM0管脚接低电平,则选择的数据通讯接口是8080的16位并口通信接口

  • RESX 复位管脚

硬件复位TFT-LCD控制器

已经直接连接到RC复位电路

 

  • CSX CS:chip select

8080并口通讯的芯片选择管脚,简称片选脚

低电平:ILI9486被选中,并且可访问

高电平:ILI9486未被选中,不可访问、

  •   DCX  数据命令

数据命令管脚,用于控制ILI9486接收到的16进制数是用于设置参数,还是用于显示在LCD屏上。

低电平:命令

高电平:数据(参数)

  • RDX  8080并口通讯的读数据时钟管脚

读信号管脚:主控在RDX的上升沿读取数据

  • WRX 8080并口通讯写数据时钟管脚

写信号管脚,主控在WRX的上升沿是发送数据。

  • DB[17:0]  总线管脚

8080并口通讯数据传输管脚,用于发送数据给ILI9486,也用于从ILI9486中读取数据。

由于我们选择的是RGB565的像素格式,只需要16个管脚即可传输16位数据。

我们只用到DB[15:0]

4、8080并口通信的原理

8080并口通信接口的简介8080并口传输位数可选:8/9/16/18,我们选择用16位并口传输。主要需要的管脚如下:

CSX:用于使能或者禁止ILI9486

WRX:写信号(写时钟),每一个时钟信号,主控发送16位数据

RDX:读信号(读时钟),每一个时钟信号,主控读取16位数据

DC  : 数据命令管脚,决定DB[15:0]的位数据是写到显存还是写到命令寄存器。

DB[15:0]:并口通信管脚

补充知识点:显存:水池存储水,显存是存储线显示图像文字字符数据的,显存越大可以存储的图像信息越多,显示效果越好。主控写图像文字数据到ILI9486时,其实就是写到显存中。

5、8080并口写时序

8080接口传输16位数据的时序图如下图所示:

①操作ILI9486时,必须将CSX管脚拉低

②在写数据或者写命令时,WRX通过拉低在拉高来模拟产生一个上升沿

③在写数据或者写命令时,RDX不产生脉冲该信号,而是保持为高电平

④下图中,一个WRX脉冲时钟可以传输16位数据

⑤DC是数据命令控制管脚,DB[15:0]的位数据是写到命令寄存器,还是写到显存,就是用DC管脚电平高低来进行区分的

该时序对应的伪代码如下:

(1)主控写命令的伪代码
   //CS管脚输出低电平
   //DC管脚拉低电平
   //WRX管脚拉电平
   //DB[15:0] 准备16位数据
   //WRX拉高电平
(2)主控写数据的伪代码
   //CS管脚输出低电平
   //DC管脚拉高电平
   //WRX管脚拉电平
   //DB[15:0] 准备16位数据
   //WRX拉高电平

8080 接口写像素点(数据)的时序

(1)一次传输传输一个像素点数据,一个像素点数据有16位

(2)最高的数据通过D15管脚输出,最低位的数据通过D0输出

(3)红色是高5位;绿色是中间6位,蓝色是最低5位

ILI9486的常用命令

1、主控发送0x01命令到ILI9486可以让ILI9486进行软件复位。发送命令的时序要求是:DC低电平,RDX保持高电平,WRX产生一个上升沿,D[15:8]的数值是无效的,D[7:0]的值是有效

2、列地址设置命令:

   设置一个显示窗口的列地址。列地址的取值范围是[0:319]。

   主控在设置列地址时的步骤如下:

   ①主控发送发送一条命令:0x2A

   ②主控发送列地址的起始地址(SC:start column),16位的起始地址分两次发送

   ③主控发送列地址的结束地址(EC:end column),16位的结束地址分两次发送

3、页(行)地址设置命令:

 设置一个显示窗口的页(行)地址。页(行)地址的取值范围是[0:479]。

   主控在设置页(行)地址时的步骤如下:

   ①主控发送发送一条命令:0x2B

   ②主控发送页(行)地址的起始地址(SP:start page),16位的起始地址分两次发送

   ③主控发送页(行)地址的结束地址(EP:end page),16位的结束地址分两次发送

4、写像素点数据到显存中:

  主控首先发送命令0x2C,告诉ILI9486,主控即将发送像素点数据。主控可以连续地写像素点数据到TFT-LCD屏中的显存即上图中的D1[15:0]~Dx[15:0]~Dn[15:0]。

  主控连续写像素点数据到显存中时,显存保存了一个像素点的数据后地址会自动递增来准备接收下一个像素点的数据

5、显存访问控制命令:

   用于设置显存的增长方向,常用的是MY为0,MX为0,MV为0的模式

6、软件设计

原理图

其中注释的为库函数的配置

#include "stm32f4xx.h"
//常用的颜色
#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 //灰色
//字体取模
const unsigned char chinese_1[] =
{

0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,/*"中",0*/
/* (16 X 16 , 宋体 )*/

};

const unsigned char chinese_2[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x08,0x01,0x80,0x30,
0x0F,0xFF,0xFF,0xF0,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,
0x0F,0xFF,0xFF,0xE0,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,
0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,/*"中",0*/
/* (32 X 32 , 宋体 )*/

};

const unsigned char chinese_3[] =
{

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x80,0x00,0x07,0x80,0x00,0x0C,0x00,0x00,0x60,0x00,0x07,0x80,0x00,0x1F,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,
0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,
0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,
0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,
0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,
0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x60,0x00,0x07,
0x80,0x00,0x18,0x00,0x00,0x80,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"中",0*/
/* (64 X 64 , 宋体 )*/

};

const unsigned char char_1[] =
{
0x00,0x00,0x00,0x10,0x10,0x18,0x28,0x28,0x24,0x3C,0x44,0x42,0x42,0xE7,0x00,0x00,/*"A",0*/
/* (8 X 16 , 宋体 )*/
};

const unsigned char char_2[] =
{

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x02,0x80,0x06,0xC0,0x04,0xC0,0x04,0xC0,0x04,0xC0,0x0C,0x60,0x08,0x60,0x08,0x60,0x08,0x60,
0x1F,0xF0,0x10,0x30,0x10,0x30,0x10,0x30,0x30,0x30,0x20,0x18,0x20,0x18,0x60,0x18,0xF8,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"A",0*/
/* (16 X 32 , 宋体 )*/
};

const unsigned char char_3[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x06,0xE0,0x00,0x00,0x0C,0xF0,0x00,
0x00,0x0C,0xF0,0x00,0x00,0x0C,0xF0,0x00,0x00,0x0C,0xF0,0x00,0x00,0x18,0x78,0x00,0x00,0x18,0x78,0x00,0x00,0x18,0x78,0x00,0x00,0x18,0x78,0x00,0x00,0x30,0x3C,0x00,0x00,0x30,0x3C,0x00,
0x00,0x30,0x3C,0x00,0x00,0x30,0x3C,0x00,0x00,0x70,0x1C,0x00,0x00,0x60,0x1E,0x00,0x00,0x60,0x1E,0x00,0x00,0x60,0x1E,0x00,0x00,0xE0,0x0E,0x00,0x00,0xC0,0x0F,0x00,0x00,0xC0,0x0F,0x00,
0x00,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0x00,0x01,0x80,0x0F,0x80,0x01,0x80,0x07,0x80,0x01,0x80,0x07,0x80,0x03,0x80,0x07,0x80,0x03,0x00,0x07,0xC0,0x03,0x00,0x03,0xC0,0x03,0x00,0x03,0xC0,
0x07,0x00,0x03,0xC0,0x06,0x00,0x03,0xE0,0x06,0x00,0x01,0xE0,0x06,0x00,0x01,0xE0,0x0E,0x00,0x01,0xE0,0x0E,0x00,0x01,0xF0,0x1F,0x00,0x01,0xF8,0x7F,0xC0,0x0F,0xFE,0x7F,0xC0,0x0F,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,/*"A",0*/
/* (32 X 64 , 宋体 )*/

};

const unsigned char anscii_8_16[ ]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x18,0x18,0x00,0x00,/*"!",1*/
/* (8 X 16 , 宋体 )*/

0x00,0x12,0x36,0x24,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",2*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x24,0x24,0x24,0xFE,0x48,0x48,0x48,0xFE,0x48,0x48,0x48,0x00,0x00,/*"#",3*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x10,0x38,0x54,0x54,0x50,0x30,0x18,0x14,0x14,0x54,0x54,0x38,0x10,0x10,/*"$",4*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x44,0xA4,0xA8,0xA8,0xA8,0x54,0x1A,0x2A,0x2A,0x2A,0x44,0x00,0x00,/*"%",5*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x50,0x6E,0xA4,0x94,0x88,0x89,0x76,0x00,0x00,/*"&",6*/
/* (8 X 16 , 宋体 )*/

0x00,0x60,0x60,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",7*/
/* (8 X 16 , 宋体 )*/

0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00,/*"(",8*/
/* (8 X 16 , 宋体 )*/

0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00,/*")",9*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x10,0x10,0xD6,0x38,0x38,0xD6,0x10,0x10,0x00,0x00,0x00,0x00,/*"*",10*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x10,0x00,0x00,0x00,/*"+",11*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x20,0xC0,/*",",12*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"-",13*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,/*".",14*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x01,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,/*"/",15*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"0",16*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*"1",17*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,/*"2",18*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*"3",19*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,/*"4",20*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*"5",21*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"6",22*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,/*"7",23*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,/*"8",24*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00,/*"9",25*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,/*":",26*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x20,/*";",27*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00,/*"<",28*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,/*"=",29*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00,/*">",30*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x62,0x02,0x04,0x08,0x08,0x00,0x18,0x18,0x00,0x00,/*"?",31*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x38,0x44,0x5A,0xAA,0xAA,0xAA,0xAA,0xB4,0x42,0x44,0x38,0x00,0x00,/*"@",32*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x10,0x10,0x18,0x28,0x28,0x24,0x3C,0x44,0x42,0x42,0xE7,0x00,0x00,/*"A",33*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xF8,0x44,0x44,0x44,0x78,0x44,0x42,0x42,0x42,0x44,0xF8,0x00,0x00,/*"B",34*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x3E,0x42,0x42,0x80,0x80,0x80,0x80,0x80,0x42,0x44,0x38,0x00,0x00,/*"C",35*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xF8,0x44,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x44,0xF8,0x00,0x00,/*"D",36*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x42,0x42,0xFC,0x00,0x00,/*"E",37*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x40,0x40,0xE0,0x00,0x00,/*"F",38*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x3C,0x44,0x44,0x80,0x80,0x80,0x8E,0x84,0x44,0x44,0x38,0x00,0x00,/*"G",39*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"H",40*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*"I",41*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x88,0xF0,/*"J",42*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xEE,0x44,0x48,0x50,0x70,0x50,0x48,0x48,0x44,0x44,0xEE,0x00,0x00,/*"K",43*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x42,0xFE,0x00,0x00,/*"L",44*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xEE,0x6C,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x54,0xD6,0x00,0x00,/*"M",45*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xC7,0x62,0x62,0x52,0x52,0x4A,0x4A,0x4A,0x46,0x46,0xE2,0x00,0x00,/*"N",46*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00,/*"O",47*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xFC,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x40,0xE0,0x00,0x00,/*"P",48*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0xB2,0xCA,0x4C,0x38,0x06,0x00,/*"Q",49*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xFC,0x42,0x42,0x42,0x7C,0x48,0x48,0x44,0x44,0x42,0xE3,0x00,0x00,/*"R",50*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x3E,0x42,0x42,0x40,0x20,0x18,0x04,0x02,0x42,0x42,0x7C,0x00,0x00,/*"S",51*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xFE,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,/*"T",52*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,/*"U",53*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xE7,0x42,0x42,0x44,0x24,0x24,0x28,0x28,0x18,0x10,0x10,0x00,0x00,/*"V",54*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xD6,0x92,0x92,0x92,0x92,0xAA,0xAA,0x6C,0x44,0x44,0x44,0x00,0x00,/*"W",55*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xE7,0x00,0x00,/*"X",56*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,/*"Y",57*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x7E,0x84,0x04,0x08,0x08,0x10,0x20,0x20,0x42,0x42,0xFC,0x00,0x00,/*"Z",58*/
/* (8 X 16 , 宋体 )*/

0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1E,0x00,/*"[",59*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x04,0x04,0x04,0x02,0x02,/*"\",60*/
/* (8 X 16 , 宋体 )*/

0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00,/*"]",61*/
/* (8 X 16 , 宋体 )*/

0x00,0x1C,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",62*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,/*"_",63*/
/* (8 X 16 , 宋体 )*/

0x00,0x60,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",64*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x1E,0x22,0x42,0x42,0x3F,0x00,0x00,/*"a",65*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x64,0x58,0x00,0x00,/*"b",66*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00,0x00,/*"c",67*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x06,0x02,0x02,0x02,0x1E,0x22,0x42,0x42,0x42,0x26,0x1B,0x00,0x00,/*"d",68*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x40,0x40,0x42,0x3C,0x00,0x00,/*"e",69*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x0F,0x11,0x10,0x10,0x7E,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*"f",70*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x44,0x44,0x38,0x40,0x3C,0x42,0x42,0x3C,/*"g",71*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"h",72*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*"i",73*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x78,/*"j",74*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x4E,0x48,0x50,0x68,0x48,0x44,0xEE,0x00,0x00,/*"k",75*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*"l",76*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x49,0x49,0x49,0x49,0x49,0xED,0x00,0x00,/*"m",77*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDC,0x62,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"n",78*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,/*"o",79*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x64,0x42,0x42,0x42,0x44,0x78,0x40,0xE0,/*"p",80*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x22,0x42,0x42,0x42,0x22,0x1E,0x02,0x07,/*"q",81*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x32,0x20,0x20,0x20,0x20,0xF8,0x00,0x00,/*"r",82*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x40,0x3C,0x02,0x42,0x7C,0x00,0x00,/*"s",83*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x10,0x10,0x10,0x0C,0x00,0x00,/*"t",84*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x42,0x42,0x42,0x42,0x46,0x3B,0x00,0x00,/*"u",85*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x28,0x10,0x10,0x00,0x00,/*"v",86*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0x92,0x92,0xAA,0xAA,0x44,0x44,0x00,0x00,/*"w",87*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x24,0x18,0x18,0x18,0x24,0x76,0x00,0x00,/*"x",88*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x28,0x18,0x10,0x10,0xE0,/*"y",89*/
/* (8 X 16 , 宋体 )*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x44,0x08,0x10,0x10,0x22,0x7E,0x00,0x00,/*"z",90*/
/* (8 X 16 , 宋体 )*/

0x00,0x03,0x04,0x04,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x00,/*"{",91*/
/* (8 X 16 , 宋体 )*/

0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,/*"|",92*/
/* (8 X 16 , 宋体 )*/

0x00,0x60,0x10,0x10,0x10,0x10,0x10,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x60,0x00,/*"}",93*/
/* (8 X 16 , 宋体 )*/

0x30,0x4C,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"~",94*/
/* (8 X 16 , 宋体 )*/

};

void Delay_ms(u16 ms)
{
	SysTick->CTRL &=~(1<<2);//选择时钟源为21MHZ
	SysTick->CTRL &=~(1<<1);//禁止滴答中断
	SysTick->LOAD = 21000*ms; //设置重装载寄存器的值
	SysTick->CTRL |= (1<<0);//使能滴答定时器
	while(!(SysTick->CTRL&(1<<16)));//阻塞判断定时时间是否到达,判断SysTick->CTRL的位
}

void Delay_us(u16 us)
{
	SysTick->CTRL &=~(1<<2);//选择时钟源为21MHZ
	SysTick->CTRL &=~(1<<1);//禁止滴答中断
	SysTick->LOAD = 21*us; //设置重装载寄存器的值
	SysTick->CTRL |= (1<<0);//使能滴答定时器
	while(!(SysTick->CTRL&(1<<16)));//阻塞判断定时时间是否到达,判断SysTick->CTRL的位
}

/******************** LCD引脚初始化函数 *******************
LCD显示屏硬件管脚对应关系:
数据线:
DB0---PD14	DB1---PD15	DB2---PD0	DB3---PD1
DB4---PE7	DB5---PE8	DB6---PE9	DB7---PE10
DB8---PE11	DB9---PE12	DB10---PE13	DB11---PE14
DB12---PE15	DB13---PD8	DB14---PD9	DB15---PD10
控制线:
WR---PD5	RD---PD4	CS---PG12	BL--PB15 ,DC --PF12
**********************************************************/
void LCD_PinInit(void)
{
	/* 使能LCD硬件管脚时钟 */
	RCC->AHB1ENR |= (1<<3);//开PD
	RCC->AHB1ENR |= (1<<4);//开PE
	RCC->AHB1ENR |= (1<<6);//开PG
	RCC->AHB1ENR |= (1<<1);//开PB
	RCC->AHB1ENR |= (1<<5);//开PF
	
	/* 设置LCD硬件管脚模式 */
	/* DB0~DB15数据线:推挽输出  时钟50M */
	GPIOD->MODER |=(0X1<<(2*14))|(0X1<<(2*15));   //配置成通用输出  
	GPIOD->OSPEEDR |=(0X2<<(2*14))|(0X2ul<<(2*15)); //配置成输出速率50M 		
	
	GPIOD->MODER |=(0X1<<(2*0))|(0X1<<(2*1));     //配置成通用输出  
	GPIOD->OSPEEDR |=(0X2<<(2*0))|(0X2<<(2*1));   //配置成输出速率50M
	
	GPIOE->MODER |=0x55554000;                    //配置成通用输出  
	GPIOE->OTYPER |= 0;                           //配置成输出推挽
	GPIOE->OSPEEDR |=0x55554000;                  //配置成输出速率50M

	GPIOD->MODER |=(0X1<<(2*8))|(0X1<<(2*9))|(0X1<<(2*10));  //配置成通用输出  
	GPIOD->OSPEEDR |=(0X2<<(2*1))|(0X2<<(2*1))|(0X2<<(2*1));   //配置成输出速率50M
	
	/* 控制线:推挽输出  时钟50M 空闲为高电平 */
	GPIOD->MODER |=(0X1<<(2*4))|(0X1<<(2*5));  //配置成通用输出  
	GPIOD->OSPEEDR |=(0X2<<(2*4))|(0X2<<(2*5));
	GPIOD->ODR |= (1<<4)|(1<<5);
	
	GPIOG->MODER |=(0X1<<(2*12));              //配置成通用输出  
	GPIOG->OSPEEDR |=(0X2<<(2*12));
	GPIOG->ODR |= (1<<12);

	GPIOF->MODER |=(0X1<<(2*12));              //配置成通用输出  
	GPIOF->OSPEEDR |=(0X2<<(2*12));
	GPIOF->ODR |= (1<<12);
	
	GPIOB->MODER |=(0X1<<(2*15));               //配置成通用输出  
	GPIOB->OSPEEDR |=(0X2ul<<(2*15));
	GPIOB->ODR &= ~(1<<15);     //关闭背光,在LCD初始化完后再打开
	
//	GPIO_InitTypeDef  GPIO_InitStructure;
//	//使能PD,PE,PF,PG时钟  
//	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|\
//												 RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);
//	
//	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|\
//															GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;
//  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
//	GPIO_InitStructure.GPIO_Speed=GPIO_Fast_Speed;
//  GPIO_Init(GPIOD, &GPIO_InitStructure);  
//	GPIO_SetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5);
//	
//	GPIO_InitStructure.GPIO_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;//PE7~15,AF OUT
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
//  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//  GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;
//  GPIO_Init(GPIOE, &GPIO_InitStructure);  
//	
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
//  GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;
//  GPIO_Init(GPIOG, &GPIO_InitStructure);
//	GPIO_SetBits(GPIOG,GPIO_Pin_12);
//	
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
//  GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;
//  GPIO_Init(GPIOF, &GPIO_InitStructure); 
//	GPIO_SetBits(GPIOF,GPIO_Pin_12);

//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
//	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
//	GPIO_Init(GPIOB, &GPIO_InitStructure);
//	GPIO_ResetBits(GPIOB,GPIO_Pin_15);
}
/******************* LCD写命令函数 *********************************
参数:需要输入的命令
********************************************************************/
void LCD_ILI9486_CMD(u16 common)
{
	GPIOG->ODR &= ~(1 << 12);    //CS拉低   PG12
	GPIOF->ODR &= ~(1 << 12);    //D/C拉低 PF12
	GPIOD->ODR &= ~(1 << 5);     //WR拉低   PD5
	//发送16位的命令,bit15~bit0  分别在DB15~DB0管脚进行输出	
	/* 输出命令数据,把命令发送到数据总线 */
	if(common&0x01)   GPIOD->BSRRL = (1<<14);    //DB0---PD14	
	else GPIOD->BSRRH = (1<<14); 
	if(common&0x02)   GPIOD->BSRRL = (1<<15);    //DB1---PD15	
	else GPIOD->BSRRH = (1<<15);
	if(common&0x04)   GPIOD->BSRRL = (1<<0);     //DB2---PD0	
	else GPIOD->BSRRH = (1<<0);
	if(common&0x08)   GPIOD->BSRRL = (1<<1);     //DB3---PD1
	else GPIOD->BSRRH = (1<<1);
	if(common&0x10)   GPIOE->BSRRL = (1<<7);     //DB4---PE7
	else GPIOE->BSRRH = (1<<7);
	if(common&0x20)   GPIOE->BSRRL = (1<<8);     //DB5---PE8	
	else GPIOE->BSRRH = (1<<8);
	if(common&0x40)   GPIOE->BSRRL = (1<<9);     //DB6---PE9
	else GPIOE->BSRRH = (1<<9);
	if(common&0x80)   GPIOE->BSRRL = (1<<10);   //DB7---PE10
	else GPIOE->BSRRH = (1<<10);
	if(common&0x0100) GPIOE->BSRRL = (1<<11); //DB8---PE11	
	else GPIOE->BSRRH = (1<<11);
	if(common&0x0200) GPIOE->BSRRL = (1<<12); //DB9---PE12
	else GPIOE->BSRRH = (1<<12);
	if(common&0x0400) GPIOE->BSRRL = (1<<13); //DB10---PE13
	else GPIOE->BSRRH = (1<<13);
	if(common&0x0800) GPIOE->BSRRL = (1<<14); //DB11---PE14
	else GPIOE->BSRRH = (1<<14);
	if(common&0x1000) GPIOE->BSRRL = (1<<15); //DB12---PE15	
	else GPIOE->BSRRH = (1<<15);
	if(common&0x2000) GPIOD->BSRRL = (1<<8);  //DB13---PD8
	else GPIOD->BSRRH = (1<<8);
	if(common&0x4000) GPIOD->BSRRL = (1<<9);  //DB14---PD9
	else GPIOD->BSRRH = (1<<9);
	if(common&0x8000) GPIOD->BSRRL = (1<<10); //DB15---PD10
	else GPIOD->BSRRH = (1<<10);
	GPIOD->ODR |= 1 << 5;        //WR拉高   PD5
	GPIOG->ODR |= 1 << 12;       //拉高CS    PG12
	
//	GPIO_ResetBits(GPIOG,GPIO_Pin_12);
//	GPIO_ResetBits(GPIOF,GPIO_Pin_12);
//	GPIO_ResetBits(GPIOD,GPIO_Pin_5);
//	if(common&0x01) GPIO_SetBits(GPIOD,GPIO_Pin_14);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_14);
//	if(common&0x02) GPIO_SetBits(GPIOD,GPIO_Pin_15);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_15);
//	if(common&0x04) GPIO_SetBits(GPIOD,GPIO_Pin_0);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_0);
//	if(common&0x08) GPIO_SetBits(GPIOD,GPIO_Pin_1);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_1);
//	if(common&0x10) GPIO_SetBits(GPIOE,GPIO_Pin_7);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_7);
//	if(common&0x20) GPIO_SetBits(GPIOE,GPIO_Pin_8);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_8);
//	if(common&0x40) GPIO_SetBits(GPIOE,GPIO_Pin_9);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_9);
//	if(common&0x80) GPIO_SetBits(GPIOE,GPIO_Pin_10);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_10);
//	if(common&0x0100) GPIO_SetBits(GPIOE,GPIO_Pin_11);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_11);
//	if(common&0x0200) GPIO_SetBits(GPIOE,GPIO_Pin_12);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_12);
//	if(common&0x0400) GPIO_SetBits(GPIOE,GPIO_Pin_13);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_13);
//	if(common&0x0800) GPIO_SetBits(GPIOE,GPIO_Pin_14);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_14);
//	if(common&0x1000) GPIO_SetBits(GPIOE,GPIO_Pin_15);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_15);
//	if(common&0x2000) GPIO_SetBits(GPIOD,GPIO_Pin_8);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_8);
//	if(common&0x4000) GPIO_SetBits(GPIOD,GPIO_Pin_9);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_9);
//	if(common&0x8000) GPIO_SetBits(GPIOD,GPIO_Pin_10);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_10);
//	GPIO_SetBits(GPIOD,GPIO_Pin_5);
//	GPIO_SetBits(GPIOG,GPIO_Pin_12);
}

/******************* LCD写数据函数 *********************************
参数:需要输输入待写到LCD屏的数据
********************************************************************/
void LCD_ILI9486_Parameter(u16 data)
{
	GPIOG->ODR &= ~(1 << 12);    //CS拉低
	GPIOF->ODR |= 1 << 12;       //D/C拉高
	GPIOD->ODR &= ~(1 << 5);     //WR拉低
	
	//发送16位的数据,bit15~bit0  分别在DB15~DB0管脚进行输出	
	/* 输出数据,把数据发送到数据总线 */
	if(data&0x01)   GPIOD->BSRRL = (1<<14); 
	else GPIOD->BSRRH = (1<<14);
	if(data&0x02)   GPIOD->BSRRL = (1<<15);
	else GPIOD->BSRRH = (1<<15);
	if(data&0x04)   GPIOD->BSRRL = (1<<0);  
	else GPIOD->BSRRH = (1<<0);
	if(data&0x08)   GPIOD->BSRRL = (1<<1);  
	else GPIOD->BSRRH = (1<<1);
	if(data&0x10)   GPIOE->BSRRL = (1<<7);  
	else GPIOE->BSRRH = (1<<7);
	if(data&0x20)   GPIOE->BSRRL = (1<<8);  
	else GPIOE->BSRRH = (1<<8);
	if(data&0x40)   GPIOE->BSRRL = (1<<9);  
	else GPIOE->BSRRH = (1<<9);
	if(data&0x80)   GPIOE->BSRRL = (1<<10); 
	else GPIOE->BSRRH = (1<<10);
	if(data&0x0100) GPIOE->BSRRL = (1<<11); 
	else GPIOE->BSRRH = (1<<11);
	if(data&0x0200) GPIOE->BSRRL = (1<<12); 
	else GPIOE->BSRRH = (1<<12);
	if(data&0x0400) GPIOE->BSRRL = (1<<13); 
	else GPIOE->BSRRH = (1<<13);
	if(data&0x0800) GPIOE->BSRRL = (1<<14); 
	else GPIOE->BSRRH = (1<<14);
	if(data&0x1000) GPIOE->BSRRL = (1<<15); 
	else GPIOE->BSRRH = (1<<15);
	if(data&0x2000) GPIOD->BSRRL = (1<<8);  
	else GPIOD->BSRRH = (1<<8);
	if(data&0x4000) GPIOD->BSRRL = (1<<9);  
	else GPIOD->BSRRH = (1<<9);
	if(data&0x8000) GPIOD->BSRRL = (1<<10); 
	else GPIOD->BSRRH = (1<<10);

	GPIOD->ODR |= 1 << 5;        //WR拉高
	GPIOG->ODR |= 1 << 12;       //拉高CS

//	GPIO_ResetBits(GPIOG,GPIO_Pin_12);
//	GPIO_SetBits(GPIOF,GPIO_Pin_12);
//	GPIO_ResetBits(GPIOD,GPIO_Pin_5);
//	//发送 16 位数据
//	if(data&0x01) GPIO_SetBits(GPIOD,GPIO_Pin_14);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_14);
//	if(data&0x02) GPIO_SetBits(GPIOD,GPIO_Pin_15);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_15);
//	if(data&0x04) GPIO_SetBits(GPIOD,GPIO_Pin_0);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_0);
//	if(data&0x08) GPIO_SetBits(GPIOD,GPIO_Pin_1);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_1);
//	if(data&0x10) GPIO_SetBits(GPIOE,GPIO_Pin_7);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_7);
//	if(data&0x20) GPIO_SetBits(GPIOE,GPIO_Pin_8);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_8);
//	if(data&0x40) GPIO_SetBits(GPIOE,GPIO_Pin_9);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_9);
//	if(data&0x80) GPIO_SetBits(GPIOE,GPIO_Pin_10);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_10);
//	if(data&0x0100) GPIO_SetBits(GPIOE,GPIO_Pin_11);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_11);
//	if(data&0x0200) GPIO_SetBits(GPIOE,GPIO_Pin_12);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_12);
//	if(data&0x0400) GPIO_SetBits(GPIOE,GPIO_Pin_13);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_13);
//	if(data&0x0800) GPIO_SetBits(GPIOE,GPIO_Pin_14);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_14);
//	if(data&0x1000) GPIO_SetBits(GPIOE,GPIO_Pin_15);
//	else GPIO_ResetBits(GPIOE,GPIO_Pin_15);
//	if(data&0x2000) GPIO_SetBits(GPIOD,GPIO_Pin_8);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_8);
//	if(data&0x4000) GPIO_SetBits(GPIOD,GPIO_Pin_9);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_9);
//	if(data&0x8000) GPIO_SetBits(GPIOD,GPIO_Pin_10);
//	else GPIO_ResetBits(GPIOD,GPIO_Pin_10);
//	GPIO_SetBits(GPIOD,GPIO_Pin_5);
//	GPIO_SetBits(GPIOG,GPIO_Pin_12);
}
//以某个颜色清除整个LCD屏
void LCD_ClearTotalLCD(u16 color)
{
	u32 i;
	LCD_ILI9486_CMD(0x2A);           //设置列地址
	LCD_ILI9486_Parameter(0>>8);      
	LCD_ILI9486_Parameter(0&(0xFF));
	LCD_ILI9486_Parameter(319>>8);      
	LCD_ILI9486_Parameter(319&(0xFF));
	
	LCD_ILI9486_CMD(0x2B);          //设置行地址
	LCD_ILI9486_Parameter(0>>8);      
	LCD_ILI9486_Parameter(0&(0xFF));
	LCD_ILI9486_Parameter(479>>8);      
	LCD_ILI9486_Parameter(479&(0xFF));
	
	
	LCD_ILI9486_CMD(0x2C);         //写显存的命令
	for(i=0;i<(320*480);i++)
	{
		LCD_ILI9486_Parameter(color); 
	}
}
//以某个颜色填充一个LCD矩形
void LCD_FillRectangle(u16 Xstart,u16 Ystart,u16 Xend,u16 Yend,u16 color)
{
	u32 i;
	LCD_ILI9486_CMD(0x2A);           //设置列地址
	LCD_ILI9486_Parameter(Xstart>>8);      
	LCD_ILI9486_Parameter(Xstart&(0xFF));
	LCD_ILI9486_Parameter(Xend>>8);      
	LCD_ILI9486_Parameter(Xend&(0xFF));
	
	LCD_ILI9486_CMD(0x2B);          //设置行地址
	LCD_ILI9486_Parameter(Ystart>>8);      
	LCD_ILI9486_Parameter(Ystart&(0xFF));
	LCD_ILI9486_Parameter(Yend>>8);      
	LCD_ILI9486_Parameter(Yend&(0xFF));
	
	
	LCD_ILI9486_CMD(0x2C);         //写显存的命令
	for(i=0;i<((Xend-Xstart)*(Yend-Ystart));i++)
	{
		LCD_ILI9486_Parameter(color); 
	}
}
//在某个窗口显示一张图片
void LCD_ShowPicture(u16 Xstart,u16 Ystart,u16 Xend,u16 Yend,u8 *pColorData)
{
	u32 i;
	LCD_ILI9486_CMD(0x2A);           //设置列地址
	LCD_ILI9486_Parameter(Xstart>>8);      
	LCD_ILI9486_Parameter(Xstart&(0xFF));
	LCD_ILI9486_Parameter(Xend>>8);      
	LCD_ILI9486_Parameter(Xend&(0xFF));
	
	LCD_ILI9486_CMD(0x2B);          //设置行地址
	LCD_ILI9486_Parameter(Ystart>>8);      
	LCD_ILI9486_Parameter(Ystart&(0xFF));
	LCD_ILI9486_Parameter(Yend>>8);      
	LCD_ILI9486_Parameter(Yend&(0xFF));
	
	
	LCD_ILI9486_CMD(0x2C);         //写显存的命令
	for(i=0;i<((Xend-Xstart)*(Yend-Ystart));i++)
	{
		LCD_ILI9486_Parameter((*pColorData)<<8|(*(pColorData+1))); 
		pColorData+= 2;  //地址偏移2
	}
}
//x、y字符的一个字符的左上角的坐标
//fontSize : 字体大小:16表示 16*16的字体,32表示32*32的字体,64表示64*64的字体,
void LCD_ShowChinese(u16 x,u16 y,u8 fontSize,u16 pointColor,u16 backColor,u8 *pChineseData)
{
	u32 i;
	u8 j =0;
	LCD_ILI9486_CMD(0x2A);           //设置列地址的起始地址
	LCD_ILI9486_Parameter(x>>8);      
	LCD_ILI9486_Parameter(x&(0xFF));
	/**根据字体的大小来设置列地址的结束地址**/
	if(fontSize==16)  
	{
		LCD_ILI9486_Parameter((x+fontSize-1)>>8);      
		LCD_ILI9486_Parameter((x+fontSize-1)&(0xFF));
	}
	if(fontSize==32)
	{
		LCD_ILI9486_Parameter((x+fontSize-1)>>8);      
		LCD_ILI9486_Parameter((x+fontSize-1)&(0xFF));
	}
	if(fontSize==64)
	{
		LCD_ILI9486_Parameter((x+fontSize-1)>>8);      
		LCD_ILI9486_Parameter((x+fontSize-1)&(0xFF));
	}
	/*****************************************************/
	LCD_ILI9486_CMD(0x2B);          //设置行地址的起始地址
	LCD_ILI9486_Parameter(y>>8);      
	LCD_ILI9486_Parameter(y&(0xFF));
	/**根据字体的大小来设置行地址的结束地址**/
	if(fontSize==16)  
	{
		LCD_ILI9486_Parameter((y+fontSize-1)>>8);      
		LCD_ILI9486_Parameter((y+fontSize-1)&(0xFF));
	}
	if(fontSize==32)  
	{
		LCD_ILI9486_Parameter((y+fontSize-1)>>8);      
		LCD_ILI9486_Parameter((y+fontSize-1)&(0xFF));
	}
	if(fontSize==64)  
	{
		LCD_ILI9486_Parameter((y+fontSize-1)>>8);      
		LCD_ILI9486_Parameter((y+fontSize-1)&(0xFF));
	}	
	
	
	LCD_ILI9486_CMD(0x2C);         //写显存的命令
	for(i=0;i<(fontSize*fontSize);i++)
	{
		
		if((*pChineseData)&(1<<(7-j)))
		{
			LCD_ILI9486_Parameter(pointColor); 
		}
		else
		{
			LCD_ILI9486_Parameter(backColor); 
		}
		j = j + 1;
		if(j == 8)
		{
			j = 0;
			pChineseData++;
		}
	}
}

//x、y字符的一个字符的左上角的坐标
//fontSize : 字体大小:16表示 宽8*高16的字体,32表示宽16*高32的字体,64表示宽32*高64的字体,
void LCD_ShowChar(u16 x,u16 y,u8 fontSize,u16 pointColor,u16 backColor,u8 *pCharData)
{
	u32 i;
	u8 j =0;
	LCD_ILI9486_CMD(0x2A);           //设置列地址的起始地址
	LCD_ILI9486_Parameter(x>>8);      
	LCD_ILI9486_Parameter(x&(0xFF));
	/**根据字体的大小来设置列地址的结束地址**/
	if(fontSize==16)  
	{
		LCD_ILI9486_Parameter((x+7)>>8);      
		LCD_ILI9486_Parameter((x+7)&(0xFF));
	}
	if(fontSize==32)
	{
		LCD_ILI9486_Parameter((x+15)>>8);      
		LCD_ILI9486_Parameter((x+15)&(0xFF));
	}
	if(fontSize==64)
	{
		LCD_ILI9486_Parameter((x+31)>>8);      
		LCD_ILI9486_Parameter((x+31)&(0xFF));
	}
	/*****************************************************/
	LCD_ILI9486_CMD(0x2B);          //设置行地址的起始地址
	LCD_ILI9486_Parameter(y>>8);      
	LCD_ILI9486_Parameter(y&(0xFF));
	/**根据字体的大小来设置行地址的结束地址**/
	if(fontSize==16)  
	{
		LCD_ILI9486_Parameter((y+fontSize-1)>>8);      
		LCD_ILI9486_Parameter((y+fontSize-1)&(0xFF));
	}
	if(fontSize==32)  
	{
		LCD_ILI9486_Parameter((y+fontSize-1)>>8);      
		LCD_ILI9486_Parameter((y+fontSize-1)&(0xFF));
	}
	if(fontSize==64)  
	{
		LCD_ILI9486_Parameter((y+fontSize-1)>>8);      
		LCD_ILI9486_Parameter((y+fontSize-1)&(0xFF));
	}	
	
	
	LCD_ILI9486_CMD(0x2C);         //写显存的命令
	for(i=0;i<((fontSize/2)*fontSize);i++)
	{
		
		if((*pCharData)&(1<<(7-j)))
		{
			LCD_ILI9486_Parameter(pointColor); 
		}
		else
		{
			LCD_ILI9486_Parameter(backColor); 
		}
		j = j + 1;
		if(j == 8)
		{
			j = 0;
			pCharData++;
		}
	}
}


void LCD_ShowString(u16 x,u16 y,u8 fontSize,u16 pointColor,u16 backColor,u8*pStr)
{
	u8 offSet;
	while(*pStr != '\0')
	{
		offSet = *pStr - ' ';  //求得偏移 ,等效于 offSet = *pStr - 32; 
		LCD_ShowChar(x,y,fontSize,pointColor,backColor,(u8*)&anscii_8_16[offSet*16]);
		x+=8; //x轴坐标偏移
		pStr++;
	}
}

void LCD_ShowPoint(u16 x,u16 y,u16 color)
{
	//2A  确定横坐标 x的范围
	LCD_ILI9486_CMD(0X2a); 
	LCD_ILI9486_Parameter (x>>8);//起始横坐标
	LCD_ILI9486_Parameter (x);
	LCD_ILI9486_Parameter (x>>8);//终止横坐标
	LCD_ILI9486_Parameter (x);
	
	//2b  确定纵坐标 y的范围
	LCD_ILI9486_CMD(0X2b); 
	LCD_ILI9486_Parameter (y>>8);//起始纵坐标
	LCD_ILI9486_Parameter (y);
	LCD_ILI9486_Parameter (y>>8);//终止纵坐标
	LCD_ILI9486_Parameter (y);
	
	//2c 填充颜色
	LCD_ILI9486_CMD(0X2c);
	LCD_ILI9486_Parameter (color);
	
}

//显示十字
void LCD_ShowCross(u16 x, u16 y, u16 color)
{
	u16 i;
	for(i=x-10; i<x+10; i++)
	{
		LCD_ShowPoint(i, y, color);
	}
	for(i=y-10; i<y+10; i++)
	{
		LCD_ShowPoint( x,i, color);
	}
}
/********************** 
LCD初始化函数 
***********************/
void LCD_Init(void)
{
	LCD_PinInit();
	//************* Reset LCD Driver ****************//
	Delay_ms(120); // Delay 120 ms
	//************* Start Initial Sequence **********//
	LCD_ILI9486_CMD(0x01);          //软件复位
	LCD_ILI9486_CMD(0x13);          //开启正常模式
	LCD_ILI9486_CMD(0xB4); 
  LCD_ILI9486_Parameter(0x00);	
	LCD_ILI9486_CMD(0XF2);
	LCD_ILI9486_Parameter(0x18);
	LCD_ILI9486_Parameter(0xA3);
	LCD_ILI9486_Parameter(0x12);
	LCD_ILI9486_Parameter(0x02);
	LCD_ILI9486_Parameter(0XB2);
	LCD_ILI9486_Parameter(0x12);
	LCD_ILI9486_Parameter(0xFF);
	LCD_ILI9486_Parameter(0x10);
	LCD_ILI9486_Parameter(0x00);
	LCD_ILI9486_CMD(0XF8);
	LCD_ILI9486_Parameter(0x21);
	LCD_ILI9486_Parameter(0x04);
	LCD_ILI9486_CMD(0XF9);
	LCD_ILI9486_Parameter(0x00);
	LCD_ILI9486_Parameter(0x08);

	LCD_ILI9486_CMD(0x3A);
	LCD_ILI9486_Parameter(0x05);   //设置16位BPP
	LCD_ILI9486_CMD(0xB4);
	LCD_ILI9486_Parameter(0x01);//0x00
	LCD_ILI9486_CMD(0xB6);
	LCD_ILI9486_Parameter(0x02);
	LCD_ILI9486_Parameter(0x22);
	LCD_ILI9486_CMD(0xC1);
	LCD_ILI9486_Parameter(0x41);
	LCD_ILI9486_CMD(0xC5);
	LCD_ILI9486_Parameter(0x00);
	LCD_ILI9486_Parameter(0x07);//0X18
	LCD_ILI9486_CMD(0xE0);
	LCD_ILI9486_Parameter(0x0F);
	LCD_ILI9486_Parameter(0x1F);
	LCD_ILI9486_Parameter(0x1C);
	LCD_ILI9486_Parameter(0x0C);
	LCD_ILI9486_Parameter(0x0F);
	LCD_ILI9486_Parameter(0x08);
	LCD_ILI9486_Parameter(0x48);
	LCD_ILI9486_Parameter(0x98);
	LCD_ILI9486_Parameter(0x37);
	LCD_ILI9486_Parameter(0x0A);
	LCD_ILI9486_Parameter(0x13);
	LCD_ILI9486_Parameter(0x04);
	LCD_ILI9486_Parameter(0x11);
	LCD_ILI9486_Parameter(0x0D);
	LCD_ILI9486_Parameter(0x00);
	LCD_ILI9486_CMD(0xE1);
	LCD_ILI9486_Parameter(0x0F);
	LCD_ILI9486_Parameter(0x32);
	LCD_ILI9486_Parameter(0x2E);
	LCD_ILI9486_Parameter(0x0B);
	LCD_ILI9486_Parameter(0x0D);
	LCD_ILI9486_Parameter(0x05);
	LCD_ILI9486_Parameter(0x47);
	LCD_ILI9486_Parameter(0x75);
	LCD_ILI9486_Parameter(0x37);
	LCD_ILI9486_Parameter(0x06);
	LCD_ILI9486_Parameter(0x10);
	LCD_ILI9486_Parameter(0x03);
	LCD_ILI9486_Parameter(0x24);
	LCD_ILI9486_Parameter(0x20);
	LCD_ILI9486_Parameter(0x00);
	LCD_ILI9486_CMD(0x11);   //退出睡眠
	LCD_ILI9486_CMD(0x36);
//	LCD_ILI9486_Parameter(0x08);   //设置RGB,含排线的屏
	LCD_ILI9486_Parameter(0x00);   //设置RGB,不含排线的屏
	LCD_ILI9486_CMD(0x36);
//	LCD_ILI9486_Parameter(0x08);   //设置RGB,含排线的屏
	LCD_ILI9486_Parameter(0x00);   //设置RGB,不含排线的屏
	LCD_ILI9486_CMD(0x36);
//	LCD_ILI9486_Parameter(0x08);   //设置RGB,含排线的屏
	LCD_ILI9486_Parameter(0x00);   //设置RGB,不含排线的屏
	Delay_ms(120);
	LCD_ILI9486_CMD(0x29);   //开启显示
	
	/* 以下由用户按实际编写 */
	LCD_ILI9486_CMD(0x20);          //关闭颜色反转
	LCD_ILI9486_CMD(0x3A);          //发送命令设置液晶屏颜色位深
	LCD_ILI9486_Parameter(0x05);    //设置颜色位深16BPP
	LCD_ILI9486_CMD(0x36);          //发送命令设置LCD扫描方向
	LCD_ILI9486_Parameter(0x08);
	//LCD_Clear(0,319,0,479,RED);  //清屏
	GPIOB->ODR |= 1 << 15;          //开LCD背光灯
	
//	GPIO_SetBits(GPIOB,GPIO_Pin_15);          //开LCD背光灯
}
void  LCD_Show(void)
{
	LCD_ClearTotalLCD(RED);
	LCD_FillRectangle(0,0,319,240,BLUE);
  LCD_ShowChinese(250,10,16,RED,WHITE,(u8 *)chinese_1);
	LCD_ShowChinese(250,30,32,RED,WHITE,(u8 *)chinese_2);
	LCD_ShowChinese(250,70,64,RED,WHITE,(u8 *)chinese_3);
	LCD_ShowString(10,10,16,RED,WHITE,"I believe I can fly");
	LCD_ShowString(10,30,16,RED,WHITE,"I believe I touch the Sky");
}
int main(void)
{
	LCD_Init();
	LCD_Show();
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值