一、模块来源
采购链接: 1.47寸lcd显示屏高清ips172x320 st7789驱动液晶屏高清液晶显示屏
资料下载链接: https://pan.baidu.com/s/15OWpndYzyW8kFPqmfKNfxQ
资料提取码:8888
二、规格参数
工作电压:3.3V
工作电流:90MA
模块尺寸:30(H) x 37(V) MM
像素大小:172(H) x 320(V)RGB
驱动芯片:ST7789V3
通信协议:SPI
管脚数量:8 Pin(2.54mm间距排针)
以上信息见厂家资料文件
三、移植过程
我们的目标是将例程移植至开发板上。按照以下步骤,即可完成移植。
- 将源码导入工程;
- 根据编译报错处进行粗改;
- 修改引脚配置;
- 修改时序配置;
- 移植验证。
1、查看资料
打开厂家资料例程(例程下载见百度网盘链接下载)。具体路径见例程路径
2、移植至工程
将厂家资料路径下的【LCD】文件夹,复制到自己的工程中。
工程模板参考:模块移植工程模板的创建🚀
我们打开工程(如果没有显示相关的文件夹,请右键点击Refresh
)
添加头文件到工程中:
右键项目
3、引脚选择
该屏幕需要设置8个接口,具体接口说明见 各引脚说明。
模块为SPI通信协议的从机,SCL为SPI信号线(SCK),SDA为SPI输出线(MOSI),CS为SPI片选线(NSS)。 如果MCU的GPIO引脚不足,可以将屏幕的两个引脚接口不接入MCU的GPIO。
- 将RES接入MCU的复位引脚,当MCU复位时,屏幕也跟着复位;
- 可以将BLK接入3.3V或悬空,代价是无法控制背光亮度。
硬件SPI移植
GND | GND |
VCC | 3V3 |
SCL | PA11 |
SDA | PA9 |
RES | PA7 |
DC | PA6 |
CS | PB11 |
BLK | PB12 |
修改头文件配置:
- 将所有的
#include "sys.h"
改为#include "systick.h"
- 在
.h
文件中添加下面的定义:
#ifndef u8
#define u8 uint8_t
#endif
#ifndef u16
#define u16 uint16_t
#endif
#ifndef u32
#define u32 uint32_t
#endif
2
3
4
5
6
7
8
9
10
11
选择好引脚后,进入工程开始编写屏幕引脚初始化代码。
我们更改 lcd_init.h
中的 LCD
端口定义
#ifndef u8
#define u8 uint8_t
#endif
#ifndef u16
#define u16 uint16_t
#endif
#ifndef u32
#define u32 uint32_t
#endif
//-----------------LCD端口定义----------------
#define LCD_RCU_ENABLE() rcu_periph_clock_enable(RCU_GPIOA); \
rcu_periph_clock_enable(RCU_GPIOB); \
rcu_periph_clock_enable(RCU_SPI);
#define LCD_SCL_PORT GPIOA
#define LCD_SCL_PIN GPIO_PIN_11
#define LCD_SCL_AF GPIO_AF_0
#define LCD_SDA_PORT GPIOA
#define LCD_SDA_PIN GPIO_PIN_9
#define LCD_SDA_AF GPIO_AF_0
#define LCD_RES_PORT GPIOA
#define LCD_RES_PIN GPIO_PIN_7
#define LCD_DC_PORT GPIOA
#define LCD_DC_PIN GPIO_PIN_6
#define LCD_CS_PORT GPIOB
#define LCD_CS_PIN GPIO_PIN_11
#define LCD_BLK_PORT GPIOB
#define LCD_BLK_PIN GPIO_PIN_12
/* LCD信号控制宏定义 */
#define LCD_RES_Clr() gpio_bit_write(LCD_RES_PORT,LCD_RES_PIN, 0)//RES
#define LCD_RES_Set() gpio_bit_write(LCD_RES_PORT,LCD_RES_PIN, 1)
#define LCD_DC_Clr() gpio_bit_write(LCD_DC_PORT,LCD_DC_PIN, 0)//DC
#define LCD_DC_Set() gpio_bit_write(LCD_DC_PORT,LCD_DC_PIN, 1)
#define LCD_CS_Clr() gpio_bit_write(LCD_CS_PORT,LCD_CS_PIN, 0)//CS
#define LCD_CS_Set() gpio_bit_write(LCD_CS_PORT,LCD_CS_PIN, 1)
#define LCD_BLK_Clr() gpio_bit_write(LCD_BLK_PORT,LCD_BLK_PIN, 0)//BLK
#define LCD_BLK_Set() gpio_bit_write(LCD_BLK_PORT,LCD_BLK_PIN, 1)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
引脚初始化函数见如下代码
#ifndef delay_ms
#define delay_ms(x) delay_1ms(x)
#endif
#ifndef delay_us
#define delay_us(x) delay_1us(x)
#endif
void LCD_GPIO_Init(void)
{
//使能时钟
LCD_RCU_ENABLE();
//引脚复用
gpio_af_set(LCD_SCL_PORT, LCD_SCL_AF, LCD_SCL_PIN);
gpio_af_set(LCD_SDA_PORT, LCD_SDA_AF, LCD_SDA_PIN);
//引脚模式
gpio_mode_set(LCD_SCL_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, LCD_SCL_PIN);
gpio_mode_set(LCD_SDA_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, LCD_SDA_PIN);
gpio_mode_set(LCD_RES_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, LCD_RES_PIN);
gpio_mode_set(LCD_DC_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, LCD_DC_PIN);
gpio_mode_set(LCD_CS_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, LCD_CS_PIN);
gpio_mode_set(LCD_BLK_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, LCD_BLK_PIN);
//输出模式
gpio_output_options_set(LCD_SCL_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_SCL_PIN);
gpio_output_options_set(LCD_SDA_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_SDA_PIN);
gpio_output_options_set(LCD_RES_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_RES_PIN);
gpio_output_options_set(LCD_DC_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_DC_PIN);
gpio_output_options_set(LCD_CS_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_CS_PIN);
gpio_output_options_set(LCD_BLK_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_BLK_PIN);
LCD_CS_Set(); //片选高
LCD_DC_Set(); //数据/命令高
//SPI参数定义结构体
spi_parameter_struct spi_init_struct;
/* 配置 SPI 参数 */
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; // 传输模式全双工
spi_init_struct.device_mode = SPI_MASTER; // 配置为主机
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; // 8位数据
spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
spi_init_struct.nss = SPI_NSS_SOFT; // 软件cs
spi_init_struct.prescale = SPI_PSC_4;//4分频
spi_init_struct.endian = SPI_ENDIAN_MSB;//高位在前
//将参数填入SPI
spi_init(&spi_init_struct);
/* 使能 SPI */
spi_enable();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
将 lcd_init.c
中的 LCD_Writ_Bus
函数替换成下面的代码:
/******************************************************************************
函数说明:LCD串行数据写入函数
入口数据:dat 要写入的串行数据
返回值: 无
******************************************************************************/
void LCD_Writ_Bus(u8 dat)
{
uint8_t recv_data = 0;
LCD_CS_Clr();
//等待发送缓冲区为空
while(RESET == spi_flag_get(SPI_FLAG_TBE) );
//通过SPI发送一个字节数据
spi_data_transmit(dat);
//等待接收缓冲区不空标志
while(RESET == spi_flag_get(SPI_FLAG_RBNE) );
recv_data = spi_data_receive();
LCD_CS_Set();
return recv_data;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
打开 lcd.c
文件将 LCD_ShowChinese
函数中的 s+=2
改为 s+=3
:
打开 lcdfont.c
文件将 typFNT_GB12
、typFNT_GB16
、typFNT_GB24
、typFNT_GB32
、 结构体中的 Index[2]
改为 Index[3]
例如:
到这里就移植完成了,可以进行移植验证。
四、关键代码
#ifndef __LCD_INIT_H
#define __LCD_INIT_H
#include "gd32vw55x.h"
#define USE_HORIZONTAL 2 //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏
#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
#define LCD_W 172
#define LCD_H 320
#else
#define LCD_W 320
#define LCD_H 172
#endif
#ifndef u8
#define u8 uint8_t
#endif
#ifndef u16
#define u16 uint16_t
#endif
#ifndef u32
#define u32 uint32_t
#endif
//-----------------LCD端口定义----------------
#define LCD_RCU_ENABLE() rcu_periph_clock_enable(RCU_GPIOA); \
rcu_periph_clock_enable(RCU_GPIOB); \
rcu_periph_clock_enable(RCU_SPI);
#define LCD_SCL_PORT GPIOA
#define LCD_SCL_PIN GPIO_PIN_11
#define LCD_SCL_AF GPIO_AF_0
#define LCD_SDA_PORT GPIOA
#define LCD_SDA_PIN GPIO_PIN_9
#define LCD_SDA_AF GPIO_AF_0
#define LCD_RES_PORT GPIOA
#define LCD_RES_PIN GPIO_PIN_7
#define LCD_DC_PORT GPIOA
#define LCD_DC_PIN GPIO_PIN_6
#define LCD_CS_PORT GPIOB
#define LCD_CS_PIN GPIO_PIN_11
#define LCD_BLK_PORT GPIOB
#define LCD_BLK_PIN GPIO_PIN_12
/* LCD信号控制宏定义 */
#define LCD_RES_Clr() gpio_bit_write(LCD_RES_PORT,LCD_RES_PIN, 0)//RES
#define LCD_RES_Set() gpio_bit_write(LCD_RES_PORT,LCD_RES_PIN, 1)
#define LCD_DC_Clr() gpio_bit_write(LCD_DC_PORT,LCD_DC_PIN, 0)//DC
#define LCD_DC_Set() gpio_bit_write(LCD_DC_PORT,LCD_DC_PIN, 1)
#define LCD_CS_Clr() gpio_bit_write(LCD_CS_PORT,LCD_CS_PIN, 0)//CS
#define LCD_CS_Set() gpio_bit_write(LCD_CS_PORT,LCD_CS_PIN, 1)
#define LCD_BLK_Clr() gpio_bit_write(LCD_BLK_PORT,LCD_BLK_PIN, 0)//BLK
#define LCD_BLK_Set() gpio_bit_write(LCD_BLK_PORT,LCD_BLK_PIN, 1)
void LCD_GPIO_Init(void);//初始化GPIO
void LCD_Writ_Bus(u8 dat);//模拟SPI时序
void LCD_WR_DATA8(u8 dat);//写入一个字节
void LCD_WR_DATA(u16 dat);//写入两个字节
void LCD_WR_REG(u8 dat);//写入一个指令
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);//设置坐标函数
void LCD_Init(void);//LCD初始化
#endif
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "lcd_init.h"
#include "systick.h"
#ifndef delay_ms
#define delay_ms(x) delay_1ms(x)
#endif
#ifndef delay_us
#define delay_us(x) delay_1us(x)
#endif
void LCD_GPIO_Init(void)
{
//使能时钟
LCD_RCU_ENABLE();
//引脚复用
gpio_af_set(LCD_SCL_PORT, LCD_SCL_AF, LCD_SCL_PIN);
gpio_af_set(LCD_SDA_PORT, LCD_SDA_AF, LCD_SDA_PIN);
//引脚模式
gpio_mode_set(LCD_SCL_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, LCD_SCL_PIN);
gpio_mode_set(LCD_SDA_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, LCD_SDA_PIN);
gpio_mode_set(LCD_RES_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, LCD_RES_PIN);
gpio_mode_set(LCD_DC_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, LCD_DC_PIN);
gpio_mode_set(LCD_CS_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, LCD_CS_PIN);
gpio_mode_set(LCD_BLK_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, LCD_BLK_PIN);
//输出模式
gpio_output_options_set(LCD_SCL_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_SCL_PIN);
gpio_output_options_set(LCD_SDA_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_SDA_PIN);
gpio_output_options_set(LCD_RES_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_RES_PIN);
gpio_output_options_set(LCD_DC_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_DC_PIN);
gpio_output_options_set(LCD_CS_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_CS_PIN);
gpio_output_options_set(LCD_BLK_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, LCD_BLK_PIN);
LCD_CS_Set(); //片选高
LCD_DC_Set(); //数据/命令高
//SPI参数定义结构体
spi_parameter_struct spi_init_struct;
/* 配置 SPI 参数 */
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; // 传输模式全双工
spi_init_struct.device_mode = SPI_MASTER; // 配置为主机
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; // 8位数据
spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
spi_init_struct.nss = SPI_NSS_SOFT; // 软件cs
spi_init_struct.prescale = SPI_PSC_4;//4分频
spi_init_struct.endian = SPI_ENDIAN_MSB;//高位在前
//将参数填入SPI
spi_init(&spi_init_struct);
/* 使能 SPI */
spi_enable();
}
/******************************************************************************
函数说明:LCD串行数据写入函数
入口数据:dat 要写入的串行数据
返回值: 无
******************************************************************************/
void LCD_Writ_Bus(u8 dat)
{
uint8_t recv_data = 0;
LCD_CS_Clr();
//等待发送缓冲区为空
while(RESET == spi_flag_get(SPI_FLAG_TBE) );
//通过SPI发送一个字节数据
spi_data_transmit(dat);
//等待接收缓冲区不空标志
while(RESET == spi_flag_get(SPI_FLAG_RBNE) );
recv_data = spi_data_receive();
LCD_CS_Set();
return recv_data;
}
/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
LCD_Writ_Bus(dat);
}
/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
LCD_Writ_Bus(dat>>8);
LCD_Writ_Bus(dat);
}
/******************************************************************************
函数说明:LCD写入命令
入口数据:dat 写入的命令
返回值: 无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
LCD_DC_Clr();//写命令
LCD_Writ_Bus(dat);
LCD_DC_Set();//写数据
}
/******************************************************************************
函数说明:设置起始和结束地址
入口数据:x1,x2 设置列的起始和结束地址
y1,y2 设置行的起始和结束地址
返回值: 无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
if(USE_HORIZONTAL==0)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+34);
LCD_WR_DATA(x2+34);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==1)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+34);
LCD_WR_DATA(x2+34);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==2)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+34);
LCD_WR_DATA(y2+34);
LCD_WR_REG(0x2c);//储存器写
}
else
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+34);
LCD_WR_DATA(y2+34);
LCD_WR_REG(0x2c);//储存器写
}
}
void LCD_Init(void)
{
LCD_GPIO_Init();//初始化GPIO
LCD_RES_Clr();//复位
delay_ms(30);
LCD_RES_Set();
delay_ms(100);
LCD_BLK_Set();//打开背光
delay_ms(100);
//
LCD_WR_REG(0x11);
// delay_ms(120);
LCD_WR_REG(0x36);
if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
else LCD_WR_DATA8(0xA0);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x13);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xD6);
LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3E);
LCD_WR_DATA8(0x38);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x30);
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3E);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x32);
// LCD_WR_REG(0x2A);
// LCD_WR_DATA8(0x00);
// LCD_WR_DATA8(0x22);
// LCD_WR_DATA8(0x00);
// LCD_WR_DATA8(0xCD);
// LCD_WR_DATA8(0x2B);
// LCD_WR_DATA8(0x00);
// LCD_WR_DATA8(0x00);
// LCD_WR_DATA8(0x01);
// LCD_WR_DATA8(0x3F);
// LCD_WR_REG(0x2C);
LCD_WR_REG(0x21);
LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x29);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
#ifndef __LCD_H
#define __LCD_H
#include "gd32vw55x.h"
#ifndef u8
#define u8 uint8_t
#endif
#ifndef u16
#define u16 uint16_t
#endif
#ifndef u32
#define u32 uint32_t
#endif
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);//指定区域填充颜色
void LCD_DrawPoint(u16 x,u16 y,u16 color);//在指定位置画一个点
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);//在指定位置画一条线
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//在指定位置画一个矩形
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);//在指定位置画一个圆
void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示汉字串
void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示单个12x12汉字
void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示单个16x16汉字
void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示单个24x24汉字
void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//显示单个32x32汉字
void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode);//显示一个字符
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode);//显示字符串
u32 mypow(u8 m,u8 n);//求幂
void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey);//显示整数变量
void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey);//显示两位小数变量
void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[]);//显示图片
//画笔颜色
#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 //灰色
#define DARKBLUE 0X01CF //深蓝色
#define LIGHTBLUE 0X7D7C //浅蓝色
#define GRAYBLUE 0X5458 //灰蓝色
#define LIGHTGREEN 0X841F //浅绿色
#define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)
#endif
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
五、移植验证
在 src\main.c
中输入代码如下:
#include "gd32vw55x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32vw553h_eval.h"
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"
/*!
\brief toggle the led every 500ms
\param[in] none
\param[out] none
\retval none
*/
void led_spark(void)
{
static __IO uint32_t timingdelaylocal = 0U;
if(timingdelaylocal) {
if(timingdelaylocal < 500U) {
gd_eval_led_on(LED1);
} else {
gd_eval_led_off(LED1);
}
timingdelaylocal--;
} else {
timingdelaylocal = 1000U;
}
}
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
#ifdef __FIRMWARE_VERSION_DEFINE
uint32_t fw_ver = 0;
#endif /* __FIRMWARE_VERSION_DEFINE */
/* configure systick */
systick_config();
eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
/* initilize the LEDs, USART and key */
gd_eval_led_init(LED1);
gd_eval_com_init(EVAL_COM0);
gd_eval_key_init(KEY_TAMPER_WAKEUP, KEY_MODE_GPIO);
#ifdef __FIRMWARE_VERSION_DEFINE
fw_ver = gd32vw55x_firmware_version_get();
printf("\r\n= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =\r\n\n");
printf("\r\n=== Welcome to use the LC-GD32VW553-HMQ6 development board ====\r\n\n");
printf("\r\n======================= www.lckfb.com =========================\r\n\n");
printf("\r\n======================= wiki.lckfb.com ========================\r\n\n");
printf("\r\n= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =\r\n");
/* print firmware version */
printf("\r\nGD32VW55X series firmware version: V%d.%d.%d", (uint8_t)(fw_ver >> 24), (uint8_t)(fw_ver >> 16), (uint8_t)(fw_ver >> 8));
#endif /* __FIRMWARE_VERSION_DEFINE */
/* print out the clock frequency of system, AHB, APB1 and APB2 */
printf("\r\nCK_SYS is %d\r\n", rcu_clock_freq_get(CK_SYS));
printf("\r\nCK_AHB is %d\r\n", rcu_clock_freq_get(CK_AHB));
printf("\r\nCK_APB1 is %d\r\n", rcu_clock_freq_get(CK_APB1));
printf("\r\nCK_APB2 is %d\r\n", rcu_clock_freq_get(CK_APB2));
float t = 0;
LCD_Init(); //LCD初始化
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
delay_1ms(1000);
LCD_Fill(0,0,LCD_W,LCD_H,RED);
delay_1ms(1000);
LCD_Fill(0,0,LCD_W,LCD_H,GREEN);
delay_1ms(1000);
LCD_Fill(0,0,LCD_W,LCD_H,BLUE);
delay_1ms(1000);
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
delay_1ms(1000);
while(1)
{
LCD_ShowChinese(40,0,(const char *)"中景园电子",RED,WHITE,32,0);
LCD_ShowString(10,33,"LCD_W:",RED,WHITE,32,0);
LCD_ShowIntNum(106,33,LCD_W,3,RED,WHITE,32);
LCD_ShowString(10,66,"LCD_H:",RED,WHITE,32,0);
LCD_ShowIntNum(106,66,LCD_H,3,RED,WHITE,32);
LCD_ShowFloatNum1(10,99,t,4,RED,WHITE,32);
t+=0.11;
LCD_ShowPicture(160,95,40,40,gImage_1);
delay_1ms(100);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
然后编译,调试烧录。
上电效果:
【代码下载】
- 跳转到
下载中心
去下载模块移植代码:【点击跳转🚀】